mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-17 19:41:36 +08:00
添加tree
This commit is contained in:
parent
8f11e431b5
commit
88e2ac7136
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -6,6 +6,7 @@
|
||||
"unicstl.h": "c",
|
||||
"test.h": "c",
|
||||
"queue.h": "c",
|
||||
"stdbool.h": "c"
|
||||
"stdbool.h": "c",
|
||||
"stdint.h": "c"
|
||||
}
|
||||
}
|
@ -16,6 +16,6 @@
|
||||
| **queue** | | **队列**
|
||||
| queue_init | 单向链表 | |
|
||||
| queue2_init | 数组 | FIFO/空/满 |
|
||||
| **deque** | **Ë«¶Ë¶ÓÁÐ** |
|
||||
| **deque** | |**Ë«¶Ë¶ÓÁÐ** |
|
||||
| deque_init | 双向循环链表 | |
|
||||
|
||||
|
114
include/tree.h
114
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_
|
||||
|
||||
|
125
src/tree.c
125
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)
|
||||
{
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user