Compare commits

...

36 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
0369d58147 heap删除大小堆的旧标志 2025-04-24 16:58:15 +08:00
02b09e729d 堆不是最大堆就是最小堆,直接对外拆分成两套接口 2025-04-24 16:50:35 +08:00
bd9f07ae65 修改readme的说明,并添加命名规范 2025-04-24 15:55:57 +08:00
5d4a461543 deque的迭代器测试通过 2025-04-24 15:30:00 +08:00
b3d7c96484 deque添加iterator 2025-04-24 15:20:49 +08:00
aac984ee08 队列的迭代器实现并测试通过 2025-04-24 14:44:13 +08:00
07bb44a4d8 queue添加iter 2025-04-24 14:26:41 +08:00
a249cae244 queue区分私有和公有 2025-04-24 14:01:49 +08:00
8f5540743f 迭代器合并一下吧,毕竟目前来看stack实现方式就两种,链表或者动态数组 2025-04-24 13:54:05 +08:00
4fa56e1ed8 iterator区分private和public 2025-04-24 13:07:17 +08:00
21485efb51 修复heap报错的问题 2025-04-24 12:44:43 +08:00
cc357caf6a 针对stack链表模式也实现了迭代器 2025-04-24 11:58:03 +08:00
86855420e2 栈的迭代器从栈顶到栈底,另外destory函数私有化 2025-04-24 11:36:56 +08:00
b396d80672 默认栈的迭代器从栈顶到栈底 2025-04-24 11:27:22 +08:00
07b2c142b8 给stack添加迭代器,但为什么heap会报错?? 2025-04-24 11:13:11 +08:00
d805d56fc9 删除旧版迭代器 2025-04-24 10:31:51 +08:00
0768e026dc 修改迭代器,后续将迭代器接口统一 2025-04-24 10:15:09 +08:00
0d6ba14451 根据实测情况来看,iter的方案是可行的,后续再考虑实现细节吧 2025-04-23 18:35:24 +08:00
28 changed files with 1737 additions and 1737 deletions

View File

@ -24,6 +24,8 @@
"unity_internals.h": "c", "unity_internals.h": "c",
"stdarg.h": "c", "stdarg.h": "c",
"graph.h": "c", "graph.h": "c",
"unicstl_config.h": "c" "unicstl_config.h": "c",
"iter.h": "c",
"iterator.h": "c"
} }
} }

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

@ -7,7 +7,7 @@
> 标准:--std=c99 > 标准:--std=c99
[数据结构详细说明](http://wenjianfeng.top) [数据结构详细说明](https://blog.wenjianfeng.top)
## 数据结构 ## 数据结构
|数据结构 | 原理 |说明 | |数据结构 | 原理 |说明 |
@ -45,7 +45,54 @@
**【A1】** 若链表的操作流程为,先查找元素再删除元素。那么时间复杂度确实是$O(n)$。但是链表的增删优势,在其他应用有体现。比如双向队列,插入和删除效率都为$O(1)$。 **【A1】** 若链表的操作流程为,先查找元素再删除元素。那么时间复杂度确实是$O(n)$。但是链表的增删优势,在其他应用有体现。比如双向队列,插入和删除效率都为$O(1)$。
## 版本 ## 规范
| 版本 | 说明 | ### 版本说明
|:----:|:----:|
| 0.xx.xx | 测试版本 | | 命名 |版本说明 | 范围 | 更新说明 |
|:----: |:----:|:----:|:----:|
| `VERSION_MAJOR` | 主版本号 | 0 ~ 99 | 代码框架大改,完全不兼容旧版 |
| `VERSION_MINOR` | 次版本号 | 0 ~ 99 | 代码框架尽量兼容旧版增信大功能、修复重大bug等 |
| `VERSION_MICRO` | 小版本号 | 0 ~ 99 | 代码框架兼容旧版新增小功能、修复bug等 |
举例说明:
```c
// 若 major > 0 ,则代表正式发布版本
#define UNICSTL_VERSION_MAJOR 1
#define UNICSTL_VERSION_MINOR 2
#define UNICSTL_VERSION_MICRO 5
#define UNICSTL_VERSION ((UNICSTL_VERSION_MAJOR << 16) | (UNICSTL_VERSION_MINOR << 8) | UNICSTL_VERSION_MICRO)
```
### 工程命名
`工程名(_功能)_v版本号_日期(_时间)(-其他信息)`
> 括号内表示可选项
| 其他信息后缀 | 说明 | 详细
|:----:|:----:|----
| aX | alpha内测版 | 可能仅测试了新增功能,但没有测试新增功能对其他模块的影响
| bX | beta公测版 | 不仅测试了新增功能,也测试了其他模块,尽量保证新增的功能不影响原来的旧功能。
| ... | | 或者添加其他有有效信息
举例说明:
```shell
unicstl_stack_v1.2.5_20240717-a0.zip
# 带a或者b后缀表示当前版本发布前的测试版。如果发布后则直接更新版本号了
```
## 修改日志
### Unicstl 0.0.01 (2025-04-24)
- new features
- add stack
- add queue
- add deque
- add list
- add heap
- add tree
- add graph
- add iterator
- bugfixed:
- none
- others:
- none

View File

@ -20,14 +20,10 @@ void demo_heap_num(void)
int temp = 0; int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]); uint32_t len = sizeof(data) / sizeof(data[0]);
heap_t heap = heap_new2(sizeof(int), 64); heap_t heap = heap_min_new2(sizeof(int), 64);
heap->print_obj = print_num; heap->print_obj = print_num;
heap->compare = compare_num; heap->compare = compare_num;
// default: maxheap
// maxheap or minheap
heap->setmin(heap, true);
printf("\n\n----- demo_heap_num -----\n"); printf("\n\n----- demo_heap_num -----\n");
printf("----- push -----\n"); printf("----- push -----\n");
@ -90,7 +86,7 @@ static void demo_heap_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]);
heap_t heap = heap_new2(sizeof(struct _student), 64); heap_t heap = heap_min_new2(sizeof(struct _student), 64);
heap->print_obj = print_struct; heap->print_obj = print_struct;
heap->compare = compare_struct; heap->compare = compare_struct;

View File

@ -200,7 +200,7 @@ static void demo_stack_struct(void)
} }
} }
stack->destory(stack); stack->_destory(stack);
stack_free(&stack); stack_free(&stack);
} }

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

