日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BTree C 语言实例

發布時間:2025/4/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BTree C 语言实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

該代碼摘自《算法精解:C語言描述》,一共5個文件;

list.h

?

/***************************************************************************** * * * -------------------------------- list.h -------------------------------- * * * *****************************************************************************/#ifndef LIST_H #define LIST_H#include <stdlib.h>/***************************************************************************** * * * Define a structure for linked list elements. * * * *****************************************************************************/typedef struct ListElmt_ {void *data; struct ListElmt_ *next;} ListElmt;/***************************************************************************** * * * Define a structure for linked lists. * * * *****************************************************************************/typedef struct List_ {int size;int (*match)(const void *key1, const void *key2); void (*destroy)(void *data);ListElmt *head; ListElmt *tail;} List;/***************************************************************************** * * * --------------------------- Public Interface --------------------------- * * * *****************************************************************************/void list_init(List *list, void (*destroy)(void *data));void list_destroy(List *list);int list_ins_next(List *list, ListElmt *element, const void *data);int list_rem_next(List *list, ListElmt *element, void **data);#define list_size(list) ((list)->size)#define list_head(list) ((list)->head)#define list_tail(list) ((list)->tail)#define list_is_head(list, element) ((element) == (list)->head ? 1 : 0)#define list_is_tail(element) ((element)->next == NULL ? 1 : 0)#define list_data(element) ((element)->data)#define list_next(element) ((element)->next)#endif


traverse.h

?

?

/***************************************************************************** * * * ------------------------------ traverse.h ------------------------------ * * * *****************************************************************************/#ifndef TRAVERSE_H #define TRAVERSE_H#include "bitree.h" #include "list.h"/***************************************************************************** * * * --------------------------- Public Interface --------------------------- * * * *****************************************************************************/int preorder(const BiTreeNode *node, List *list);int inorder(const BiTreeNode *node, List *list);int postorder(const BiTreeNode *node, List *list);#endif


bitree.h

?

?

/***************************************************************************** * * * ------------------------------- bitree.h ------------------------------- * * * *****************************************************************************/#ifndef BITREE_H #define BITREE_H#include <stdlib.h>/***************************************************************************** * * * Define a structure for binary tree nodes. * * * *****************************************************************************/typedef struct BiTreeNode_ {void *data; struct BiTreeNode_ *left; struct BiTreeNode_ *right;} BiTreeNode;/***************************************************************************** * * * Define a structure for binary trees. * * * *****************************************************************************/typedef struct BiTree_ {int size;int (*compare)(const void *key1, const void *key2); void (*destroy)(void *data);BiTreeNode *root;} BiTree;/***************************************************************************** * * * --------------------------- Public Interface --------------------------- * * * *****************************************************************************/void bitree_init(BiTree *tree, void (*destroy)(void *data));void bitree_destroy(BiTree *tree);int bitree_ins_left(BiTree *tree, BiTreeNode *node, const void *data);int bitree_ins_right(BiTree *tree, BiTreeNode *node, const void *data);void bitree_rem_left(BiTree *tree, BiTreeNode *node);void bitree_rem_right(BiTree *tree, BiTreeNode *node);int bitree_merge(BiTree *merge, BiTree *left, BiTree *right, const void *data);#define bitree_size(tree) ((tree)->size)#define bitree_root(tree) ((tree)->root)#define bitree_is_eob(node) ((node) == NULL)#define bitree_is_leaf(node) ((node)->left == NULL && (node)->right == NULL)#define bitree_data(node) ((node)->data)#define bitree_left(node) ((node)->left)#define bitree_right(node) ((node)->right)#endif

?

?

bitree.c

