mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-18 03:51:35 +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",
|
"unicstl.h": "c",
|
||||||
"test.h": "c",
|
"test.h": "c",
|
||||||
"queue.h": "c",
|
"queue.h": "c",
|
||||||
"stdbool.h": "c"
|
"stdbool.h": "c",
|
||||||
|
"stdint.h": "c"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -16,6 +16,6 @@
|
|||||||
| **queue** | | **队列**
|
| **queue** | | **队列**
|
||||||
| queue_init | 单向链表 | |
|
| queue_init | 单向链表 | |
|
||||||
| queue2_init | 数组 | FIFO/空/满 |
|
| queue2_init | 数组 | FIFO/空/满 |
|
||||||
| **deque** | **Ë«¶Ë¶ÓÁÐ** |
|
| **deque** | |**Ë«¶Ë¶ÓÁÐ** |
|
||||||
| deque_init | 双向循环链表 | |
|
| deque_init | 双向循环链表 | |
|
||||||
|
|
||||||
|
@ -64,6 +64,54 @@ typedef void (*tree_data_disp_t)(tree_data_t data);
|
|||||||
void tree_traversal_breadth(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
|
#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_
|
#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
|
#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