@ -11,9 +11,11 @@
#ifndef _COMMON_H_ #ifndef _COMMON_H_
#define _COMMON_H_ #define _COMMON_H_
// #ifdef UNICSTL_CONFIG #define UNICSTL_CONFIG
#ifdef UNICSTL_CONFIG
#include "unicstl_config.h" #include "unicstl_config.h"
// #endif #endif
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
@ -23,4 +25,18 @@
#include <limits.h> #include <limits.h>
#include <assert.h> #include <assert.h>
#ifdef UNICSTL_ITERATOR
#include "iterator.h"
#endif
/**
* @brief obj compare with obj2
*
* @return
* obj < obj2 return -1
* obj == obj2 return 0
* obj > obj2 return 1
*/
typedef int (*compare_fun_t)(void* obj, void* obj2);
#endif // _COMMON_H_ #endif // _COMMON_H_

View File

@ -22,6 +22,7 @@ struct _deque_node
struct _deque struct _deque
{ {
// -------------------- private --------------------
struct _deque_node* _head; struct _deque_node* _head;
struct _deque_node* _tail; struct _deque_node* _tail;
@ -30,6 +31,11 @@ struct _deque
// uint32_t _capacity; // uint32_t _capacity;
// uint32_t _ratio; // uint32_t _ratio;
struct _iterator _iter;
void (*_destory)(struct _deque* self);
// -------------------- public --------------------
// kernel // kernel
bool (*push_back)(struct _deque* self, void* obj); bool (*push_back)(struct _deque* self, void* obj);
bool (*push_front)(struct _deque* self, void* obj); bool (*push_front)(struct _deque* self, void* obj);
@ -37,30 +43,30 @@ struct _deque
bool (*pop_front)(struct _deque* self, void* obj); bool (*pop_front)(struct _deque* self, void* obj);
bool (*back)(struct _deque* self, void* obj); bool (*back)(struct _deque* self, void* obj);
bool (*front)(struct _deque* self, void* obj); bool (*front)(struct _deque* self, void* obj);
bool (*empty)(struct _deque* self);
// base
uint32_t(*size)(struct _deque* self);
bool (*clear)(struct _deque* self);
// iter
iterator_t (*iter)(struct _deque* self);
// ohters
bool (*insert)(struct _deque* self, int index, void* obj); bool (*insert)(struct _deque* self, int index, void* obj);
bool (*erase)(struct _deque* self, int index, void* obj); bool (*erase)(struct _deque* self, int index, void* obj);
int (*index)(struct _deque* self, void* obj); int (*index)(struct _deque* self, void* obj);
bool (*remove)(struct _deque* self, void* obj); bool (*remove)(struct _deque* self, void* obj);
bool (*clear)(struct _deque* self);
bool (*get)(struct _deque* self, int index, void* obj); bool (*get)(struct _deque* self, int index, void* obj);
bool (*set)(struct _deque* self, int index, void* obj); bool (*set)(struct _deque* self, int index, void* obj);
// size
uint32_t(*size)(struct _deque* self);
bool (*empty)(struct _deque* self);
// free
void (*destory)(struct _deque* self);
// 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);
// print // -------------------- debug --------------------
void (*print)(struct _deque* self); void (*print)(struct _deque* self);
void (*print_obj)(void* obj); void (*print_obj)(void* obj);
}; };

View File

@ -1,64 +1,66 @@
/** /**
* @file heap.h * @file heap.h
* @author wenjf (Orig5826@163.com) * @author wenjf (Orig5826@163.com)
* @brief * @brief
* @version 0.1 * @version 0.1
* @date 2024-07-03 * @date 2024-07-03
* *
* @copyright Copyright (c) 2024 * @copyright Copyright (c) 2024
* *
*/ */
#ifndef _HEAP_H_ #ifndef _HEAP_H_
#define _HEAP_H_ #define _HEAP_H_
#include "common.h" #include "common.h"
typedef enum
{
HEAP_MIN = 0,
HEAP_MAX = 1,
}heap_type;
struct _heap struct _heap
{ {
void * obj; // -------------------- private --------------------
void* obj;
uint32_t _size; uint32_t _size;
uint32_t _obj_size; uint32_t _obj_size;
uint32_t _capacity; uint32_t _capacity;
uint32_t _ratio; uint32_t _ratio;
bool _min_flag; heap_type _type;
struct _iterator _iter;
void (*_destory)(struct _heap* self);
// -------------------- public --------------------
// kernel // kernel
bool (*peek)(struct _heap* self, void* obj); bool (*peek)(struct _heap* self, void* obj);
bool (*push)(struct _heap* self, void* obj); bool (*push)(struct _heap* self, void* obj);
bool (*pop)(struct _heap* self, void* obj); bool (*pop)(struct _heap* self, void* obj);
bool (*empty)(struct _heap* self);
// default: max heap
void (*setmin)(struct _heap* self, bool min_flag);
// base // base
uint32_t(*size)(struct _heap* self); uint32_t(*size)(struct _heap* self);
bool (*empty)(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);
// others
bool (*clear)(struct _heap* self); bool (*clear)(struct _heap* self);
void (*destory)(struct _heap* self);
// print // iter
iterator_t (*iter)(struct _heap* self);
// config
compare_fun_t compare; // !!! you have to implement this function
// -------------------- debug --------------------
void (*print)(struct _heap* self); void (*print)(struct _heap* self);
void (*print_obj)(void* obj); void (*print_obj)(void* obj);
}; };
typedef struct _heap* heap_t; typedef struct _heap* heap_t;
// create and free heap // create and free heap
heap_t heap_new2(uint32_t obj_size, uint32_t capacity); heap_t heap_max_new2(uint32_t obj_size, uint32_t capacity);
heap_t heap_min_new2(uint32_t obj_size, uint32_t capacity);
void heap_free(heap_t* heap); void heap_free(heap_t* heap);
#endif // _HEAP_H_ #endif // _HEAP_H_

29
include/iterator.h Normal file
View File

@ -0,0 +1,29 @@
/**
* @file iter.h
* @author wenjf (Orig5826@163.com)
* @brief
* @version 0.1
* @date 2025-04-23
*
* @copyright Copyright (c) 2025
*
*/
#ifndef _ITER_H_
#define _ITER_H_
#include "common.h"
struct _iterator
{
// ---------- private ----------
void* _parent;
void* _cur_node;
uint32_t _cur;
// ---------- public ----------
bool (*hasnext)(struct _iterator* self);
const void* (*next)(struct _iterator* self);
};
typedef struct _iterator* iterator_t;
#endif // !_ITER_H_