/***************************************************************************** * * * ------------------------------- bitree.c ------------------------------- * * * *****************************************************************************/#include <stdlib.h> #include <string.h>#include "bitree.h"/***************************************************************************** * * * ------------------------------ bitree_init ----------------------------- * * * *****************************************************************************/void bitree_init(BiTree *tree, void (*destroy)(void *data)) {/***************************************************************************** * * * Initialize the binary tree. * * * *****************************************************************************/tree->size = 0; tree->destroy = destroy; tree->root = NULL;return;}/***************************************************************************** * * * ---------------------------- bitree_destroy ---------------------------- * * * *****************************************************************************/void bitree_destroy(BiTree *tree) {/***************************************************************************** * * * Remove all the nodes from the tree. * * * *****************************************************************************/bitree_rem_left(tree, NULL);/***************************************************************************** * * * No operations are allowed now, but clear the structure as a precaution. * * * *****************************************************************************/memset(tree, 0, sizeof(BiTree));return;}/***************************************************************************** * * * ---------------------------- bitree_ins_left --------------------------- * * * *****************************************************************************/int bitree_ins_left(BiTree *tree, BiTreeNode *node, const void *data) {BiTreeNode *new_node,**position;/***************************************************************************** * * * Determine where to insert the node. * * * *****************************************************************************/if (node == NULL) {/*************************************************************************** ** Allow insertion at the root only in an empty tree. ** ***************************************************************************/if (bitree_size(tree) > 0)return -1;position = &tree->root;}else {/*************************************************************************** ** Normally allow insertion only at the end of a branch. ** ***************************************************************************/if (bitree_left(node) != NULL)return -1;position = &node->left;}/***************************************************************************** * * * Allocate storage for the node. * * * *****************************************************************************/if ((new_node = (BiTreeNode *)malloc(sizeof(BiTreeNode))) == NULL)return -1;/***************************************************************************** * * * Insert the node into the tree. * * * *****************************************************************************/new_node->data = (void *)data; new_node->left = NULL; new_node->right = NULL; *position = new_node;/***************************************************************************** * * * Adjust the size of the tree to account for the inserted node. * * * *****************************************************************************/tree->size++;return 0;}/***************************************************************************** * * * --------------------------- bitree_ins_right --------------------------- * * * *****************************************************************************/int bitree_ins_right(BiTree *tree, BiTreeNode *node, const void *data) {BiTreeNode *new_node,**position;/***************************************************************************** * * * Determine where to insert the node. * * * *****************************************************************************/if (node == NULL) {/*************************************************************************** ** Allow insertion at the root only in an empty tree. ** ***************************************************************************/if (bitree_size(tree) > 0)return -1;position = &tree->root;}else {/*************************************************************************** ** Normally allow insertion only at the end of a branch. ** ***************************************************************************/if (bitree_right(node) != NULL)return -1;position = &node->right;}/***************************************************************************** * * * Allocate storage for the node. * * * *****************************************************************************/if ((new_node = (BiTreeNode *)malloc(sizeof(BiTreeNode))) == NULL)return -1;/***************************************************************************** * * * Insert the node into the tree. * * * *****************************************************************************/new_node->data = (void *)data; new_node->left = NULL; new_node->right = NULL; *position = new_node;/***************************************************************************** * * * Adjust the size of the tree to account for the inserted node. * * * *****************************************************************************/tree->size++;return 0;}/***************************************************************************** * * * ---------------------------- bitree_rem_left --------------------------- * * * *****************************************************************************/void bitree_rem_left(BiTree *tree, BiTreeNode *node) {BiTreeNode **position;/***************************************************************************** * * * Do not allow removal from an empty tree. * * * *****************************************************************************/if (bitree_size(tree) == 0)return;/***************************************************************************** * * * Determine where to remove nodes. * * * *****************************************************************************/if (node == NULL)position = &tree->root; elseposition = &node->left;/***************************************************************************** * * * Remove the nodes. * * * *****************************************************************************/if (*position != NULL) {bitree_rem_left(tree, *position);bitree_rem_right(tree, *position);if (tree->destroy != NULL) {/************************************************************************ ** Call a user-defined function to free dynamically allocated data. ** ************************************************************************/tree->destroy((*position)->data);}free(*position);*position = NULL;/*************************************************************************** ** Adjust the size of the tree to account for the removed node. ** ***************************************************************************/tree->size--;}return;}/***************************************************************************** * * * --------------------------- bitree_rem_right --------------------------- * * * *****************************************************************************/void bitree_rem_right(BiTree *tree, BiTreeNode *node) {BiTreeNode **position;/***************************************************************************** * * * Do not allow removal from an empty tree. * * * *****************************************************************************/if (bitree_size(tree) == 0)return;/***************************************************************************** * * * Determine where to remove nodes. * * * *****************************************************************************/if (node == NULL)position = &tree->root; elseposition = &node->right;/***************************************************************************** * * * Remove the nodes. * * * *****************************************************************************/if (*position != NULL) {bitree_rem_left(tree, *position);bitree_rem_right(tree, *position);if (tree->destroy != NULL) {/************************************************************************ ** Call a user-defined function to free dynamically allocated data. ** ************************************************************************/tree->destroy((*position)->data);}free(*position);*position = NULL;/*************************************************************************** ** Adjust the size of the tree to account for the removed node. ** ***************************************************************************/tree->size--;}return;}/***************************************************************************** * * * ----------------------------- bitree_merge ----------------------------- * * * *****************************************************************************/int bitree_merge(BiTree *merge, BiTree *left, BiTree *right, const void*data) {/***************************************************************************** * * * Initialize the merged tree. * * * *****************************************************************************/bitree_init(merge, left->destroy);/***************************************************************************** * * * Insert the data for the root node of the merged tree. * * * *****************************************************************************/if (bitree_ins_left(merge, NULL, data) != 0) {bitree_destroy(merge);return -1;}/***************************************************************************** * * * Merge the two binary trees into a single binary tree. * * * *****************************************************************************/bitree_root(merge)->left = bitree_root(left); bitree_root(merge)->right = bitree_root(right);/***************************************************************************** * * * Adjust the size of the new binary tree. * * * *****************************************************************************/merge->size = merge->size + bitree_size(left) + bitree_size(right);/***************************************************************************** * * * Do not let the original trees access the merged nodes. * * * *****************************************************************************/left->root = NULL; left->size = 0; right->root = NULL; right->size = 0;return 0;}


