diff --git a/.vscode/settings.json b/.vscode/settings.json index 3e27229..492b582 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,6 +6,7 @@ "unicstl.h": "c", "test.h": "c", "queue.h": "c", - "stdbool.h": "c" + "stdbool.h": "c", + "stdint.h": "c" } } \ No newline at end of file diff --git a/README.md b/README.md index cf58a25..801489b 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,6 @@ | **queue** | | **队列** | queue_init | 单向链表 | | | queue2_init | 数组 | FIFO/空/满 | -| **deque** | **双端队列** | +| **deque** | |**双端队列** | | deque_init | 双向循环链表 | | diff --git a/include/tree.h b/include/tree.h index e2db10d..8ab8bcb 100644 --- a/include/tree.h +++ b/include/tree.h @@ -8,18 +8,18 @@ typedef struct _tree_node_t { - tree_data_t data; - struct _tree_node_t * left; - struct _tree_node_t * right; - struct _tree_node_t * parent; - int32_t balance; // balance of avl tree + tree_data_t data; + struct _tree_node_t * left; + struct _tree_node_t * right; + struct _tree_node_t * parent; + int32_t balance; // balance of avl tree }tree_node_t, *ptree_node_t; typedef struct _tree_t { - struct _tree_node_t * tree; - uint32_t size; + struct _tree_node_t * tree; + uint32_t size; }tree_t, *ptree_t; typedef void (*tree_data_disp_t)(tree_data_t data); @@ -28,42 +28,90 @@ typedef void (*tree_data_disp_t)(tree_data_t data); #if RAVLTREE == 1 - bool tree_init(ptree_node_t *head); - void tree_destroy(ptree_node_t *head); - bool tree_empty(ptree_node_t head); - void tree_clear(ptree_node_t head); - uint32_t tree_get_size(ptree_node_t head); + bool tree_init(ptree_node_t *head); + void tree_destroy(ptree_node_t *head); + bool tree_empty(ptree_node_t head); + void tree_clear(ptree_node_t head); + uint32_t tree_get_size(ptree_node_t head); - bool tree_insert(ptree_node_t head, tree_data_t data); - bool tree_delete(ptree_node_t head, tree_data_t data); - bool tree_get_min(ptree_node_t head, tree_data_t *data); - bool tree_get_max(ptree_node_t head, tree_data_t *data); + bool tree_insert(ptree_node_t head, tree_data_t data); + bool tree_delete(ptree_node_t head, tree_data_t data); + bool tree_get_min(ptree_node_t head, tree_data_t *data); + bool tree_get_max(ptree_node_t head, tree_data_t *data); - void tree_traversal_depth_preorder(ptree_node_t head, tree_data_disp_t tree_data_disp); - void tree_traversal_depth_inorder(ptree_node_t head, tree_data_disp_t tree_data_disp); - //void tree_traversal_depth_postorder(ptree_node_t head, tree_data_disp_t tree_data_disp); - //void tree_traversal_breadth(ptree_node_t head, tree_data_disp_t tree_data_disp); + void tree_traversal_depth_preorder(ptree_node_t head, tree_data_disp_t tree_data_disp); + void tree_traversal_depth_inorder(ptree_node_t head, tree_data_disp_t tree_data_disp); + //void tree_traversal_depth_postorder(ptree_node_t head, tree_data_disp_t tree_data_disp); + //void tree_traversal_breadth(ptree_node_t head, tree_data_disp_t tree_data_disp); #endif #if AVLTREE == 1 - bool tree_init(ptree_t *head); - void tree_destroy(ptree_t *head); - bool tree_empty(ptree_t head); - void tree_clear(ptree_t head); - uint32_t tree_get_size(ptree_t head); + bool tree_init(ptree_t *head); + void tree_destroy(ptree_t *head); + bool tree_empty(ptree_t head); + void tree_clear(ptree_t head); + uint32_t tree_get_size(ptree_t head); - bool tree_insert(ptree_t head, tree_data_t data); - bool tree_delete(ptree_t head, tree_data_t data); - bool tree_get_min(ptree_t head, tree_data_t *data); - bool tree_get_max(ptree_t head, tree_data_t *data); + bool tree_insert(ptree_t head, tree_data_t data); + bool tree_delete(ptree_t head, tree_data_t data); + bool tree_get_min(ptree_t head, tree_data_t *data); + bool tree_get_max(ptree_t head, tree_data_t *data); - void tree_traversal_depth_preorder(ptree_t head, tree_data_disp_t tree_data_disp); - void tree_traversal_depth_inorder(ptree_t head, tree_data_disp_t tree_data_disp); - void tree_traversal_depth_postorder(ptree_t head, tree_data_disp_t tree_data_disp); - void tree_traversal_breadth(ptree_t head, tree_data_disp_t tree_data_disp); + void tree_traversal_depth_preorder(ptree_t head, tree_data_disp_t tree_data_disp); + void tree_traversal_depth_inorder(ptree_t head, tree_data_disp_t tree_data_disp); + void tree_traversal_depth_postorder(ptree_t head, tree_data_disp_t tree_data_disp); + void tree_traversal_breadth(ptree_t head, tree_data_disp_t tree_data_disp); #endif +struct _tree_node +{ + void *obj; + struct _tree_node * left; + struct _tree_node * right; + struct _tree_node * parent; + + union + { + uint32_t balance; + uint32_t color; + }; +}; +typedef struct _tree_node * tree_node_t; + +struct _tree +{ + struct _tree_node * _head; + + uint32_t _size; // 栈大小 + uint32_t _obj_size; // 元素大小 + uint32_t _capacity; // 总容量 + uint32_t _ratio; // 扩展比率 + + // kernel + bool (*insert)(struct _tree* self, void* obj); + bool (*delete)(struct _tree* self, void* obj); + bool (*peek)(struct _tree* self, void** obj); + + bool (*clear)(struct _tree* self); + bool (*empty)(struct _tree* self); + uint32_t (*size)(struct _tree* self); + + // compare + int (*compare)(void* obj1, void* obj2); + + // free + void (*destory)(struct _tree* self); + + // print + void (*print)(struct _tree* self); + void (*print_obj)(void* obj); +}; + +// bst_tree +bool tree_avl_init(struct _tree *self, uint32_t obj_size); +bool tree_rb_init(struct _tree *self, uint32_t obj_size); + #endif // _TREE_H_ diff --git a/src/tree.c b/src/tree.c index 8793f45..3b4882c 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1392,3 +1392,128 @@ static bool tree_rebalance(ptree_t head, ptree_node_t tree) #endif + +static tree_node_t * tree_node_new(struct _tree* self, void* obj) +{ + void * obj_new = malloc(self->_obj_size); + if (obj_new == NULL) + { + goto done; + } + memmove(obj_new, obj, self->_obj_size); + + struct _tree_node* node_new = (struct _queue_node*)malloc(sizeof(struct _tree_node)); + if(node_new == NULL) + { + goto done; + } + node_new->obj = obj_new; + node_new->parent = NULL; + node_new->left = NULL; + node_new->right = NULL; + node_new->balance = 0; + + return node_new; +done: + if(obj_new != NULL) + { + free(obj_new); + } + if(node_new != NULL) + { + free(node_new); + } + return NULL; +} + +static bool tree_node_free(struct _tree_node* node) +{ + assert(node != NULL); + if(node->obj != NULL) + { + free(node->obj); + } + free(node); + return true; +} + +bool tree_avl_insert(struct _tree* self, void* obj) +{ + +} + +bool tree_avl_delete(struct _tree* self, void* obj) +{ + +} + +bool tree_clear(struct _tree* self) +{ + assert(self != NULL); + return true; +} + +bool tree_empty(struct _tree* self) +{ + assert(self != NULL); + return !self->size(self); +} + +uint32_t tree_size(struct _tree* self) +{ + assert(self != NULL); + return self->size(self); +} + +// free +void tree_destory(struct _tree* self) +{ + assert(self != NULL); + self->clear(self); +} + +// print +void tree_print(struct _tree* self) +{ + +} + +void tree_print_obj(void* obj) +{ + +} + +bool tree_avl_init(struct _tree *self, uint32_t obj_size) +{ + assert(self != NULL); + + self->_obj_size = obj_size; + self->_size = 0; + // self->_capacity = 64; + // self->_ratio = 2; + + self->insert = tree_avl_insert; + self->delete = tree_avl_delete; + self->clear = tree_clear; + self->empty = tree_empty; + self->size = tree_size; + self->destory = tree_destory; + self->print = tree_print; + + self->_head = (struct _tree_node *)malloc(sizeof(struct _tree_node)); + if(self->_head == NULL) + { + return false; + } + self->_head->parent = NULL; + self->_head->left = NULL; + self->_head->right = NULL; + self->_head->balance = 0; + + return true; +} + +bool tree_rb_init(struct _tree *self, uint32_t obj_size) +{ + +}