View File

@ -12,9 +12,11 @@
#define _LIST_H_ #define _LIST_H_
#include "common.h" #include "common.h"
#include "iterator.h"
struct _list struct _list
{ {
// -------------------- private --------------------
void * obj; void * obj;
uint32_t _obj_size; uint32_t _obj_size;
@ -23,6 +25,11 @@ struct _list
uint32_t _ratio; uint32_t _ratio;
uint32_t _cur; uint32_t _cur;
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.
@ -34,32 +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
void* (*begin)(struct _list* self);
void* (*next)(struct _list* self);
void* (*end)(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

@ -21,6 +21,7 @@ struct _queue_node
struct _queue struct _queue
{ {
// -------------------- private --------------------
struct _queue_node * _front; struct _queue_node * _front;
struct _queue_node * _back; struct _queue_node * _back;
@ -32,24 +33,28 @@ struct _queue
uint32_t _capacity; uint32_t _capacity;
uint32_t _ratio; uint32_t _ratio;
struct _iterator _iter;
void (*_destory)(struct _queue* self);
// -------------------- public --------------------
// kernel // kernel
bool (*push)(struct _queue* self, void* obj); bool (*push)(struct _queue* self, void* obj);
bool (*pop)(struct _queue* self, void* obj); bool (*pop)(struct _queue* self, void* obj);
bool (*back)(struct _queue* self, void* obj); bool (*back)(struct _queue* self, void* obj);
bool (*front)(struct _queue* self, void* obj); bool (*front)(struct _queue* self, void* obj);
// base
bool (*empty)(struct _queue* self); bool (*empty)(struct _queue* self);
bool (*full)(struct _queue* self); bool (*full)(struct _queue* self);
// base
uint32_t (*size)(struct _queue* self); uint32_t (*size)(struct _queue* self);
uint32_t (*capacity)(struct _queue* self); uint32_t (*capacity)(struct _queue* self);
// clear and free node
bool (*clear)(struct _queue* self); bool (*clear)(struct _queue* self);
void (*destory)(struct _queue* self);
// print // iter
iterator_t (*iter)(struct _queue* self);
// -------------------- debug --------------------
void (*print)(struct _queue* self); void (*print)(struct _queue* self);
void (*print_obj)(void* obj); void (*print_obj)(void* obj);
}; };

View File

@ -21,6 +21,12 @@ struct _stack_node
struct _stack struct _stack
{ {
// -------------------- private --------------------
/**
* @brief head pointer of stack
* 1. linklist: head->next is valid, head->obj is NULL
* 2. array: head->obj is valid, head->next is NULL,
*/
struct _stack_node * _head; struct _stack_node * _head;
uint32_t _size; uint32_t _size;
@ -28,21 +34,26 @@ struct _stack
uint32_t _capacity; uint32_t _capacity;
uint32_t _ratio; uint32_t _ratio;
struct _iterator _iter;
void (*_destory)(struct _stack* self);
// -------------------- public --------------------
// kernel // kernel
bool (*push)(struct _stack* self, void* obj); bool (*push)(struct _stack* self, void* obj);
bool (*pop)(struct _stack* self, void* obj); bool (*pop)(struct _stack* self, void* obj);
bool (*peek)(struct _stack* self, void* obj); bool (*peek)(struct _stack* self, void* obj);
bool (*empty)(struct _stack* self);
// base // base
uint32_t (*size)(struct _stack* self); uint32_t (*size)(struct _stack* self);
bool (*empty)(struct _stack* self);
uint32_t (*capacity)(struct _stack* self); uint32_t (*capacity)(struct _stack* self);
// clear and free node
bool (*clear)(struct _stack* self); bool (*clear)(struct _stack* self);
void (*destory)(struct _stack* self);
// iter
iterator_t (*iter)(struct _stack* self);
// print // -------------------- debug --------------------
void (*print)(struct _stack* self); void (*print)(struct _stack* 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

@ -21,13 +21,24 @@
#define UNICSTL_TREE #define UNICSTL_TREE
#define UNICSTL_HEAP #define UNICSTL_HEAP
#define UNICSTL_GRAPH #define UNICSTL_GRAPH
#define UNICSTL_ITERATOR
/** /**
* @brief debug * @brief debug
* *
*/ */
#define NDEBUG #define NDEBUG // assert disable
#define UNICSTL_DEBUG #define UNICSTL_DEBUG
#ifdef UNICSTL_DEBUG
#define UNICSTL_DEBUG_STACK
#define UNICSTL_DEBUG_QUEUE
#define UNICSTL_DEBUG_DEQUE
#define UNICSTL_DEBUG_TREE
#define UNICSTL_DEBUG_HEAP
#define UNICSTL_DEBUG_GRAPH
// #define UNICSTL_DEBUG_ITERATOR
#endif
#endif #endif

View File

@ -295,35 +295,99 @@ static void deque_print(struct _deque* self)
} }
} }
iterator_t deque_iter(struct _deque* self)
{
assert(self != NULL);
iterator_t iter = &self->_iter;
iter->_parent = self;
iter->_cur = 0;
iter->_cur_node = self->_head;
return iter;
}
bool deque_iter_hasnext(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
deque_t self = (deque_t)iter->_parent;
if(iter->_cur < self->size(self))
{
return true;
}
return false;
}
const void* deque_iter_next(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
deque_t self = (deque_t)iter->_parent;
void *obj = NULL;
// base on linklist
struct _deque_node * node = (struct _deque_node *)iter->_cur_node;
if(node != NULL)
{
obj = node->obj;
iter->_cur_node = node->next;
}
self->_iter._cur += 1;
return obj;
}
static bool deque_init(struct _deque* self, uint32_t obj_size) static bool deque_init(struct _deque* self, uint32_t obj_size)
{ {
// attribute assert(self != NULL);
if(obj_size == 0)
{
return false;
}
// -------------------- private --------------------
self->_obj_size = obj_size; self->_obj_size = obj_size;
self->_size = 0; self->_size = 0;
// self->_capacity = 64; // self->_capacity = 64;
// self->_ratio = 2; // self->_ratio = 2;
// function
self->back = deque_back;
self->clear = deque_clear;
self->destory = deque_destory;
self->empty = deque_empty;
self->erase = deque_erase;
self->front = deque_front;
self->get = deque_get;
self->index = deque_index;
self->insert = deque_insert;
self->pop_back = deque_pop_back;
self->pop_front = deque_pop_front;
self->push_back = deque_push_back;
self->push_front = deque_push_front;
self->print = deque_print;
self->remove = deque_remove;
self->set = deque_set;
self->size = deque_size;
self->_head = NULL; self->_head = NULL;
self->_tail = NULL; self->_tail = NULL;
self->_iter.hasnext = deque_iter_hasnext;
self->_iter.next = deque_iter_next;
self->_destory = deque_destory;
// -------------------- public --------------------
// kernel
self->push_back = deque_push_back;
self->push_front = deque_push_front;
self->pop_back = deque_pop_back;
self->pop_front = deque_pop_front;
self->back = deque_back;
self->front = deque_front;
self->empty = deque_empty;
// base
self->clear = deque_clear;
self->size = deque_size;
// iter
self->iter = deque_iter;
// others
self->insert = deque_insert;
self->erase = deque_erase;
self->index = deque_index;
self->remove = deque_remove;
self->set = deque_set;
self->get = deque_get;
// -------------------- debug --------------------
self->print = deque_print;
return true; return true;
} }
@ -332,13 +396,15 @@ deque_t deque_new(uint32_t obj_size)
{ {
struct _deque* deque = NULL; struct _deque* deque = NULL;
deque = (struct _deque*)malloc(sizeof(struct _deque)); deque = (struct _deque*)malloc(sizeof(struct _deque));
if(deque != NULL) if(deque == NULL)
{ {
if(deque_init(deque, obj_size) != true) return NULL;
{ }
free(deque);
deque = NULL; if(deque_init(deque, obj_size) != true)
} {
free(deque);
return NULL;
} }
return deque; return deque;
} }
@ -347,7 +413,7 @@ void deque_free(deque_t *deque)
{ {
if(*deque != NULL) if(*deque != NULL)
{ {
(*deque)->destory(*deque); (*deque)->_destory(*deque);
free(*deque); free(*deque);
} }
*deque = NULL; *deque = NULL;

View File

@ -70,8 +70,15 @@ 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->_min_flag != true)
if(self->compare == NULL)
{
return ;
}
if(self->_type == HEAP_MAX)
{ {
while(1) while(1)
{ {
@ -85,7 +92,7 @@ static void heap_fixed_up(struct _heap* self, int i)
i = p; i = p;
} }
} }
else else /* if(self->_type == HEAP_MIN) */
{ {
while(1) while(1)
{ {
@ -122,7 +129,12 @@ 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->_min_flag != true) if(self->compare == NULL)
{
return;
}
if(self->_type == HEAP_MAX)
{ {
while(1) while(1)
{ {
@ -147,7 +159,7 @@ static void heap_fixed_down(struct _heap* self, int i)
i = max; i = max;
} }
} }
else else /* if(self->_type == HEAP_MIN) */
{ {
while(1) while(1)
{ {
@ -192,12 +204,6 @@ static bool heap_pop(struct _heap* self, void* obj)
return true; return true;
} }
static void heap_setmin(struct _heap* self, bool min_flag)
{
assert(self != NULL);
self->_min_flag = min_flag;
}
static uint32_t heap_size(struct _heap* self) static uint32_t heap_size(struct _heap* self)
{ {
assert(self != NULL); assert(self != NULL);
@ -243,46 +249,124 @@ 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);
// 1. set attr // -------------------- private --------------------
self->_obj_size = obj_size; self->_obj_size = obj_size;
self->_size = 0; self->_size = 0;
self->_capacity = capacity; self->_capacity = capacity;
self->_ratio = 2; self->_ratio = 2;
self->peek = heap_peek;
self->push = heap_push;
self->pop = heap_pop;
self->size = heap_size;
self->empty = heap_empty;
self->clear = heap_clear;
self->destory = heap_destory;
self->setmin = heap_setmin;
self->print = heap_print;
self->obj = (void*)malloc(self->_capacity * self->_obj_size); self->obj = (void*)malloc(self->_capacity * self->_obj_size);
if(self->obj == NULL) if(self->obj == NULL)
{ {
return false; return false;
} }
self->_iter.hasnext = heap_iter_hasnext;
self->_iter.next = heap_iter_next;
self->_destory = heap_destory;
// -------------------- public --------------------
// kernel
self->peek = heap_peek;
self->push = heap_push;
self->pop = heap_pop;
self->empty = heap_empty;
// base
self->size = heap_size;
self->clear = heap_clear;
// iter
self->iter = heap_iter;
// config
self->compare = NULL;
// -------------------- debug --------------------
self->print = heap_print;
return true; return true;
} }
heap_t heap_new2(uint32_t obj_size, uint32_t capacity) heap_t heap_max_new2(uint32_t obj_size, uint32_t capacity)
{ {
heap_t heap = NULL; heap_t heap = NULL;
heap = (struct _heap*)malloc(sizeof(struct _heap)); heap = (struct _heap*)malloc(sizeof(struct _heap));
if(heap != NULL) if(heap == NULL)
{ {
if(heap_init2(heap, obj_size, capacity) != true) return NULL;
{
free(heap);
heap = NULL;
}
} }
if(heap_init2(heap, obj_size, capacity) != true)
{
free(heap);
return NULL;
}
heap->_type = HEAP_MAX;
return heap;
}
heap_t heap_min_new2(uint32_t obj_size, uint32_t capacity)
{
heap_t heap = NULL;
heap = (struct _heap*)malloc(sizeof(struct _heap));
if(heap == NULL)
{
return NULL;
}
if(heap_init2(heap, obj_size, capacity) != true)
{
free(heap);
return NULL;
}
heap->_type = HEAP_MIN;
return heap; return heap;
} }
@ -290,7 +374,7 @@ void heap_free(heap_t* heap)
{ {
if(*heap != NULL) if(*heap != NULL)
{ {
(*heap)->destory(*heap); (*heap)->_destory(*heap);
free(*heap); free(*heap);
} }
*heap = NULL; *heap = NULL;

View File

@ -179,29 +179,32 @@ static void list_print(struct _list* self)
} }
} }
static void* list_begin(struct _list* self) static const void* list_iter_next(struct _iterator* iter)
{ {
self->_cur = 0; list_t self = (list_t)iter->_parent;
return self->obj; void *obj = self->obj + self->_iter._cur * self->_obj_size;
} self->_iter._cur += 1;
static void* list_end(struct _list* self)
{
return (char*)self->obj + self->_size * self->_obj_size;
}
static void* list_next(struct _list* self)
{
void *obj = NULL;
// if add this, can't go to end
// if(self->_cur < self->_size - 1)
{
self->_cur += 1;
}
obj = (char*)self->obj + self->_cur * self->_obj_size;
return obj; return obj;
} }
static bool list_iter_hasnext(struct _iterator* iter)
{
list_t self = (list_t)iter->_parent;
if(self->_iter._cur < self->size(self))
{
return true;
}
return false;
}
iterator_t list_iter(struct _list* self)
{
self->_iter._parent = self;
self->_iter._cur = 0;
return &self->_iter;
}
static bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity) static bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity)
{ {
assert(list != NULL); assert(list != NULL);
@ -212,41 +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;
list->begin = list_begin;
list->next = list_next;
list->end = list_end;
// 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;
} }
@ -254,13 +267,15 @@ list_t list_new2(uint32_t obj_size, uint32_t capacity)
{ {
struct _list* list = NULL; struct _list* list = NULL;
list = (struct _list*)calloc(1, sizeof(struct _list)); list = (struct _list*)calloc(1, sizeof(struct _list));
if(list != NULL) if(list == NULL)
{ {
if(list_init2(list, obj_size, capacity) != true) return NULL;
{ }
free(list);
list = NULL; if(list_init2(list, obj_size, capacity) != true)
} {
free(list);
return NULL;
} }
return list; return list;
} }
@ -270,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;

View File

@ -306,6 +306,65 @@ static void queue2_print(struct _queue* self)
} }
} }
static iterator_t queue_iter(struct _queue* self)
{
assert(self != NULL);
iterator_t iter = &self->_iter;
iter->_parent = self;
iter->_cur = 0;
iter->_cur_node = self->_front;
return iter;
}
static bool queue_iter_hasnext(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
queue_t self = (queue_t)iter->_parent;
if(iter->_cur < self->size(self))
{
return true;
}
return false;
}
static const void* queue_iter_next(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
queue_t self = (queue_t)iter->_parent;
void *obj = NULL;
// base on linklist
struct _queue_node * node = (struct _queue_node *)iter->_cur_node;
if(node != NULL)
{
obj = node->obj;
iter->_cur_node = node->next;
}
self->_iter._cur += 1;
return obj;
}
static const void* queue2_iter_next(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
queue_t self = (queue_t)iter->_parent;
void *obj = NULL;
// base on array
uint32_t index = self->_iter._cur;
obj = self->_front->obj + self->_obj_size * index;
self->_iter._cur += 1;
return obj;
}
static bool queue_init(struct _queue * self, uint32_t obj_size) static bool queue_init(struct _queue * self, uint32_t obj_size)
{ {
assert(self != NULL); assert(self != NULL);
@ -315,32 +374,43 @@ static bool queue_init(struct _queue * self, uint32_t obj_size)
return false; return false;
} }
// attribute init // -------------------- private --------------------
self->_size = 0; self->_size = 0;
self->_obj_size = obj_size; self->_obj_size = obj_size;
self->_capacity = UINT32_MAX; self->_capacity = UINT32_MAX;
self->_ratio = 1; self->_ratio = 1;
// function init // front & back pointer init
self->push = queue_push;
self->pop = queue_pop;
self->back = queue_back;
self->front = queue_front;
self->clear = queue_clear;
self->empty = queue_empty;
self->full = queue_full;
self->size = queue_size;
self->capacity = queue_capacity;
self->destory = queue_destory;
self->print = queue_print;
// init front & back
self->_front = NULL; self->_front = NULL;
self->_back = NULL; self->_back = NULL;
// base
self->_destory = queue_destory;
// iter
self->_iter.hasnext = queue_iter_hasnext;
self->_iter.next = queue_iter_next;
// -------------------- public --------------------
// kernel
self->push = queue_push;
self->pop = queue_pop;
self->back = queue_back;
self->front = queue_front;
self->empty = queue_empty;
self->full = queue_full;
// base
self->size = queue_size;
self->capacity = queue_capacity;
self->clear = queue_clear;
// iter
self->iter = queue_iter;
// -------------------- debug --------------------
self->print = queue_print;
return true; return true;
} }
@ -354,51 +424,59 @@ static bool queue_init2(struct _queue * self, uint32_t obj_size, uint32_t capaci
return false; return false;
} }
// attribute init // -------------------- private --------------------
self->_size = 0; self->_size = 0;
self->_obj_size = obj_size; self->_obj_size = obj_size;
self->_capacity = capacity; self->_capacity = capacity;
self->_ratio = 2; self->_ratio = 2;
// function init
self->push = queue2_push;
self->pop = queue2_pop;
self->back = queue2_back;
self->front = queue2_front;
self->clear = queue2_clear;
self->empty = queue_empty;
self->full = queue_full;
self->size = queue_size;
self->capacity = queue_capacity;
self->destory = queue2_destory;
self->print = queue2_print;
// init front & back
self->_front = (struct _queue_node *)malloc(sizeof(struct _queue_node)); self->_front = (struct _queue_node *)malloc(sizeof(struct _queue_node));
if(self->_front == NULL) if(self->_front == NULL)
{ {
goto done; return false;
} }
self->_back = self->_front; self->_back = self->_front;
// use self->_front->obj as obj_array // use self->_front->obj as obj_array
//
// self->_front->obj = calloc(self->_capacity, self->_obj_size); // self->_front->obj = calloc(self->_capacity, self->_obj_size);
self->_front->obj = malloc(self->_capacity * self->_obj_size); self->_front->obj = malloc(self->_capacity * self->_obj_size);
if(self->_front->obj == NULL) if(self->_front->obj == NULL)
{ {
goto done1; free(self->_front);
return false;
} }
self->_index_front = 0; self->_index_front = 0;
self->_index_back = 0; self->_index_back = 0;
//
self->_destory = queue2_destory;
// iter
self->_iter.hasnext = queue_iter_hasnext;
self->_iter.next = queue2_iter_next;
// -------------------- public --------------------
// kernel
self->push = queue2_push;
self->pop = queue2_pop;
self->back = queue2_back;
self->front = queue2_front;
self->empty = queue_empty;
self->full = queue_full;
// base
self->size = queue_size;
self->capacity = queue_capacity;
self->clear = queue2_clear;
// iter
self->iter = queue_iter;
// -------------------- debug --------------------
self->print = queue2_print;
return true; return true;
done1:
free(self->_front);
done:
return false;
} }
/** /**
@ -413,13 +491,15 @@ queue_t queue_new(uint32_t obj_size)
{ {
struct _queue * queue = NULL; struct _queue * queue = NULL;
queue = (struct _queue *)calloc(1, sizeof(struct _queue)); queue = (struct _queue *)calloc(1, sizeof(struct _queue));
if(queue != NULL) if(queue == NULL)
{ {
if(queue_init(queue, obj_size) == false) return NULL;
{ }
free(queue);
queue = NULL; if(queue_init(queue, obj_size) != true)
} {
free(queue);
return NULL;
} }
return queue; return queue;
} }
@ -437,13 +517,15 @@ queue_t queue_new2(uint32_t obj_size, uint32_t capacity)
{ {
struct _queue * queue = NULL; struct _queue * queue = NULL;
queue = (struct _queue *)calloc(1, sizeof(struct _queue)); queue = (struct _queue *)calloc(1, sizeof(struct _queue));
if(queue != NULL) if(queue == NULL)
{ {
if(queue_init2(queue, obj_size, capacity) == false) return NULL;
{ }
free(queue);
queue = NULL; if(queue_init2(queue, obj_size, capacity) != true)
} {
free(queue);
return NULL;
} }
return queue; return queue;
} }
@ -459,9 +541,9 @@ void queue_free(queue_t* queue)
assert(queue != NULL); assert(queue != NULL);
if(queue != NULL && *queue != NULL) if(queue != NULL && *queue != NULL)
{ {
if((*queue)->destory != NULL) if((*queue)->_destory != NULL)
{ {
(*queue)->destory(*queue); (*queue)->_destory(*queue);
} }
free(*queue); free(*queue);
*queue = NULL; *queue = NULL;

View File

@ -124,6 +124,7 @@ static uint32_t stack_capacity(struct _stack* self)
static bool stack_clear(struct _stack* self) static bool stack_clear(struct _stack* self)
{ {
assert(self != NULL); assert(self != NULL);
assert(self->_head != NULL);
if (self->empty(self)) if (self->empty(self))
{ {
return true; return true;
@ -253,40 +254,80 @@ static void stack2_print(struct _stack* self)
} }
} }
/**
* @brief iterator next
* from top to bottom
*
* @param iter
* @return const void*
* the value of return is const, so you can't modify it.
*/
const void* stack_iter_next(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
stack_t self = (stack_t)iter->_parent;
void *obj = NULL;
if(self->_head->obj == NULL)
{
// base on linklist
struct _stack_node* node = (struct _stack_node *)self->_iter._cur_node;
if(node != NULL)
{
obj = node->obj;
self->_iter._cur_node = node->next;
}
}
else
{
// base on array
uint32_t index = self->size(self) - 1 - self->_iter._cur;
obj = self->_head->obj + self->_obj_size * index;
}
self->_iter._cur += 1;
return obj;
}
bool stack_iter_hasnext(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
stack_t self = (stack_t)iter->_parent;
if(self->_iter._cur < self->size(self))
{
return true;
}
return false;
}
iterator_t stack_iter(struct _stack* self)
{
assert(self != NULL);
self->_iter._parent = self;
self->_iter._cur = 0;
self->_iter._cur_node = self->_head->next;
return &self->_iter;
}
static bool stack_init(struct _stack* self, uint32_t obj_size) static bool stack_init(struct _stack* self, uint32_t obj_size)
{ {
assert(self != NULL); // assert(self != NULL);
assert(obj_size != 0); // assert(obj_size != 0);
if(self == NULL || obj_size == 0) if(self == NULL || obj_size == 0)
{ {
return false; return false;
} }
// 1. set attr // ---------- private ----------
self->_obj_size = obj_size; self->_obj_size = obj_size;
self->_size = 0; self->_size = 0;
self->_capacity = UINT32_MAX; self->_capacity = UINT32_MAX;
self->_ratio = 1; self->_ratio = 1;
// 2. set function
// kernel
self->push = stack_push;
self->pop = stack_pop;
self->peek = stack_peek;
// base
self->size = stack_size;
self->empty = stack_empty;
self->capacity = stack_capacity;
// clear and free node
self->clear = stack_clear;
self->destory = stack_destory;
// print
self->print = stack_print;
// 3. set node
self->_head = (struct _stack_node *)malloc(sizeof(struct _stack_node)); self->_head = (struct _stack_node *)malloc(sizeof(struct _stack_node));
if (self->_head == NULL) if (self->_head == NULL)
{ {
@ -295,51 +336,82 @@ static bool stack_init(struct _stack* self, uint32_t obj_size)
self->_head->obj = NULL; self->_head->obj = NULL;
self->_head->next = NULL; self->_head->next = NULL;
self->_iter.next = stack_iter_next;
self->_iter.hasnext = stack_iter_hasnext;
self->_destory = stack_destory;
// ---------- public ----------
// kernel
self->push = stack_push;
self->pop = stack_pop;
self->peek = stack_peek;
self->empty = stack_empty;
// base
self->size = stack_size;
self->capacity = stack_capacity;
self->clear = stack_clear;
// iter
self->iter = stack_iter;
// ---------- debug ----------
self->print = stack_print;
return true; return true;
} }
static bool stack_init2(struct _stack* self, uint32_t obj_size, uint32_t capacity) static bool stack_init2(struct _stack* self, uint32_t obj_size, uint32_t capacity)
{ {
assert(self != NULL); // assert(self != NULL);
if(self == NULL || obj_size == 0 || capacity == 0)
{
return false;
}
// 1. set attr // ---------- private ----------
self->_obj_size = obj_size; self->_obj_size = obj_size;
self->_size = 0; self->_size = 0;
self->_capacity = capacity; self->_capacity = capacity;
self->_ratio = 2; self->_ratio = 2;
// 2. set function
// kernel
self->push = stack2_push;
self->pop = stack2_pop;
self->peek = stack2_peek;
// others
self->empty = stack_empty;
self->size = stack_size;
self->capacity = stack_capacity;
// clear and free node
self->clear = stack_clear;
self->destory = stack2_destory;
// print
self->print = stack2_print;
// 3. set node
self->_head = (struct _stack_node*)malloc(sizeof(struct _stack_node)); self->_head = (struct _stack_node*)malloc(sizeof(struct _stack_node));
if (self->_head == NULL) if (self->_head == NULL)
{ {
return false; return false;
} }
// self->_head->obj = NULL;
self->_head->next = NULL; self->_head->next = NULL;
// 4. set array
self->_head->obj = (void *)calloc(self->_capacity, self->_obj_size); self->_head->obj = (void *)calloc(self->_capacity, self->_obj_size);
if (self->_head->obj == NULL) if (self->_head->obj == NULL)
{ {
free(self->_head);
self->_head = NULL;
return false; return false;
} }
self->_iter.next = stack_iter_next;
self->_iter.hasnext = stack_iter_hasnext;
self->_destory = stack2_destory;
// ---------- public ----------
// kernel
self->push = stack2_push;
self->pop = stack2_pop;
self->peek = stack2_peek;
self->empty = stack_empty;
// base
self->size = stack_size;
self->capacity = stack_capacity;
self->clear = stack_clear;
// iter
self->iter = stack_iter;
// ---------- debug ----------
self->print = stack2_print;
return true; return true;
} }
@ -347,13 +419,15 @@ stack_t stack_new(uint32_t obj_size)
{ {
stack_t stack = NULL; stack_t stack = NULL;
stack = (struct _stack*)calloc(1, sizeof(struct _stack)); stack = (struct _stack*)calloc(1, sizeof(struct _stack));
if (stack != NULL) if(stack == NULL)
{ {
if(stack_init(stack, obj_size) != true) return NULL;
{ }
free(stack);
stack = NULL; if(stack_init(stack, obj_size) != true)
} {
free(stack);
return NULL;
} }
return stack; return stack;
} }
@ -362,13 +436,15 @@ stack_t stack_new2(uint32_t obj_size, uint32_t capacity)
{ {
stack_t stack = NULL; stack_t stack = NULL;
stack = (struct _stack*)calloc(1, sizeof(struct _stack)); stack = (struct _stack*)calloc(1, sizeof(struct _stack));
if (stack != NULL) if (stack == NULL)
{ {
if(stack_init2(stack, obj_size, capacity) != true) return NULL;
{ }
free(stack);
stack = NULL; if(stack_init2(stack, obj_size, capacity) != true)
} {
free(stack);
return NULL;
} }
return stack; return stack;
} }
@ -378,9 +454,9 @@ void stack_free(stack_t *stack)
assert(stack != NULL); assert(stack != NULL);
if(stack != NULL && *stack != NULL) if(stack != NULL && *stack != NULL)
{ {
if((*stack)->destory != NULL) if((*stack)->_destory != NULL)
{ {
(*stack)->destory(*stack); (*stack)->_destory(*stack);
} }
free(*stack); free(*stack);
*stack = NULL; *stack = NULL;

File diff suppressed because it is too large Load Diff

View File

@ -263,10 +263,61 @@ static void test_deque_struct(void)
TEST_ASSERT_NULL(deque); TEST_ASSERT_NULL(deque);
} }
static void test_deque_iter(void)
{
uint32_t i = 0;
int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
deque_t deque = deque_new(sizeof(int));
TEST_ASSERT_NOT_NULL(deque);
deque->print_obj = print_num;
for (i = 0; i < len; i++)
{
TEST_ASSERT_TRUE(deque->push_back(deque, &data[i]));
TEST_ASSERT_TRUE(deque->front(deque, &temp));
TEST_ASSERT_EQUAL_INT(data[0], temp);
TEST_ASSERT_TRUE(deque->back(deque, &temp));
TEST_ASSERT_EQUAL_INT(data[i], temp);
TEST_ASSERT_EQUAL_INT(i + 1, deque->size(deque));
}
iterator_t iter = deque->iter(deque);
i = 0;
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
// printf("%d ", temp);
TEST_ASSERT_EQUAL_INT(data[i], temp);
i++;
}
iter = deque->iter(deque);
i = 0;
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
// printf("%d ", temp);
TEST_ASSERT_EQUAL_INT(data[i], temp);
i++;
}
deque_free(&deque);
TEST_ASSERT_NULL(deque);
}
void test_deque(void) void test_deque(void)
{ {
UnitySetTestFile(__FILE__); UnitySetTestFile(__FILE__);
RUN_TEST(test_deque_num); RUN_TEST(test_deque_num);
RUN_TEST(test_deque_struct); RUN_TEST(test_deque_struct);
RUN_TEST(test_deque_iter);
} }

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};
@ -46,24 +46,21 @@ static void test_heap_num(void)
int temp = 0; int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]); uint32_t len = sizeof(data) / sizeof(data[0]);
heap_t heap = heap_new2(sizeof(int), 64); heap_t heap = heap_min_new2(sizeof(int), 64);
TEST_ASSERT_NOT_NULL(heap); TEST_ASSERT_NOT_NULL(heap);
heap->print_obj = print_num; heap->print_obj = print_num;
heap->compare = compare_num; heap->compare = compare_num;
// default: maxheap
// maxheap or minheap
heap->setmin(heap, true);
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
{ {
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++)
@ -83,17 +80,23 @@ 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]);
heap_t heap = heap_new2(sizeof(struct _student), 64); heap_t heap = heap_min_new2(sizeof(struct _student), 64);
TEST_ASSERT_NOT_NULL(heap); TEST_ASSERT_NOT_NULL(heap);
heap->print_obj = print_struct; heap->print_obj = print_struct;
heap->compare = compare_struct; heap->compare = compare_struct;
@ -103,12 +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));
@ -129,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