main.c

?

/***************************************************************************** * * * ex-1.c * * ====== * * * * Description: Illustrates using a binary tree (see Chapter 9). * * * *****************************************************************************/#include <stdio.h> #include <stdlib.h>#include "bitree.h" #include "traverse.h"/***************************************************************************** * * * ---------------------------- print_preorder ---------------------------- * * * *****************************************************************************/static void print_preorder(const BiTreeNode *node) {/***************************************************************************** * * * Display the binary tree rooted at the specified node in preorder. * * * *****************************************************************************/if (!bitree_is_eob(node)) {fprintf(stdout, "Node=%03d\n", *(int *)bitree_data(node));if (!bitree_is_eob(bitree_left(node)))print_preorder(bitree_left(node));if (!bitree_is_eob(bitree_right(node)))print_preorder(bitree_right(node));}return;}/***************************************************************************** * * * ----------------------------- print_inorder ---------------------------- * * * *****************************************************************************/static void print_inorder(const BiTreeNode *node) {/***************************************************************************** * * * Display the binary tree rooted at the specified node in inorder. * * * *****************************************************************************/if (!bitree_is_eob(node)) {if (!bitree_is_eob(bitree_left(node)))print_inorder(bitree_left(node));fprintf(stdout, "Node=%03d\n", *(int *)bitree_data(node));if (!bitree_is_eob(bitree_right(node)))print_inorder(bitree_right(node));}return;}/***************************************************************************** * * * ---------------------------- print_postorder --------------------------- * * * *****************************************************************************/static void print_postorder(const BiTreeNode *node) {/***************************************************************************** * * * Display the binary tree rooted at the specified node in postorder. * * * *****************************************************************************/if (!bitree_is_eob(node)) {if (!bitree_is_eob(bitree_left(node)))print_postorder(bitree_left(node));if (!bitree_is_eob(bitree_right(node)))print_postorder(bitree_right(node));fprintf(stdout, "Node=%03d\n", *(int *)bitree_data(node));}return;}/***************************************************************************** * * * ------------------------------ insert_int ------------------------------ * * * *****************************************************************************/static int insert_int(BiTree *tree, int i) {BiTreeNode *node,*prev;int direction,*data;/***************************************************************************** * * * Insert i assuming a binary tree organized as a binary search tree. * * * *****************************************************************************/node = tree->root; direction = 0;while (!bitree_is_eob(node)) {prev = node;if (i == *(int *)bitree_data(node)) {return -1;}else if (i < *(int *)bitree_data(node)) {node = bitree_left(node);direction = 1;}else {node = bitree_right(node);direction = 2;}}if ((data = (int *)malloc(sizeof(int))) == NULL)return -1;*data = i;if (direction == 0)return bitree_ins_left(tree, NULL, data);if (direction == 1)return bitree_ins_left(tree, prev, data);if (direction == 2)return bitree_ins_right(tree, prev, data);return -1;}/***************************************************************************** * * * ------------------------------ search_int ------------------------------ * * * *****************************************************************************/static BiTreeNode *search_int(BiTree *tree, int i) {BiTreeNode *node;/***************************************************************************** * * * Look up i assuming a binary tree organized as a binary search tree. * * * *****************************************************************************/node = bitree_root(tree);while (!bitree_is_eob(node)) {if (i == *(int *)bitree_data(node)) {return node;}else if (i < *(int *)bitree_data(node)) {node = bitree_left(node);}else {node = bitree_right(node);}}return NULL;}/***************************************************************************** * * * --------------------------------- main --------------------------------- * * * *****************************************************************************/int main(int argc, char **argv) {BiTree tree; BiTreeNode *node;int i;/***************************************************************************** * * * Initialize the binary tree. * * * *****************************************************************************/bitree_init(&tree, free);/***************************************************************************** * * * Perform some binary tree operations. * * * *****************************************************************************/fprintf(stdout, "Inserting some nodes\n");if (insert_int(&tree, 20) != 0)return 1;if (insert_int(&tree, 10) != 0)return 1;if (insert_int(&tree, 30) != 0)return 1;if (insert_int(&tree, 15) != 0)return 1;if (insert_int(&tree, 25) != 0)return 1;if (insert_int(&tree, 70) != 0)return 1;if (insert_int(&tree, 80) != 0)return 1;if (insert_int(&tree, 23) != 0)return 1;if (insert_int(&tree, 26) != 0)return 1;if (insert_int(&tree, 5) != 0)return 1;fprintf(stdout, "Tree size is %d\n", bitree_size(&tree)); fprintf(stdout, "(Preorder traversal)\n"); print_preorder(bitree_root(&tree));i = 30;if ((node = search_int(&tree, i)) == NULL) {fprintf(stdout, "Could not find %03d\n", i);}else {fprintf(stdout, "Found %03d...Removing the left tree below it\n", i);bitree_rem_left(&tree, node);fprintf(stdout, "Tree size is %d\n", bitree_size(&tree));fprintf(stdout, "(Preorder traversal)\n");print_preorder(bitree_root(&tree));}i = 99;if ((node = search_int(&tree, i)) == NULL) {fprintf(stdout, "Could not find %03d\n", i);}else {fprintf(stdout, "Found %03d...Removing the right tree below it\n", i);bitree_rem_right(&tree, node);fprintf(stdout, "Tree size is %d\n", bitree_size(&tree));fprintf(stdout, "(Preorder traversal)\n");print_preorder(bitree_root(&tree));}i = 20;if ((node = search_int(&tree, i)) == NULL) {fprintf(stdout, "Could not find %03d\n", i);}else {fprintf(stdout, "Found %03d...Removing the right tree below it\n", i);bitree_rem_right(&tree, node);fprintf(stdout, "Tree size is %d\n", bitree_size(&tree));fprintf(stdout, "(Preorder traversal)\n");print_preorder(bitree_root(&tree));}i = bitree_is_leaf(bitree_root(&tree)); fprintf(stdout, "Testing bitree_is_leaf...Value=%d (0=OK)\n", i); i = bitree_is_leaf(bitree_left((bitree_root(&tree)))); fprintf(stdout, "Testing bitree_is_leaf...Value=%d (0=OK)\n", i); i = bitree_is_leaf(bitree_left(bitree_left((bitree_root(&tree))))); fprintf(stdout, "Testing bitree_is_leaf...Value=%d (1=OK)\n", i); i = bitree_is_leaf(bitree_right(bitree_left((bitree_root(&tree))))); fprintf(stdout, "Testing bitree_is_leaf...Value=%d (1=OK)\n", i);fprintf(stdout, "Inserting some nodes\n");if (insert_int(&tree, 55) != 0)return 1;if (insert_int(&tree, 44) != 0)return 1;if (insert_int(&tree, 77) != 0)return 1;if (insert_int(&tree, 11) != 0)return 1;fprintf(stdout, "Tree size is %d\n", bitree_size(&tree)); fprintf(stdout, "(Preorder traversal)\n"); print_preorder(bitree_root(&tree)); fprintf(stdout, "(Inorder traversal)\n"); print_inorder(bitree_root(&tree)); fprintf(stdout, "(Postorder traversal)\n"); print_postorder(bitree_root(&tree));/***************************************************************************** * * * Destroy the binary tree. * * * *****************************************************************************/fprintf(stdout, "Destroying the tree\n"); bitree_destroy(&tree);return 0;}


