From 2f3f1bdf377b11aebb8deb580e7ec52a739727d6 Mon Sep 17 00:00:00 2001 From: jf-home Date: Sun, 23 Jun 2024 16:03:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BA=E4=BB=80=E4=B9=88=E4=BC=9A=E6=AD=BB?= =?UTF-8?q?=E5=9C=A8=E8=BF=99=E9=87=8C=E5=87=BD=E6=95=B0=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 4 +-- include/tree.h | 3 +- src/tree.c | 73 +++++++++++++++++++++++++++++++++++++++++++-- test/tree_test.c | 2 +- 4 files changed, 76 insertions(+), 6 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 2f2f679..ba73187 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,7 +10,7 @@ "request": "launch", "program": "${workspaceFolder}/build/release/bin/test.exe", "args": [], - "stopAtEntry": false, + "stopAtEntry": true, "cwd": "${fileDirname}", "environment": [], "externalConsole": false, @@ -28,7 +28,7 @@ } ], "preLaunchTask": "build", - "miDebuggerPath": "D:/Qt/Tools/mingw1120_64/bin/gdb.exe" + "miDebuggerPath": "D:/Lang/mingw64/bin/gdb.exe" } ] } \ No newline at end of file diff --git a/include/tree.h b/include/tree.h index 8c70ce6..92cd635 100644 --- a/include/tree.h +++ b/include/tree.h @@ -87,7 +87,6 @@ struct _tree_node uint32_t color; }; }; -typedef struct _tree_node* tree_node_t; struct _tree { @@ -103,6 +102,8 @@ struct _tree bool (*delete)(struct _tree* self, void* obj); bool (*peek)(struct _tree* self, void** obj); + struct _tree_node* (*find)(struct _tree* self, void* obj); + bool (*clear)(struct _tree* self); bool (*empty)(struct _tree* self); uint32_t (*size)(struct _tree* self); diff --git a/src/tree.c b/src/tree.c index e7045db..a8015d3 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1402,7 +1402,7 @@ static bool tree_rebalance(ptree_t head, ptree_node_t tree) #endif -static tree_node_t tree_node_new(struct _tree* self, void* obj) +static struct _tree_node * tree_node_new(struct _tree* self, void* obj) { assert(self != NULL); @@ -1450,6 +1450,47 @@ static bool tree_node_free(struct _tree_node* node) return true; } +/** + * @brief 在树中查找插入位置 + * + * @param self 树的指针 + * @param obj 要查找或插入的对象 + */ +struct _tree_node * tree_find_pos(struct _tree* self, void* obj) +{ + printf("222\n"); + + assert(self != NULL); + assert(self->compare != NULL); + + struct _tree_node* root = self->_root; + while(root != NULL) + { + if(self->compare(obj, root->obj) == 0) + { + break; + } + else if(self->compare(obj, root->obj) < 0) + { + if(root->left == NULL) + { + break; + } + root = root->left; + } + else + { + if(root->right == NULL) + { + break; + } + root = root->right; + } + } + return root; +} + + bool tree_avl_insert(struct _tree* self, void* obj) { assert(self != NULL); @@ -1470,7 +1511,10 @@ bool tree_avl_insert(struct _tree* self, void* obj) else { // insert the node - struct _tree_node* root = self->_root; + struct _tree_node* root = NULL; + printf("111\n"); + root = tree_find_pos(self, root->obj); + printf("444\n"); if(self->compare(obj, root->obj) < 0) { root->left = node; @@ -1498,6 +1542,28 @@ bool tree_avl_delete(struct _tree* self, void* obj) } +struct _tree_node * tree_avl_find(struct _tree* self, void* obj) +{ + assert(self != NULL); + struct _tree_node* root = self->_root; + while(root != NULL) + { + if(self->compare(obj, root->obj) == 0) + { + return root; + } + else if(self->compare(obj, root->obj) < 0) + { + root = root->left; + } + else + { + root = root->right; + } + } + return NULL; +} + bool tree_clear(struct _tree* self) { assert(self != NULL); @@ -1521,6 +1587,7 @@ void tree_destory(struct _tree* self) { assert(self != NULL); self->clear(self); + self->_root = NULL; } void tree_avl_preorder(struct _tree* self, struct _tree_node* root) @@ -1573,6 +1640,8 @@ bool tree_avl_init(struct _tree *self, uint32_t obj_size) self->postorder = tree_avl_postorder; self->breadth = tree_avl_breadth; + self->_root = NULL; + return true; } diff --git a/test/tree_test.c b/test/tree_test.c index a26a440..5af5fb6 100644 --- a/test/tree_test.c +++ b/test/tree_test.c @@ -281,7 +281,7 @@ void test_tree_num(void) printf("\n\n----- test_queue_num -----\n"); - printf("----- after push-----\n"); + printf("----- insert -----\n"); for (i = 0; i < len; i++) { tree->insert(tree, &data[i]);