@ -284,6 +284,7 @@ static void test_list_struct(void)
TEST_ASSERT_NULL(list); TEST_ASSERT_NULL(list);
} }
#if 0
static void test_list_iter(void) static void test_list_iter(void)
{ {
int temp = 0; int temp = 0;
@ -327,6 +328,45 @@ static void test_list_iter(void)
TEST_ASSERT_TRUE(list->clear(list)); TEST_ASSERT_TRUE(list->clear(list));
list_free(&list); list_free(&list);
} }
#else
void test_list_iter(void)
{
int temp = 0;
int data[] = { 1,2,3,4,5,6,7,8,9,10 };
uint32_t len = sizeof(data) / sizeof(data[0]);
uint32_t i = 0;
list_t list = NULL;
// ------------------------------
list = list_new2(sizeof(int), len);
TEST_ASSERT_TRUE(list->empty(list));
list->print_obj = print_num;
for(i = 0; i < len; i++)
{
TEST_ASSERT_TRUE(list->append(list, &data[i]));
TEST_ASSERT_EQUAL_INT(i + 1, list->size(list));
TEST_ASSERT_TRUE(list->get(list, i, &temp));
TEST_ASSERT_EQUAL_INT(data[i], temp);
TEST_ASSERT_FALSE(list->empty(list));
}
iterator_t iter = list->iter(list);
int iter_data = 0;
int idx = 0;
while(iter->hasnext(iter))
{
iter_data = *(int*)iter->next(iter);
// printf("%d ", iter_data);
TEST_ASSERT_EQUAL_INT(data[idx], iter_data);
idx++;
}
list_free(&list);
}
#endif
void test_list(void) void test_list(void)
{ {

View File

@ -586,6 +586,84 @@ static void test_queue2_struct(void)
TEST_ASSERT_NULL(queue); TEST_ASSERT_NULL(queue);
} }
static void test_queue_iter(void)
{
uint32_t i = 0;
int data[] = { 1,2,3,4,5,6,7,8,9,10 };
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
queue_t queue = NULL;
queue = queue_new(sizeof(int));
TEST_ASSERT_NOT_NULL(queue);
queue->print_obj = print_num;
for (i = 0; i < len; i++)
{
TEST_ASSERT_TRUE(queue->push(queue, &data[i]));
TEST_ASSERT_EQUAL_INT(i + 1, queue->size(queue));
TEST_ASSERT_TRUE(queue->front(queue, &temp));
TEST_ASSERT_EQUAL_INT(data[0], temp);
TEST_ASSERT_TRUE(queue->back(queue, &temp));
TEST_ASSERT_EQUAL_INT(data[i], temp);
}
iterator_t iter = queue->iter(queue);
i = 0;
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
// printf("%d ", temp);
TEST_ASSERT_EQUAL_INT(data[i], temp);
i++;
}
queue_free(&queue);
TEST_ASSERT_NULL(queue);
}
static void test_queue2_iter(void)
{
uint32_t i = 0;
int data[] = { 1,2,3,4,5,6,7,8,9,10 };
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
uint32_t capacity = len;
queue_t queue = NULL;
queue = queue_new2(sizeof(int), capacity);
TEST_ASSERT_NOT_NULL(queue);
queue->print_obj = print_num;
for (i = 0; i < len; i++)
{
TEST_ASSERT_TRUE(queue->push(queue, &data[i]));
TEST_ASSERT_EQUAL_INT(i + 1, queue->size(queue));
TEST_ASSERT_TRUE(queue->front(queue, &temp));
TEST_ASSERT_EQUAL_INT(data[0], temp);
TEST_ASSERT_TRUE(queue->back(queue, &temp));
TEST_ASSERT_EQUAL_INT(data[i], temp);
}
iterator_t iter = queue->iter(queue);
i = 0;
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
TEST_ASSERT_EQUAL_INT(data[i], temp);
i++;
}
queue_free(&queue);
TEST_ASSERT_NULL(queue);
}
void test_queue(void) void test_queue(void)
{ {
UnitySetTestFile(__FILE__); UnitySetTestFile(__FILE__);
@ -600,4 +678,7 @@ void test_queue(void)
RUN_TEST(test_queue2_num); RUN_TEST(test_queue2_num);
RUN_TEST(test_queue2_struct); RUN_TEST(test_queue2_struct);
RUN_TEST(test_queue_iter);
RUN_TEST(test_queue2_iter);
} }