運行效果;

?

總結

以上是生活随笔為你收集整理的BTree C 语言实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产成人毛片 | 熟女少妇在线视频播放 | 天天想你免费观看完整版高清电影 | 亚洲欧洲精品一区二区三区 | 国产主播中文字幕 | 日本亚洲最大的色成网站www | 国产一区二区免费 | 中文字幕在线导航 | 国产三级在线播放 | 色偷偷人人澡人人爽人人模 | 亚洲精品欧美精品 | 黑料视频在线 | 久久婷婷五月国产色综合激情 | 日本少妇毛茸茸高潮 | 台湾佬成人中文网222vvv | 中文字幕久久熟女蜜桃 | 欧美精品一级在线观看 | 久久五十路 | 中文字幕不卡视频 | 成人18视频免费69 | 夜久久 | 一区二区免费在线观看视频 | 日韩一级片免费观看 | 成人入口| 131美女爱做视频 | 成人天堂噜噜噜 | 91久久久久久久久 | 三级男人添奶爽爽爽视频 | 亚洲成人不卡 | 四虎影视永久免费 | 日韩青青草 | xxx色| 人人干在线 | 神秘马戏团在线观看免费高清中文 | 99资源在线 | 亚洲影视在线观看 | 青青国产 | 亚洲在线观看免费视频 | 色图插插插| 91在线精品秘密一区二区 | 一区二区三区美女 | 欧美s码亚洲码精品m码 | 亚洲一区二区三区观看 | 亚洲福利二区 | 视频区图片区小说区 | 无码精品黑人一区二区三区 | 亚洲少妇第一页 | 制服丝袜国产在线 | 91成人免费版 | 亚洲av无码久久精品狠狠爱浪潮 | 五月婷婷狠狠干 | 日本大胆人体视频 | 成人免费网站在线 | 深爱五月激情五月 | www.激情五月 | 国产性爱精品视频 | 99热精品在线观看 | 国产精品v亚洲精品v日韩精品 | 俄罗斯精品一区二区三区 | jizz日韩 | 51 吃瓜网 | 涩涩综合 | 极品一区 | 国产视频999 | 国产嫩bbwbbw高潮 | 成人h动漫精品一区二区下载 | wwwxxx色 | 69xxx免费视频 | 黑人巨大av| 后进极品美女圆润翘臀 | 在线观看黄网站 | 扒开jk护士狂揉免费 | 国产精品无码一区二区三 | 国产精品一区二区人人爽 | 免费看a视频 | 日韩无码精品一区二区 | 九九九亚洲 | 亚洲欧美日韩国产成人精品影院 | 欧美夜夜夜 | 玖玖在线播放 | 一级特毛片 | 日韩在线视 | 欧美日韩免费高清 | 欧美日本韩国一区 | 亚洲系列中文字幕 | 成人激情视频 | 99er久久| 亚洲黄色激情 | 久操视频网站 | 国产乱色精品成人免费视频 | 国产亚洲精品久久777777 | a国产在线 | 激情片 | 久久丁香网 | 免费的黄色一级片 | 污视频免费网站 | 亚洲人在线 | 欧美精品黑人猛交高潮 | a级黄色片 |