Compare commits

..

18 Commits

Author SHA1 Message Date
08ba5296be 暂时用不到的函数就先屏蔽了 2025-04-25 01:30:37 +08:00
ecc568bb90 将对外用不到的接口放在tree.c作为局部函数调用 2025-04-25 01:09:37 +08:00
3ed9fb8437 去掉tree的cur_node,和迭代器相关的都共用迭代器的_cur_node节点指针了 2025-04-25 00:56:25 +08:00
768c6586d3 删除4种遍历函数 2025-04-25 00:34:39 +08:00
d682bed186 tree的init函数调整 2025-04-25 00:28:14 +08:00
0a291edb3d 在示例中去掉原遍历接口 2025-04-25 00:21:43 +08:00
192f1962e6 删除非必要代码 2025-04-24 23:39:37 +08:00
461e32b430 tree删除旧版迭代器接口 2025-04-24 23:35:31 +08:00
5302206376 最初的测试版,tree都保留正常的遍历接口。后续更新后就只保留迭代器了 2025-04-24 20:55:00 +08:00
f9486bae40 tree迭代器单元测试通过 2025-04-24 19:12:16 +08:00
34875ce3fa 太棒了!tree的新版迭代器调试通过了。后续可以删除那么多没用的成员函数了 2025-04-24 18:57:57 +08:00
5ab918b067 tree深度优先遍历的迭代器都调试通过了 2025-04-24 18:49:00 +08:00
8ffde2b608 tree的新迭代器已经实现,但是卡死。 2025-04-24 18:40:22 +08:00
bb8e01fe7c tree先添加了新的迭代器接口,但是还未实现。 2025-04-24 18:22:56 +08:00
88580acb1e heap的迭代器实现 2025-04-24 18:08:16 +08:00
d672db224c 添加了一下版本号 2025-04-24 17:50:05 +08:00
7ba4561a5e heap添加最大堆的单元测试 2025-04-24 17:34:21 +08:00
29db0dae43 暂不是用函数注册的方式,毕竟增加了额外内存成本 2025-04-24 17:26:10 +08:00
14 changed files with 867 additions and 1495 deletions

View File

@ -3,7 +3,7 @@
cmake_minimum_required(VERSION 3.29) cmake_minimum_required(VERSION 3.29)
# 0. 项目信息 # 0. 项目信息
project(demo VERSION 0.0.01) project(demo VERSION 0.0.02)
# 2. 支持GDB # 2. 支持GDB
set(CMAKE_BUILD_TYPE "Debug") set(CMAKE_BUILD_TYPE "Debug")

View File

@ -48,18 +48,19 @@
## 规范 ## 规范
### 版本说明 ### 版本说明
| 版本 | 范围 | 更新说明 | | 命名 |版本说明 | 范围 | 更新说明 |
|:----:|:----:|:----:| |:----: |:----:|:----:|:----:|
| 主版本号 | 0 ~ 99 | 代码框架大改,完全不兼容旧版 | | `VERSION_MAJOR` | 主版本号 | 0 ~ 99 | 代码框架大改,完全不兼容旧版 |
| 次版本号 | 0 ~ 99 | 代码框架尽量兼容旧版增信大功能、修复重大bug等 | | `VERSION_MINOR` | 次版本号 | 0 ~ 99 | 代码框架尽量兼容旧版增信大功能、修复重大bug等 |
| 小版本号 | 0 ~ 99 | 代码框架兼容旧版新增小功能、修复bug等 | | `VERSION_MICRO` | 小版本号 | 0 ~ 99 | 代码框架兼容旧版新增小功能、修复bug等 |
举例说明: 举例说明:
```c ```c
// 若 major > 0 ,则代表正式发布版本 // 若 major > 0 ,则代表正式发布版本
#define VER_MAJOR 1 #define UNICSTL_VERSION_MAJOR 1
#define VER_MINOR 2 #define UNICSTL_VERSION_MINOR 2
#define VER_MICRO 5 #define UNICSTL_VERSION_MICRO 5
#define UNICSTL_VERSION ((UNICSTL_VERSION_MAJOR << 16) | (UNICSTL_VERSION_MINOR << 8) | UNICSTL_VERSION_MICRO)
``` ```
### 工程命名 ### 工程命名
@ -82,7 +83,7 @@ unicstl_stack_v1.2.5_20240717-a0.zip
## 修改日志 ## 修改日志
### Unicstl 0.0.01 (2025-04-24) ### Unicstl 0.0.01 (2025-04-24)
new features: - new features
- add stack - add stack
- add queue - add queue
- add deque - add deque
@ -90,7 +91,8 @@ new features:
- add heap - add heap
- add tree - add tree
- add graph - add graph
bugfixed: - add iterator
- bugfixed:
- none - none
others: - others:
- none - none

View File