View File

@ -440,6 +440,82 @@ static void test_stack2_struct(void)
TEST_ASSERT_NULL(stack); TEST_ASSERT_NULL(stack);
} }
static void test_stack_iter(void)
{
uint32_t i = 0;
int data[] = { 1,2,3,4,5,6,7,8,9,10 };
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
stack_t stack = NULL;
stack = stack_new(sizeof(int));
TEST_ASSERT_NOT_NULL(stack);
stack->print_obj = print_num;
TEST_ASSERT_FALSE(stack->peek(stack, &temp));
TEST_ASSERT_TRUE(stack->clear(stack));
for (i = 0; i < len; i++)
{
TEST_ASSERT_TRUE(stack->push(stack, &data[i]));
TEST_ASSERT_EQUAL_INT(i + 1, stack->size(stack));
TEST_ASSERT_TRUE(stack->peek(stack, &temp));
TEST_ASSERT_EQUAL_INT(data[i], temp);
}
iterator_t iter = stack->iter(stack);
TEST_ASSERT_NOT_NULL(iter);
i = 0;
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
// printf("%d ", temp);
TEST_ASSERT_EQUAL_INT(data[len - 1 - i], temp);
i++;
}
stack_free(&stack);
TEST_ASSERT_NULL(stack);
}
static void test_stack2_iter(void)
{
uint32_t i = 0;
int data[] = { 1,2,3,4,5,6,7,8,9,10 };
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
uint32_t capacity = len;
stack_t stack = NULL;
stack = stack_new2(sizeof(int), capacity);
TEST_ASSERT_NOT_NULL(stack);
stack->print_obj = print_num;
TEST_ASSERT_FALSE(stack->peek(stack, &temp));
TEST_ASSERT_TRUE(stack->clear(stack));
for (i = 0; i < len; i++)
{
TEST_ASSERT_TRUE(stack->push(stack, &data[i]));
TEST_ASSERT_EQUAL_INT(i + 1, stack->size(stack));
TEST_ASSERT_TRUE(stack->peek(stack, &temp));
TEST_ASSERT_EQUAL_INT(data[i], temp);
}
iterator_t iter = stack->iter(stack);
TEST_ASSERT_NOT_NULL(iter);
i = 0;
while(iter->hasnext(iter))
{
temp = *(int *)iter->next(iter);
// printf("%d ", temp);
TEST_ASSERT_EQUAL_INT(data[len - 1 - i], temp);
i++;
}
stack_free(&stack);
TEST_ASSERT_NULL(stack);
}
void test_stack(void) void test_stack(void)
{ {
UnitySetTestFile(__FILE__); UnitySetTestFile(__FILE__);
@ -454,4 +530,7 @@ void test_stack(void)
RUN_TEST(test_stack2_num); RUN_TEST(test_stack2_num);
RUN_TEST(test_stack2_struct); RUN_TEST(test_stack2_struct);
RUN_TEST(test_stack_iter);
RUN_TEST(test_stack2_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);
} }