@ -35,8 +35,9 @@ void demo_avltree_num(void)
// int data[] = { 1,2,3,4,5,6}; // int data[] = { 1,2,3,4,5,6};
// int data[] = { 5,2,3,1,7,8,6 }; // int data[] = { 5,2,3,1,7,8,6 };
int data[] = { 5,2,3,1,7,8,6,4,9,10,12,11,15,14,13 }; int data[] = { 5,2,3,1,7,8,6,4,9,10,12,11,15,14,13 };
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]); uint32_t len = sizeof(data) / sizeof(data[0]);
int temp = 0;
iterator_t iter = NULL;
tree_t tree = tree_avl_new(sizeof(int)); tree_t tree = tree_avl_new(sizeof(int));
tree->print_obj = print_num; tree->print_obj = print_num;
@ -53,7 +54,13 @@ void demo_avltree_num(void)
printf("insert = "); printf("insert = ");
tree->print_obj(&temp); tree->print_obj(&temp);
printf("size = %2d : ", tree->size(tree)); printf("size = %2d : ", tree->size(tree));
tree->preorder(tree, tree->_root);
iter = tree->iter(tree, ORDER_LEFT_PRE);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
} }
@ -81,45 +88,85 @@ void demo_avltree_num(void)
} }
printf("----- preorder -----\n"); printf("----- preorder -----\n");
tree->preorder(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_PRE);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- inorder -----\n"); printf("----- inorder -----\n");
tree->inorder(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_IN);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- postorder -----\n"); printf("----- postorder -----\n");
tree->postorder(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_POST);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- breadth -----\n"); printf("----- breadth -----\n");
tree->breadth(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_BREADTH);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- right priority -----\n");
tree->order(tree, true);
printf("----- preorder(right) -----\n"); printf("----- preorder(right) -----\n");
tree->preorder(tree, tree->_root); iter = tree->iter(tree, ORDER_RIGHT_PRE);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- inorder(right) -----\n"); printf("----- inorder(right) -----\n");
tree->inorder(tree, tree->_root); iter = tree->iter(tree, ORDER_RIGHT_IN);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- postorder(right) -----\n"); printf("----- postorder(right) -----\n");
tree->postorder(tree, tree->_root); iter = tree->iter(tree, ORDER_RIGHT_POST);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- breadth(right) -----\n"); printf("----- breadth(right) -----\n");
tree->breadth(tree, tree->_root); iter = tree->iter(tree, ORDER_RIGHT_BREADTH);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- left priority -----\n"); printf("----- preorder(left) -----\n");
tree->order(tree, false); iter = tree->iter(tree, ORDER_LEFT_PRE);
printf("----- preorder -----\n"); while(iter->hasnext(iter))
tree->preorder(tree, tree->_root); {
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
@ -131,7 +178,13 @@ void demo_avltree_num(void)
printf("delete = "); printf("delete = ");
tree->print_obj(&temp); tree->print_obj(&temp);
printf("size = %2d : ", tree->size(tree)); printf("size = %2d : ", tree->size(tree));
tree->preorder(tree, tree->_root);
iter = tree->iter(tree, ORDER_LEFT_PRE);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
} }
@ -206,8 +259,9 @@ void demo_rbtree_num(void)
// int data[] = { 1,2,3,4,5,6}; // int data[] = { 1,2,3,4,5,6};
// int data[] = { 5,2,3,1,7,8,6 }; // int data[] = { 5,2,3,1,7,8,6 };
int data[] = { 5,2,3,1,7,8,6,4,9,10,12,11,15,14,13 }; int data[] = { 5,2,3,1,7,8,6,4,9,10,12,11,15,14,13 };
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]); uint32_t len = sizeof(data) / sizeof(data[0]);
int temp = 0;
iterator_t iter = NULL;
tree_t tree = tree_rb_new(sizeof(int)); tree_t tree = tree_rb_new(sizeof(int));
tree->print_obj = print_num; tree->print_obj = print_num;
@ -224,7 +278,13 @@ void demo_rbtree_num(void)
printf("insert = "); printf("insert = ");
tree->print_obj(&temp); tree->print_obj(&temp);
printf("size = %2d : ", tree->size(tree)); printf("size = %2d : ", tree->size(tree));
tree->preorder(tree, tree->_root);
iter = tree->iter(tree, ORDER_LEFT_PRE);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
if(true != tree_rb_check(tree)) if(true != tree_rb_check(tree))
@ -258,45 +318,84 @@ void demo_rbtree_num(void)
} }
printf("----- preorder -----\n"); printf("----- preorder -----\n");
tree->preorder(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_PRE);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- inorder -----\n"); printf("----- inorder -----\n");
tree->inorder(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_IN);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- postorder -----\n"); printf("----- postorder -----\n");
tree->postorder(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_POST);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- breadth -----\n"); printf("----- breadth -----\n");
tree->breadth(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_BREADTH);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- right priority -----\n");
tree->order(tree, true);
printf("----- preorder(right) -----\n"); printf("----- preorder(right) -----\n");
tree->preorder(tree, tree->_root); iter = tree->iter(tree, ORDER_RIGHT_PRE);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- inorder(right) -----\n"); printf("----- inorder(right) -----\n");
tree->inorder(tree, tree->_root); iter = tree->iter(tree, ORDER_RIGHT_IN);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- postorder(right) -----\n"); printf("----- postorder(right) -----\n");
tree->postorder(tree, tree->_root); iter = tree->iter(tree, ORDER_RIGHT_POST);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- breadth(right) -----\n"); printf("----- breadth(right) -----\n");
tree->breadth(tree, tree->_root); iter = tree->iter(tree, ORDER_RIGHT_BREADTH);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
#if 1
printf("----- left priority -----\n");
tree->order(tree, false);
printf("----- preorder -----\n"); printf("----- preorder -----\n");
tree->preorder(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_PRE);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
@ -309,7 +408,13 @@ void demo_rbtree_num(void)
tree->delete(tree, &temp); tree->delete(tree, &temp);
printf("size = %2d : ", tree->size(tree)); printf("size = %2d : ", tree->size(tree));
tree->preorder(tree, tree->_root);
iter = tree->iter(tree, ORDER_LEFT_PRE);
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
if(true != tree_rb_check(tree)) if(true != tree_rb_check(tree))
@ -323,7 +428,6 @@ void demo_rbtree_num(void)
{ {
printf("----- empty -----\n"); printf("----- empty -----\n");
} }
#endif
tree_free(&tree); tree_free(&tree);
} }
@ -339,6 +443,7 @@ void demo_rbtree_struct(void)
}; };
struct _student temp = {0}; struct _student temp = {0};
uint32_t len = sizeof(data) / sizeof(data[0]); uint32_t len = sizeof(data) / sizeof(data[0]);
iterator_t iter = NULL;
tree_t tree = tree_rb_new(sizeof(struct _student)); tree_t tree = tree_rb_new(sizeof(struct _student));
tree->print_obj = print_struct; tree->print_obj = print_struct;
@ -355,7 +460,13 @@ void demo_rbtree_struct(void)
printf("insert = "); printf("insert = ");
tree->print_obj(&temp); tree->print_obj(&temp);
printf("size = %2d : ", tree->size(tree)); printf("size = %2d : ", tree->size(tree));
tree->preorder(tree, tree->_root);
iter = tree->iter(tree, ORDER_LEFT_PRE);
while(iter->hasnext(iter))
{
temp = *(struct _student *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
if(true != tree_rb_check(tree)) if(true != tree_rb_check(tree))
@ -389,45 +500,84 @@ void demo_rbtree_struct(void)
} }
printf("----- preorder -----\n"); printf("----- preorder -----\n");
tree->preorder(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_PRE);
while(iter->hasnext(iter))
{
temp = *(struct _student *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- inorder -----\n"); printf("----- inorder -----\n");
tree->inorder(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_IN);
while(iter->hasnext(iter))
{
temp = *(struct _student *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- postorder -----\n"); printf("----- postorder -----\n");
tree->postorder(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_POST);
while(iter->hasnext(iter))
{
temp = *(struct _student *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- breadth -----\n"); printf("----- breadth -----\n");
tree->breadth(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_BREADTH);
while(iter->hasnext(iter))
{
temp = *(struct _student *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- right priority -----\n");
tree->order(tree, true);
printf("----- preorder(right) -----\n"); printf("----- preorder(right) -----\n");
tree->preorder(tree, tree->_root); iter = tree->iter(tree, ORDER_RIGHT_PRE);
while(iter->hasnext(iter))
{
temp = *(struct _student *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- inorder(right) -----\n"); printf("----- inorder(right) -----\n");
tree->inorder(tree, tree->_root); iter = tree->iter(tree, ORDER_RIGHT_IN);
while(iter->hasnext(iter))
{
temp = *(struct _student *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- postorder(right) -----\n"); printf("----- postorder(right) -----\n");
tree->postorder(tree, tree->_root); iter = tree->iter(tree, ORDER_RIGHT_POST);
while(iter->hasnext(iter))
{
temp = *(struct _student *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
printf("----- breadth(right) -----\n"); printf("----- breadth(right) -----\n");
tree->breadth(tree, tree->_root); iter = tree->iter(tree, ORDER_RIGHT_BREADTH);
while(iter->hasnext(iter))
{
temp = *(struct _student *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
#if 1
printf("----- left priority -----\n");
tree->order(tree, false);
printf("----- preorder -----\n"); printf("----- preorder -----\n");
tree->preorder(tree, tree->_root); iter = tree->iter(tree, ORDER_LEFT_PRE);
while(iter->hasnext(iter))
{
temp = *(struct _student *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
@ -440,7 +590,13 @@ void demo_rbtree_struct(void)
tree->delete(tree, &temp); tree->delete(tree, &temp);
printf("size = %2d : ", tree->size(tree)); printf("size = %2d : ", tree->size(tree));
tree->preorder(tree, tree->_root);
iter = tree->iter(tree, ORDER_LEFT_PRE);
while(iter->hasnext(iter))
{
temp = *(struct _student *)iter->next(iter);
tree->print_obj(&temp);
}
printf("\n"); printf("\n");
if(true != tree_rb_check(tree)) if(true != tree_rb_check(tree))
@ -454,7 +610,6 @@ void demo_rbtree_struct(void)
{ {
printf("----- empty -----\n"); printf("----- empty -----\n");
} }
#endif
tree_free(&tree); tree_free(&tree);
} }

View File

@ -37,6 +37,6 @@
* obj == obj2 return 0 * obj == obj2 return 0
* obj > obj2 return 1 * obj > obj2 return 1
*/ */
typedef int (*cmp_fun_t)(void* obj, void* obj2); typedef int (*compare_fun_t)(void* obj, void* obj2);
#endif // _COMMON_H_ #endif // _COMMON_H_

View File

@ -63,8 +63,8 @@ struct _deque
bool (*set)(struct _deque* self, int index, void* obj); bool (*set)(struct _deque* self, int index, void* obj);
// compare // compare
int (*cmp)(void* obj, void* obj2); // int (*compare)(void* obj, void* obj2);
bool (*sort)(struct _deque* self, uint8_t reserve); // bool (*sort)(struct _deque* self, uint8_t reserve);
// -------------------- debug -------------------- // -------------------- debug --------------------
void (*print)(struct _deque* self); void (*print)(struct _deque* self);

View File

@ -30,6 +30,7 @@ struct _heap
uint32_t _ratio; uint32_t _ratio;
heap_type _type; heap_type _type;
struct _iterator _iter;
void (*_destory)(struct _heap* self); void (*_destory)(struct _heap* self);
@ -43,17 +44,13 @@ struct _heap
// base // base
uint32_t(*size)(struct _heap* self); uint32_t(*size)(struct _heap* self);
bool (*clear)(struct _heap* self); bool (*clear)(struct _heap* self);
/**
* @brief obj compare with obj2
*
* @return
* obj < obj2 return -1
* obj == obj2 return 0
* obj > obj2 return 1
*/
int (*compare)(void* obj, void* obj2);
// iter
iterator_t (*iter)(struct _heap* self);
// config
compare_fun_t compare; // !!! you have to implement this function
// -------------------- debug -------------------- // -------------------- debug --------------------
void (*print)(struct _heap* self); void (*print)(struct _heap* self);
void (*print_obj)(void* obj); void (*print_obj)(void* obj);

View File

@ -16,6 +16,7 @@
struct _list struct _list
{ {
// -------------------- private --------------------
void * obj; void * obj;
uint32_t _obj_size; uint32_t _obj_size;
@ -26,6 +27,9 @@ struct _list
struct _iterator _iter; struct _iterator _iter;
void (*_destory)(struct _list* self);
// -------------------- public --------------------
// kernel // kernel
bool (*append)(struct _list* self, void* obj); // Append object to the end of the list. bool (*append)(struct _list* self, void* obj); // Append object to the end of the list.
bool (*insert)(struct _list* self, int index, void* obj); // Insert object before index. bool (*insert)(struct _list* self, int index, void* obj); // Insert object before index.
@ -37,30 +41,25 @@ struct _list
bool (*get)(struct _list* self, int index, void* obj); bool (*get)(struct _list* self, int index, void* obj);
bool (*set)(struct _list* self, int index, void* obj); bool (*set)(struct _list* self, int index, void* obj);
// iter
iterator_t (*iter)(struct _list* self);
// base // base
uint32_t(*size)(struct _list* self); uint32_t(*size)(struct _list* self);
bool (*empty)(struct _list* self); bool (*empty)(struct _list* self);
// clear and free node
bool (*clear)(struct _list* self); bool (*clear)(struct _list* self);
void (*destory)(struct _list* self);
// iter
iterator_t (*iter)(struct _list* self);
// sort // sort
bool (*reverse)(struct _list* self); // Reverse *IN PLACE*. // bool (*reverse)(struct _list* self); // Reverse *IN PLACE*.
/** /**
Sort the list in ascending order and return false. Sort the list in ascending order and return false.
The sort is in-place (i.e. the list itself is modified) and stable (i.e. the The sort is in-place (i.e. the list itself is modified) and stable (i.e. the
order of two equal elements is maintained). order of two equal elements is maintained).
The reverse flag can be set to sort in descending order. The reverse flag can be set to sort in descending order.
*/ */
bool (*sort)(struct _list* self, uint8_t reserve, int (*compare)(void* obj, void* obj2)); // bool (*sort)(struct _list* self, uint8_t reserve, int (*compare)(void* obj, void* obj2));
// print // -------------------- debug --------------------
void (*print)(struct _list* self); void (*print)(struct _list* self);
void (*print_obj)(void* obj); void (*print_obj)(void* obj);
}; };

View File

@ -55,6 +55,7 @@ struct _tree_node
struct _tree struct _tree
{ {
// -------------------- private --------------------
struct _tree_node * _root; struct _tree_node * _root;
uint32_t _size; uint32_t _size;
@ -67,60 +68,34 @@ struct _tree
stack_t stack; stack_t stack;
queue_t queue; queue_t queue;
struct _tree_node * cur_node;
struct _iterator _iter;
void (*_destory)(struct _tree* self);
// -------------------- public --------------------
// kernel // kernel
bool (*insert)(struct _tree* self, void* obj); bool (*insert)(struct _tree* self, void* obj);
bool (*delete)(struct _tree* self, void* obj); bool (*delete)(struct _tree* self, void* obj);
struct _tree_node* (*find)(struct _tree* self, void* obj);
struct _tree_node* (*find_min)(struct _tree* self, struct _tree_node* root);
struct _tree_node* (*find_max)(struct _tree* self, struct _tree_node* root);
bool (*rebalance)(struct _tree* self, struct _tree_node* root); bool (*rebalance)(struct _tree* self, struct _tree_node* root);
int32_t (*height)(struct _tree* self, struct _tree_node* root); int32_t (*height)(struct _tree* self, struct _tree_node* root);
bool (*min)(struct _tree* self, void* obj);
bool (*max)(struct _tree* self, void* obj);
// base // base
bool (*clear)(struct _tree* self); bool (*clear)(struct _tree* self);
bool (*empty)(struct _tree* self); bool (*empty)(struct _tree* self);
uint32_t (*size)(struct _tree* self); uint32_t (*size)(struct _tree* self);
// iter // iter
/** iterator_t (*iter)(struct _tree* self, enum _order);
* @brief
*
*/
void (*set_order)(struct _tree* self, enum _order order);
void* (*begin)(struct _tree* self);
void* (*next)(struct _tree* self);
void* (*end)(struct _tree* self);
/** // others
* @brief obj compare with obj2 bool (*min)(struct _tree* self, void* obj);
* bool (*max)(struct _tree* self, void* obj);
* @return
* obj < obj2 return -1
* obj == obj2 return 0
* obj > obj2 return 1
*/
int (*compare)(void* obj, void* obj2);
// free // config
void (*destory)(struct _tree* self); compare_fun_t compare; // !!! you have to implement this function
// ----- print -----
// traversal depth
void (*order)(struct _tree* self, bool right_priority);
void (*preorder)(struct _tree* self, struct _tree_node* root);
void (*inorder)(struct _tree* self, struct _tree_node* root);
void (*postorder)(struct _tree* self, struct _tree_node* root);
// traversal breadth
void (*breadth)(struct _tree* self, struct _tree_node* root);
// -------------------- debug --------------------
void (*print_obj)(void* obj); void (*print_obj)(void* obj);
}; };
typedef struct _tree* tree_t; typedef struct _tree* tree_t;
@ -132,4 +107,3 @@ tree_t tree_rb_new(uint32_t obj_size);
void tree_free(tree_t* tree); void tree_free(tree_t* tree);
#endif // _TREE_H_ #endif // _TREE_H_

View File

@ -11,6 +11,11 @@
#ifndef _UNICSTL_H_ #ifndef _UNICSTL_H_
#define _UNICSTL_H_ #define _UNICSTL_H_
#define UNICSTL_VERSION_MAJOR 0
#define UNICSTL_VERSION_MINOR 0
#define UNICSTL_VERSION_MICRO 2
#define UNICSTL_VERSION ((UNICSTL_VERSION_MAJOR << 16) | (UNICSTL_VERSION_MINOR << 8) | UNICSTL_VERSION_MICRO)
#include "common.h" #include "common.h"
#include "list.h" #include "list.h"

View File

@ -70,7 +70,14 @@ static void heap_swap(struct _heap* self, int i, int j)
static void heap_fixed_up(struct _heap* self, int i) static void heap_fixed_up(struct _heap* self, int i)
{ {
assert(self != NULL); assert(self != NULL);
assert(self->compare != NULL);
int p = 0; int p = 0;
if(self->compare == NULL)
{
return ;
}
if(self->_type == HEAP_MAX) if(self->_type == HEAP_MAX)
{ {
while(1) while(1)
@ -122,6 +129,11 @@ static void heap_fixed_down(struct _heap* self, int i)
int l = 0,r = 0; int l = 0,r = 0;
int max = 0, min = 0; int max = 0, min = 0;
if(self->compare == NULL)
{
return;
}
if(self->_type == HEAP_MAX) if(self->_type == HEAP_MAX)
{ {
while(1) while(1)
@ -237,6 +249,46 @@ static void heap_print(struct _heap* self)
} }
} }
iterator_t heap_iter(struct _heap* self)
{
assert(self != NULL);
iterator_t iter = &self->_iter;
iter->_parent = self;
iter->_cur = 0;
iter->_cur_node = self->obj;
return iter;
}
bool heap_iter_hasnext(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
heap_t self = (heap_t)iter->_parent;
if(iter->_cur < self->size(self))
{
return true;
}
return false;
}
const void* heap_iter_next(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
heap_t self = (heap_t)iter->_parent;
void *obj = NULL;
uint32_t index = self->_iter._cur;
obj = self->obj + self->_obj_size * index;
self->_iter._cur += 1;
return obj;
}
static bool heap_init2(struct _heap* self, uint32_t obj_size, uint32_t capacity) static bool heap_init2(struct _heap* self, uint32_t obj_size, uint32_t capacity)
{ {
assert(self != NULL); assert(self != NULL);
@ -253,6 +305,9 @@ static bool heap_init2(struct _heap* self, uint32_t obj_size, uint32_t capacity)
return false; return false;
} }
self->_iter.hasnext = heap_iter_hasnext;
self->_iter.next = heap_iter_next;
self->_destory = heap_destory; self->_destory = heap_destory;
// -------------------- public -------------------- // -------------------- public --------------------
@ -265,6 +320,12 @@ static bool heap_init2(struct _heap* self, uint32_t obj_size, uint32_t capacity)
// base // base
self->size = heap_size; self->size = heap_size;
self->clear = heap_clear; self->clear = heap_clear;
// iter
self->iter = heap_iter;
// config
self->compare = NULL;
// -------------------- debug -------------------- // -------------------- debug --------------------
self->print = heap_print; self->print = heap_print;

View File

@ -215,42 +215,51 @@ static bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity)
return false; return false;
} }
// 1. set attr // -------------------- private --------------------
list->_obj_size = obj_size; list->_obj_size = obj_size;
list->_size = 0; list->_size = 0;
list->_capacity = capacity; list->_capacity = capacity;
list->_ratio = 2; list->_ratio = 2;
list->_cur = 0; list->_cur = 0;
// 2. set function
// kernel
list->append = list_append;
list->get = list_get;
list->clear = list_clear;
list->destory = list_destory;
list->empty = list_empty;
list->index = list_index;
list->insert = list_insert;
list->pop = list_pop;
list->print = list_print;
list->remove = list_remove;
list->reverse = list_reverse;
list->set = list_set;
list->size = list_size;
list->sort = list_sort;
// iterator
list->iter = list_iter;
list->_iter.next = list_iter_next;
list->_iter.hasnext = list_iter_hasnext;
// 3. set array
// list->obj = (void*)calloc(list->_capacity, list->_obj_size);
list->obj = (void*)malloc(list->_capacity * list->_obj_size); list->obj = (void*)malloc(list->_capacity * list->_obj_size);
if (list->obj == NULL) if (list->obj == NULL)
{ {
return false; return false;
} }
list->_iter.next = list_iter_next;
list->_iter.hasnext = list_iter_hasnext;
list->_destory = list_destory;
// -------------------- public --------------------
// kernel
list->append = list_append;
list->insert = list_insert;
list->pop = list_pop;
list->empty = list_empty;
// base
list->clear = list_clear;
list->size = list_size;
// iter
list->iter = list_iter;
// others
list->index = list_index;
list->remove = list_remove;
list->get = list_get;
list->set = list_set;
// list->reverse = list_reverse;
// list->sort = list_sort;
// -------------------- debug --------------------
list->print = list_print;
return true; return true;
} }
@ -276,9 +285,9 @@ void list_free(list_t* list)
assert(list != NULL); assert(list != NULL);
if(list != NULL && *list != NULL) if(list != NULL && *list != NULL)
{ {
if((*list)->destory != NULL) if((*list)->_destory != NULL)
{ {
(*list)->destory(*list); (*list)->_destory(*list);
} }
free(*list); free(*list);
*list = NULL; *list = NULL;

File diff suppressed because it is too large Load Diff

View File

@ -36,7 +36,7 @@ static void* get_min(struct _heap* heap, void *array, int start, int end)
return min; return min;
} }
static void test_heap_num(void) static void test_heap_min_num(void)
{ {
uint32_t i = 0; uint32_t i = 0;
// int data[] = { 2,1,3,4}; // int data[] = { 2,1,3,4};
@ -56,10 +56,11 @@ static void test_heap_num(void)
temp = data[i]; temp = data[i];
TEST_ASSERT_TRUE(heap->push(heap, &temp)); TEST_ASSERT_TRUE(heap->push(heap, &temp));
TEST_ASSERT_EQUAL_INT(i + 1, heap->size(heap)); TEST_ASSERT_EQUAL_INT(i + 1, heap->size(heap));
}
TEST_ASSERT_TRUE(heap->peek(heap, &temp));
TEST_ASSERT_EQUAL_INT(*(int *)get_min(heap, data, 0, heap->size(heap)), temp);
TEST_ASSERT_TRUE(heap->peek(heap, &temp));
TEST_ASSERT_EQUAL_INT(*(int *)get_min(heap, data, 0, heap->size(heap)), temp);
}
TEST_ASSERT_TRUE(heap->clear(heap)); TEST_ASSERT_TRUE(heap->clear(heap));
TEST_ASSERT_TRUE(heap->empty(heap)); TEST_ASSERT_TRUE(heap->empty(heap));
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
@ -79,12 +80,18 @@ static void test_heap_num(void)
TEST_ASSERT_NULL(heap); TEST_ASSERT_NULL(heap);
} }
static void test_heap_struct(void) static void test_heap_min_struct(void)
{ {
uint32_t i = 0; uint32_t i = 0;
struct _student data[] = { struct _student data[] = {
{"zhao", 1001},{"qian", 1002}, {"sun", 1003}, {"li", 1004}, {"sun", 1003},
"zhou", 1005, "wu", 1006, "zheng", 1007, "wang", 1008, {"zhou", 1005},
{"wu", 1006},
{"zhao", 1001},
{"qian", 1002},
{"li", 1004},
{"zheng", 1007},
{"wang", 1008},
}; };
struct _student temp = {0}; struct _student temp = {0};
uint32_t len = sizeof(data) / sizeof(data[0]); uint32_t len = sizeof(data) / sizeof(data[0]);
@ -99,13 +106,13 @@ static void test_heap_struct(void)
temp = data[i]; temp = data[i];
TEST_ASSERT_TRUE(heap->push(heap, &temp)); TEST_ASSERT_TRUE(heap->push(heap, &temp));
TEST_ASSERT_EQUAL_INT(i + 1, heap->size(heap)); TEST_ASSERT_EQUAL_INT(i + 1, heap->size(heap));
}
TEST_ASSERT_TRUE(heap->peek(heap, &temp));
TEST_ASSERT_EQUAL_INT(((struct _student*)get_min(heap, data, 0, heap->size(heap)))->id, temp.id);
TEST_ASSERT_EQUAL_STRING(((struct _student*)get_min(heap, data, 0, heap->size(heap)))->name, temp.name);
}
TEST_ASSERT_TRUE(heap->peek(heap, &temp)); TEST_ASSERT_TRUE(heap->peek(heap, &temp));
TEST_ASSERT_TRUE(heap->peek(heap, &temp)); TEST_ASSERT_TRUE(heap->peek(heap, &temp));
TEST_ASSERT_EQUAL_INT(((struct _student*)get_min(heap, data, 0, heap->size(heap)))->id, temp.id);
TEST_ASSERT_EQUAL_STRING(((struct _student*)get_min(heap, data, 0, heap->size(heap)))->name, temp.name);
TEST_ASSERT_TRUE(heap->clear(heap)); TEST_ASSERT_TRUE(heap->clear(heap));
TEST_ASSERT_TRUE(heap->empty(heap)); TEST_ASSERT_TRUE(heap->empty(heap));
@ -126,10 +133,173 @@ static void test_heap_struct(void)
TEST_ASSERT_NULL(heap); TEST_ASSERT_NULL(heap);
} }
static void test_heap_max_num(void)
{
uint32_t i = 0;
// int data[] = { 2,1,3,4};
// int data[] = { 1,2,3,4,5,6};
// int data[] = { 5,2,3,1,7,8,6 };
int data[] = { 5,2,3,1,7,8,6,4,9,10,12,11,15,14,13 };
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
heap_t heap = heap_max_new2(sizeof(int), 64);
TEST_ASSERT_NOT_NULL(heap);
heap->print_obj = print_num;
heap->compare = compare_num;
for (i = 0; i < len; i++)
{
temp = data[i];
TEST_ASSERT_TRUE(heap->push(heap, &temp));
TEST_ASSERT_EQUAL_INT(i + 1, heap->size(heap));
TEST_ASSERT_TRUE(heap->peek(heap, &temp));
TEST_ASSERT_EQUAL_INT(*(int *)get_max(heap, data, 0, heap->size(heap)), temp);
}
TEST_ASSERT_TRUE(heap->clear(heap));
TEST_ASSERT_TRUE(heap->empty(heap));
for (i = 0; i < len; i++)
{
temp = data[i];
TEST_ASSERT_TRUE(heap->push(heap, &temp));
}
for (i = 0; i < len; i++)
{
temp = data[i];
TEST_ASSERT_TRUE(heap->pop(heap, &temp));
}
TEST_ASSERT_TRUE(heap->empty(heap));
heap_free(&heap);
TEST_ASSERT_NULL(heap);
}
static void test_heap_max_struct(void)
{
uint32_t i = 0;
struct _student data[] = {
{"sun", 1003},
{"zhou", 1005},
{"wu", 1006},
{"zhao", 1001},
{"qian", 1002},
{"li", 1004},
{"zheng", 1007},
{"wang", 1008},
};
struct _student temp = {0};
uint32_t len = sizeof(data) / sizeof(data[0]);
heap_t heap = heap_max_new2(sizeof(struct _student), 64);
TEST_ASSERT_NOT_NULL(heap);
heap->print_obj = print_struct;
heap->compare = compare_struct;
for (i = 0; i < len; i++)
{
temp = data[i];
TEST_ASSERT_TRUE(heap->push(heap, &temp));
TEST_ASSERT_EQUAL_INT(i + 1, heap->size(heap));
TEST_ASSERT_TRUE(heap->peek(heap, &temp));
TEST_ASSERT_EQUAL_INT(((struct _student*)get_max(heap, data, 0, heap->size(heap)))->id, temp.id);
TEST_ASSERT_EQUAL_STRING(((struct _student*)get_max(heap, data, 0, heap->size(heap)))->name, temp.name);
// heap->print_obj(&temp);
// printf("\n");
}
TEST_ASSERT_TRUE(heap->peek(heap, &temp));
TEST_ASSERT_TRUE(heap->peek(heap, &temp));
TEST_ASSERT_TRUE(heap->clear(heap));
TEST_ASSERT_TRUE(heap->empty(heap));
for (i = 0; i < len; i++)
{
temp = data[i];
TEST_ASSERT_TRUE(heap->push(heap, &temp));
}
for (i = 0; i < len; i++)
{
temp = data[i];
TEST_ASSERT_TRUE(heap->pop(heap, &temp));
}
TEST_ASSERT_TRUE(heap->empty(heap));
heap_free(&heap);
TEST_ASSERT_NULL(heap);
}
const int heap_max_iter_expect[15][15] = {
{5},
{5, 2},
{5, 2, 3},
{5, 2, 3, 1},
{7, 5, 3, 1, 2},
{8, 5, 7, 1, 2, 3},
{8, 5, 7, 1, 2, 3, 6},
{8, 5, 7, 4, 2, 3, 6, 1},
{9, 8, 7, 5, 2, 3, 6, 1, 4},
{10, 9, 7, 5, 8, 3, 6, 1, 4, 2},
{12, 10, 7, 5, 9, 3, 6, 1, 4, 2, 8},
{12, 10, 11, 5, 9, 7, 6, 1, 4, 2, 8, 3},
{15, 10, 12, 5, 9, 11, 6, 1, 4, 2, 8, 3, 7},
{15, 10, 14, 5, 9, 11, 12, 1, 4, 2, 8, 3, 7, 6},
{15, 10, 14, 5, 9, 11, 13, 1, 4, 2, 8, 3, 7, 6, 12}
};
static void test_heap_max_iter(void)
{
uint32_t i = 0;
int data[15] = { 5,2,3,1,7,8,6,4,9,10,12,11,15,14,13 };
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
int out[15] = { 0 };
int outlen = 0;
heap_t heap = heap_max_new2(sizeof(int), 64);
TEST_ASSERT_NOT_NULL(heap);
heap->print_obj = print_num;
heap->compare = compare_num;
for (i = 0; i < len; i++)
{
temp = data[i];
TEST_ASSERT_TRUE(heap->push(heap, &temp));
TEST_ASSERT_EQUAL_INT(i + 1, heap->size(heap));
TEST_ASSERT_TRUE(heap->peek(heap, &temp));
TEST_ASSERT_EQUAL_INT(*(int *)get_max(heap, data, 0, heap->size(heap)), temp);
iterator_t iter = heap->iter(heap);
memset(out, 0, sizeof(out));
outlen = 0;
while(iter->hasnext(iter))
{
temp = *(int*)iter->next(iter);
out[outlen] = temp;
outlen++;
}
TEST_ASSERT_EQUAL_INT_ARRAY(&heap_max_iter_expect[i], out, outlen);
}
heap_free(&heap);
TEST_ASSERT_NULL(heap);
}
void test_heap(void) void test_heap(void)
{ {
UnitySetTestFile(__FILE__); UnitySetTestFile(__FILE__);
RUN_TEST(test_heap_num); RUN_TEST(test_heap_min_num);
RUN_TEST(test_heap_struct); RUN_TEST(test_heap_min_struct);
RUN_TEST(test_heap_max_num);
RUN_TEST(test_heap_max_struct);
RUN_TEST(test_heap_max_iter);
} }

View File

@ -19,447 +19,6 @@
#undef min #undef min
#endif #endif
#if 0
/**
* @brief
* int data[] = { 5,2,3,1,7,8,6 };
* 5
* | |
* 2 7
* | | | |
* 1 3 6 8
*/
void test_avltree_num(void)
{
uint32_t i = 0;
// int data[] = { 2,1,3,4};
// int data[] = { 1,2,3,4,5,6};
// int data[] = { 5,2,3,1,7,8,6 };
int data[] = { 5,2,3,1,7,8,6,4,9,10,12,11,15,14,13 };
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
tree_t tree = tree_avl_new(sizeof(int));
tree->print_obj = print_num;
tree->compare = compare_num;
printf("\n\n----- demo_avltree_num -----\n");
printf("----- insert -----\n");
for (i = 0; i < len; i++)
{
temp = data[i];
tree->insert(tree, &temp);
printf("insert = ");
tree->print_obj(&temp);
printf("size = %2d : ", tree->size(tree));
tree->preorder(tree, tree->_root);
printf("\n");
}
printf("----- max -----\n");
tree->max(tree, &temp);
tree->print_obj(&temp);
printf("\n");
printf("----- min -----\n");
tree->min(tree, &temp);
tree->print_obj(&temp);
printf("\n");
printf("----- tree -----\n");
tree->clear(tree);
if (tree->empty(tree))
{
printf("----- empty -----\n");
}
printf("----- insert -----\n");
for (i = 0; i < len; i++)
{
temp = data[i];
tree->insert(tree, &temp);
}
printf("----- preorder -----\n");
tree->preorder(tree, tree->_root);
printf("\n");
printf("----- inorder -----\n");
tree->inorder(tree, tree->_root);
printf("\n");
printf("----- postorder -----\n");
tree->postorder(tree, tree->_root);
printf("\n");
printf("----- breadth -----\n");
tree->breadth(tree, tree->_root);
printf("\n");
printf("----- right priority -----\n");
tree->order(tree, true);
printf("----- preorder(right) -----\n");
tree->preorder(tree, tree->_root);
printf("\n");
printf("----- inorder(right) -----\n");
tree->inorder(tree, tree->_root);
printf("\n");
printf("----- postorder(right) -----\n");
tree->postorder(tree, tree->_root);
printf("\n");
printf("----- breadth(right) -----\n");
tree->breadth(tree, tree->_root);
printf("\n");
printf("----- left priority -----\n");
tree->order(tree, false);
printf("----- preorder -----\n");
tree->preorder(tree, tree->_root);
printf("\n");
for (i = 0; i < len; i++)
{
temp = data[i];
// delete
tree->delete(tree, &temp);
printf("delete = ");
tree->print_obj(&temp);
printf("size = %2d : ", tree->size(tree));
tree->preorder(tree, tree->_root);
printf("\n");
}
if (tree->empty(tree))
{
printf("----- empty -----\n");
}
tree_free(&tree);
}
static bool tree_rb_check_color(struct _tree* self, struct _tree_node* root, int black_num, int black_num_expected)
{
if (root == NULL)
{
if (black_num != black_num_expected)
{
printf("black_num != black_num_expected\n");
return false;
}
return true;
}
if (root->color == RBT_BLACK)
{
black_num++;
}
if (root->color == RBT_RED && root->parent && root->parent->color == RBT_RED)
{
printf("The red node is adjacent to the red node\n");
return false;
}
return tree_rb_check_color(self, root->left, black_num, black_num_expected) &&
tree_rb_check_color(self, root->right, black_num, black_num_expected);
}
static bool tree_rb_check(struct _tree* self)
{
assert(self != NULL);
if (self->_root == NULL)
{
return true;
}
if (self->_root->color != RBT_BLACK)
{
printf("self->_root->color != RBT_BLACK\n");
return false;
}
int black_num_expected = 0;
struct _tree_node* root = self->_root;
while (root)
{
if (root->color == RBT_BLACK)
{
black_num_expected++;
}
root = root->left;
}
return tree_rb_check_color(self, self->_root, 0, black_num_expected);
}
/**
* @brief
*/
void test_rbtree_num(void)
{
uint32_t i = 0;
// int data[] = { 2,1,3,4};
// int data[] = { 1,2,3,4,5,6};
// int data[] = { 5,2,3,1,7,8,6 };
int data[] = { 5,2,3,1,7,8,6,4,9,10,12,11,15,14,13 };
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
tree_t tree = tree_rb_new(sizeof(int));
tree->print_obj = print_num;
tree->compare = compare_num;
printf("\n\n----- demo_rbtree_num -----\n");
printf("----- insert -----\n");
for (i = 0; i < len; i++)
{
temp = data[i];
tree->insert(tree, &temp);
printf("insert = ");
tree->print_obj(&temp);
printf("size = %2d : ", tree->size(tree));
tree->preorder(tree, tree->_root);
printf("\n");
if (true != tree_rb_check(tree))
{
printf("----- rb_check_error -----\n");
return;
}
}
printf("----- max -----\n");
tree->max(tree, &temp);
tree->print_obj(&temp);
printf("\n");
printf("----- min -----\n");
tree->min(tree, &temp);
tree->print_obj(&temp);
printf("\n");
printf("----- tree -----\n");
tree->clear(tree);
if (tree->empty(tree))
{
printf("----- empty -----\n");
}
printf("----- insert -----\n");
for (i = 0; i < len; i++)
{
temp = data[i];
tree->insert(tree, &temp);
}
printf("----- preorder -----\n");
tree->preorder(tree, tree->_root);
printf("\n");
printf("----- inorder -----\n");
tree->inorder(tree, tree->_root);
printf("\n");
printf("----- postorder -----\n");
tree->postorder(tree, tree->_root);
printf("\n");
printf("----- breadth -----\n");
tree->breadth(tree, tree->_root);
printf("\n");
printf("----- right priority -----\n");
tree->order(tree, true);
printf("----- preorder(right) -----\n");
tree->preorder(tree, tree->_root);
printf("\n");
printf("----- inorder(right) -----\n");
tree->inorder(tree, tree->_root);
printf("\n");
printf("----- postorder(right) -----\n");
tree->postorder(tree, tree->_root);
printf("\n");
printf("----- breadth(right) -----\n");
tree->breadth(tree, tree->_root);
printf("\n");
#if 1
printf("----- left priority -----\n");
tree->order(tree, false);
printf("----- preorder -----\n");
tree->preorder(tree, tree->_root);
printf("\n");
for (i = 0; i < len; i++)
{
temp = data[i];
printf("delete = ");
tree->print_obj(&temp);
// delete
tree->delete(tree, &temp);
printf("size = %2d : ", tree->size(tree));
tree->preorder(tree, tree->_root);
printf("\n");
if (true != tree_rb_check(tree))
{
printf("----- rb_check_error -----\n");
return;
}
}
if (tree->empty(tree))
{
printf("----- empty -----\n");
}
#endif
tree_free(&tree);
}
/**
* @brief
*/
void test_rbtree_struct(void)
{
uint32_t i = 0;
struct _student data[] = {
{"zhao", 1001},{"qian", 1002}, {"sun", 1003}, {"li", 1004},
"zhou", 1005, "wu", 1006, "zheng", 1007, "wang", 1008,
};
struct _student temp = { 0 };
uint32_t len = sizeof(data) / sizeof(data[0]);
tree_t tree = tree_rb_new(sizeof(struct _student));
tree->print_obj = print_struct;
tree->compare = compare_struct;
printf("\n\n----- demo_rbtree_struct -----\n");
printf("----- insert -----\n");
for (i = 0; i < len; i++)
{
temp = data[i];
tree->insert(tree, &temp);
printf("insert = ");
tree->print_obj(&temp);
printf("size = %2d : ", tree->size(tree));
tree->preorder(tree, tree->_root);
printf("\n");
if (true != tree_rb_check(tree))
{
printf("----- rb_check_error -----\n");
return;
}
}
printf("----- max -----\n");
tree->max(tree, &temp);
tree->print_obj(&temp);
printf("\n");
printf("----- min -----\n");
tree->min(tree, &temp);
tree->print_obj(&temp);
printf("\n");
printf("----- tree -----\n");
tree->clear(tree);
if (tree->empty(tree))
{
printf("----- empty -----\n");
}
printf("----- insert -----\n");
for (i = 0; i < len; i++)
{
temp = data[i];
tree->insert(tree, &temp);
}
printf("----- preorder -----\n");
tree->preorder(tree, tree->_root);
printf("\n");
printf("----- inorder -----\n");
tree->inorder(tree, tree->_root);
printf("\n");
printf("----- postorder -----\n");
tree->postorder(tree, tree->_root);
printf("\n");
printf("----- breadth -----\n");
tree->breadth(tree, tree->_root);
printf("\n");
printf("----- right priority -----\n");
tree->order(tree, true);
printf("----- preorder(right) -----\n");
tree->preorder(tree, tree->_root);
printf("\n");
printf("----- inorder(right) -----\n");
tree->inorder(tree, tree->_root);
printf("\n");
printf("----- postorder(right) -----\n");
tree->postorder(tree, tree->_root);
printf("\n");
printf("----- breadth(right) -----\n");
tree->breadth(tree, tree->_root);
printf("\n");
#if 1
printf("----- left priority -----\n");
tree->order(tree, false);
printf("----- preorder -----\n");
tree->preorder(tree, tree->_root);
printf("\n");
for (i = 0; i < len; i++)
{
temp = data[i];
printf("delete = ");
tree->print_obj(&temp);
// delete
tree->delete(tree, &temp);
printf("size = %2d : ", tree->size(tree));
tree->preorder(tree, tree->_root);
printf("\n");
if (true != tree_rb_check(tree))
{
printf("----- rb_check_error -----\n");
return;
}
}
if (tree->empty(tree))
{
printf("----- empty -----\n");
}
#endif
tree_free(&tree);
}
#endif
static const int expected_int_array[9][15] = { static const int expected_int_array[9][15] = {
{ 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13}, // original data { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13}, // original data
{ 7, 3, 2, 1, 5, 4, 6, 11, 9, 8, 10, 14, 12, 13, 15}, // order_left_pre { 7, 3, 2, 1, 5, 4, 6, 11, 9, 8, 10, 14, 12, 13, 15}, // order_left_pre
@ -508,76 +67,55 @@ static const int expected_int_array_orderpre_delete[15][15] = {
{ 13, }, { 13, },
}; };
static const enum _order order[8] = {
ORDER_LEFT_PRE, ORDER_LEFT_IN, ORDER_LEFT_POST, ORDER_LEFT_BREADTH,
ORDER_RIGHT_PRE, ORDER_RIGHT_IN, ORDER_RIGHT_POST, ORDER_RIGHT_BREADTH
};
static uint32_t iter2array_num(iterator_t iter, int *data)
{
uint32_t count = 0;
while(iter->hasnext(iter))
{
data[count] = *(int *)iter->next(iter);
count++;
}
return count;
}
static void test_avltree_iter(void) static void test_avltree_iter(void)
{ {
uint32_t i = 0; uint32_t i = 0;
// int data[] = { 2,1,3,4}; int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
// int data[] = { 1,2,3,4,5,6}; int buff[15];
// int data[] = { 5,2,3,1,7,8,6 }; uint32_t len = sizeof(data) / sizeof(int);
// int data[] = { 5,2,3,1,7,8,6,4,9,10,12,11,15,14,13 };
int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
int buff[32];
int temp = 0; int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
int * iter = NULL;
int count = 0; int count = 0;
iterator_t iter = NULL;
tree_t tree = tree_avl_new(sizeof(int)); tree_t tree = tree_avl_new(sizeof(int));
TEST_ASSERT_NOT_NULL(tree); TEST_ASSERT_NOT_NULL(tree);
tree->print_obj = print_num; tree->print_obj = print_num;
tree->compare = compare_num; tree->compare = compare_num;
memcpy(data, expected_int_array[0], len);
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
{ {
temp = data[i]; temp = data[i];
TEST_ASSERT_TRUE(tree->insert(tree, &temp)); TEST_ASSERT_TRUE(tree->insert(tree, &temp));
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree)) iter = tree->iter(tree, ORDER_LEFT_PRE);
{ count = iter2array_num(iter, buff);
buff[count++] = *iter;
}
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array_orderpre_insert[i], buff, count); TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array_orderpre_insert[i], buff, count);
} }
for(i = 1; i < 9; i++) for(i = 0; i < 8; i++)
{ {
tree->set_order(tree, i); //ORDER_LEFT_IN iter = tree->iter(tree, order[i]);
// printf("\n ----- iter test -----\n"); count = iter2array_num(iter, buff);
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree)) TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array[i + 1], buff, count);
{
// printf("(%2d ) ", *iter);
buff[count++] = *iter;
}
// printf("\n");
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array[i], buff, count);
} }
#if 0
tree->order(tree, true);
printf("\n\nactual data = \n");
tree->postorder(tree, tree->_root);
printf("\n");
// set order
// tree->set_order(tree, ORDER_LEFT_PRE);
// tree->set_order(tree, ORDER_LEFT_IN);
// tree->set_order(tree, ORDER_LEFT_POST);
// tree->set_order(tree, ORDER_LEFT_BREADTH);
// tree->set_order(tree, ORDER_RIGHT_PRE);
// tree->set_order(tree, ORDER_RIGHT_IN);
tree->set_order(tree, ORDER_RIGHT_POST);
// tree->set_order(tree, ORDER_RIGHT_BREADTH);
printf("\n ----- iter data -----\n");
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
printf("(%2d ) ", *iter);
buff[count++] = *iter;
}
printf("\n");
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array[tree->_order], buff, count);
#endif
TEST_ASSERT_FALSE(tree->empty(tree)); TEST_ASSERT_FALSE(tree->empty(tree));
TEST_ASSERT_TRUE(tree->clear(tree)); TEST_ASSERT_TRUE(tree->clear(tree));
TEST_ASSERT_TRUE(tree->empty(tree)); TEST_ASSERT_TRUE(tree->empty(tree));
@ -589,46 +127,34 @@ static void test_avltree_iter(void)
static void test_avltree_insert(void) static void test_avltree_insert(void)
{ {
uint32_t i = 0; uint32_t i = 0;
// int data[] = { 2,1,3,4};
// int data[] = { 1,2,3,4,5,6};
// int data[] = { 5,2,3,1,7,8,6 };
int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, }; int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
int buff[32]; int buff[15];
uint32_t len = sizeof(data) / sizeof(int);
int temp = 0; int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
int * iter = NULL;
int count = 0; int count = 0;
iterator_t iter = NULL;
tree_t tree = tree_avl_new(sizeof(int)); tree_t tree = tree_avl_new(sizeof(int));
TEST_ASSERT_NOT_NULL(tree); TEST_ASSERT_NOT_NULL(tree);
tree->print_obj = print_num; tree->print_obj = print_num;
tree->compare = compare_num; tree->compare = compare_num;
memcpy(data, expected_int_array[0], len);
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
{ {
temp = data[i]; temp = data[i];
TEST_ASSERT_TRUE(tree->insert(tree, &temp)); TEST_ASSERT_TRUE(tree->insert(tree, &temp));
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree)) iter = tree->iter(tree, ORDER_LEFT_PRE);
{ count = iter2array_num(iter, buff);
buff[count++] = *iter;
}
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array_orderpre_insert[i], buff, count); TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array_orderpre_insert[i], buff, count);
} }
for(i = 1; i < 9; i++) for(i = 0; i < 8; i++)
{ {
tree->set_order(tree, i); //ORDER_LEFT_IN iter = tree->iter(tree, order[i]);
// printf("\n ----- iter test -----\n"); count = iter2array_num(iter, buff);
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree)) TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array[i + 1], buff, count);
{
// printf("(%2d ) ", *iter);
buff[count++] = *iter;
}
// printf("\n");
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array[i], buff, count);
} }
tree_free(&tree); tree_free(&tree);
@ -638,20 +164,19 @@ static void test_avltree_insert(void)
static void test_avltree_delete(void) static void test_avltree_delete(void)
{ {
uint32_t i = 0; uint32_t i = 0;
int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, }; int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
int buff[32]; int buff[15];
uint32_t len = sizeof(data) / sizeof(int);
int temp = 0; int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
int * iter = NULL;
int count = 0; int count = 0;
iterator_t iter = NULL;
tree_t tree = tree_avl_new(sizeof(int)); tree_t tree = tree_avl_new(sizeof(int));
TEST_ASSERT_NOT_NULL(tree); TEST_ASSERT_NOT_NULL(tree);
tree->print_obj = print_num; tree->print_obj = print_num;
tree->compare = compare_num; tree->compare = compare_num;
memcpy(data, expected_int_array[0], len);
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
{ {
temp = data[i]; temp = data[i];
@ -660,19 +185,13 @@ static void test_avltree_delete(void)
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
{ {
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree)) iter = tree->iter(tree, ORDER_LEFT_PRE);
{ count = iter2array_num(iter, buff);
buff[count++] = *iter;
// printf("(%2d ) ", *iter);
}
// printf("\n");
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array_orderpre_delete[i], buff, count); TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array_orderpre_delete[i], buff, count);
temp = data[i]; temp = data[i];
// delete
TEST_ASSERT_TRUE(tree->delete(tree, &temp)); TEST_ASSERT_TRUE(tree->delete(tree, &temp));
} }
//
TEST_ASSERT_FALSE(tree->delete(tree, &temp)); TEST_ASSERT_FALSE(tree->delete(tree, &temp));
tree_free(&tree); tree_free(&tree);
@ -734,21 +253,15 @@ static const int rbt_expected_int_array_orderpre_delete[15][15] = {
static void test_rbtree_iter(void) static void test_rbtree_iter(void)
{ {
uint32_t i = 0; uint32_t i = 0;
// int data[] = { 2,1,3,4}; int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
// int data[] = { 1,2,3,4,5,6}; int buff[15];
// int data[] = { 5,2,3,1,7,8,6 }; uint32_t len = sizeof(data) / sizeof(int);
// int data[] = { 5,2,3,1,7,8,6,4,9,10,12,11,15,14,13 };
int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
int buff[32];
int temp = 0; int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
int * iter = NULL;
int count = 0; int count = 0;
iterator_t iter = NULL;
tree_t tree = tree_rb_new(sizeof(int)); tree_t tree = tree_rb_new(sizeof(int));
TEST_ASSERT_NOT_NULL(tree); TEST_ASSERT_NOT_NULL(tree);
tree->print_obj = print_num; tree->print_obj = print_num;
tree->compare = compare_num; tree->compare = compare_num;
@ -757,51 +270,18 @@ static void test_rbtree_iter(void)
temp = data[i]; temp = data[i];
TEST_ASSERT_TRUE(tree->insert(tree, &temp)); TEST_ASSERT_TRUE(tree->insert(tree, &temp));
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree)) iter = tree->iter(tree, ORDER_LEFT_PRE);
{ count = iter2array_num(iter, buff);
buff[count++] = *iter;
}
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_insert[i], buff, count); TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_insert[i], buff, count);
} }
for(i = 1; i < 9; i++) for(i = 0; i < 8; i++)
{ {
tree->set_order(tree, i); //ORDER_LEFT_IN iter = tree->iter(tree, order[i]);
// printf("\n ----- iter test -----\n"); count = iter2array_num(iter, buff);
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree)) TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array[i + 1], buff, count);
{
// printf("(%2d ) ", *iter);
buff[count++] = *iter;
}
// printf("\n");
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array[i], buff, count);
} }
#if 0
tree->order(tree, true);
printf("\n\nactual data = \n");
tree->postorder(tree, tree->_root);
printf("\n");
// set order
// tree->set_order(tree, ORDER_LEFT_PRE);
// tree->set_order(tree, ORDER_LEFT_IN);
// tree->set_order(tree, ORDER_LEFT_POST);
// tree->set_order(tree, ORDER_LEFT_BREADTH);
// tree->set_order(tree, ORDER_RIGHT_PRE);
// tree->set_order(tree, ORDER_RIGHT_IN);
tree->set_order(tree, ORDER_RIGHT_POST);
// tree->set_order(tree, ORDER_RIGHT_BREADTH);
printf("\n ----- iter data -----\n");
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
printf("(%2d ) ", *iter);
buff[count++] = *iter;
}
printf("\n");
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array[tree->_order], buff, count);
#endif
TEST_ASSERT_FALSE(tree->empty(tree)); TEST_ASSERT_FALSE(tree->empty(tree));
TEST_ASSERT_TRUE(tree->clear(tree)); TEST_ASSERT_TRUE(tree->clear(tree));
TEST_ASSERT_TRUE(tree->empty(tree)); TEST_ASSERT_TRUE(tree->empty(tree));
@ -813,20 +293,15 @@ static void test_rbtree_iter(void)
static void test_rbtree_insert(void) static void test_rbtree_insert(void)
{ {
uint32_t i = 0; uint32_t i = 0;
// int data[] = { 2,1,3,4};
// int data[] = { 1,2,3,4,5,6};
// int data[] = { 5,2,3,1,7,8,6 };
int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, }; int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
int buff[32]; int buff[15];
uint32_t len = sizeof(data) / sizeof(int);
int temp = 0; int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
int * iter = NULL;
int count = 0; int count = 0;
iterator_t iter = NULL;
tree_t tree = tree_rb_new(sizeof(int)); tree_t tree = tree_rb_new(sizeof(int));
TEST_ASSERT_NOT_NULL(tree); TEST_ASSERT_NOT_NULL(tree);
tree->print_obj = print_num; tree->print_obj = print_num;
tree->compare = compare_num; tree->compare = compare_num;
@ -835,24 +310,16 @@ static void test_rbtree_insert(void)
temp = data[i]; temp = data[i];
TEST_ASSERT_TRUE(tree->insert(tree, &temp)); TEST_ASSERT_TRUE(tree->insert(tree, &temp));
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree)) iter = tree->iter(tree, ORDER_LEFT_PRE);
{ count = iter2array_num(iter, buff);
buff[count++] = *iter;
}
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_insert[i], buff, count); TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_insert[i], buff, count);
} }
for(i = 1; i < 9; i++) for(i = 0; i < 8; i++)
{ {
tree->set_order(tree, i); //ORDER_LEFT_IN iter = tree->iter(tree, order[i]);
// printf("\n ----- iter test -----\n"); count = iter2array_num(iter, buff);
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree)) TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array[i + 1], buff, count);
{
// printf("(%2d ) ", *iter);
buff[count++] = *iter;
}
// printf("\n");
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array[i], buff, count);
} }
tree_free(&tree); tree_free(&tree);
@ -863,16 +330,18 @@ static void test_rbtree_delete(void)
{ {
uint32_t i = 0; uint32_t i = 0;
int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, }; int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
int buff[32]; int buff[15];
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]); uint32_t len = sizeof(data) / sizeof(data[0]);
int temp = 0;
int * iter = NULL;
int count = 0; int count = 0;
iterator_t iter = NULL;
enum _order order[8] = {
ORDER_LEFT_PRE, ORDER_LEFT_IN, ORDER_LEFT_POST, ORDER_LEFT_BREADTH,
ORDER_RIGHT_PRE, ORDER_RIGHT_IN, ORDER_RIGHT_POST, ORDER_RIGHT_BREADTH
};
tree_t tree = tree_rb_new(sizeof(int)); tree_t tree = tree_rb_new(sizeof(int));
TEST_ASSERT_NOT_NULL(tree); TEST_ASSERT_NOT_NULL(tree);
tree->print_obj = print_num; tree->print_obj = print_num;
tree->compare = compare_num; tree->compare = compare_num;
@ -884,26 +353,19 @@ static void test_rbtree_delete(void)
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
{ {
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree)) iter = tree->iter(tree, ORDER_LEFT_PRE);
{ count = iter2array_num(iter, buff);
buff[count++] = *iter;
// printf("(%2d ) ", *iter);
}
// printf("\n");
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_delete[i], buff, count); TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_delete[i], buff, count);
temp = data[i]; temp = data[i];
// delete
TEST_ASSERT_TRUE(tree->delete(tree, &temp)); TEST_ASSERT_TRUE(tree->delete(tree, &temp));
} }
//
TEST_ASSERT_FALSE(tree->delete(tree, &temp)); TEST_ASSERT_FALSE(tree->delete(tree, &temp));
tree_free(&tree); tree_free(&tree);
TEST_ASSERT_NULL(tree); TEST_ASSERT_NULL(tree);
} }
void test_tree(void) void test_tree(void)
{ {
UnitySetTestFile(__FILE__); UnitySetTestFile(__FILE__);
@ -915,8 +377,4 @@ void test_tree(void)
RUN_TEST(test_rbtree_iter); RUN_TEST(test_rbtree_iter);
RUN_TEST(test_rbtree_insert); RUN_TEST(test_rbtree_insert);
RUN_TEST(test_rbtree_delete); RUN_TEST(test_rbtree_delete);
// RUN_TEST(test_avltree_num);
// RUN_TEST(test_rbtree_num);
// RUN_TEST(test_rbtree_struct);
} }