mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-07-06 00:46:52 +08:00
Compare commits
No commits in common. "08ba5296bef914a1556ad69cd319d48ddb4ab22a" and "23fc67cb490f790ab6a8ef3e49e98ae05772be7b" have entirely different histories.
08ba5296be
...
23fc67cb49
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@ -24,8 +24,6 @@
|
||||
"unity_internals.h": "c",
|
||||
"stdarg.h": "c",
|
||||
"graph.h": "c",
|
||||
"unicstl_config.h": "c",
|
||||
"iter.h": "c",
|
||||
"iterator.h": "c"
|
||||
"unicstl_config.h": "c"
|
||||
}
|
||||
}
|
@ -3,7 +3,7 @@
|
||||
cmake_minimum_required(VERSION 3.29)
|
||||
|
||||
# 0. 项目信息
|
||||
project(demo VERSION 0.0.02)
|
||||
project(demo VERSION 0.0.01)
|
||||
|
||||
# 2. 支持GDB
|
||||
set(CMAKE_BUILD_TYPE "Debug")
|
||||
|
57
README.md
57
README.md
@ -7,7 +7,7 @@
|
||||
|
||||
> 标准:--std=c99
|
||||
|
||||
[数据结构详细说明](https://blog.wenjianfeng.top)
|
||||
[数据结构详细说明](http://wenjianfeng.top)
|
||||
|
||||
## 数据结构
|
||||
|数据结构 | 原理 |说明 |
|
||||
@ -45,54 +45,7 @@
|
||||
**【A1】** 若链表的操作流程为,先查找元素再删除元素。那么时间复杂度确实是$O(n)$。但是链表的增删优势,在其他应用有体现。比如双向队列,插入和删除效率都为$O(1)$。
|
||||
|
||||
|
||||
## 规范
|
||||
### 版本说明
|
||||
|
||||
| 命名 |版本说明 | 范围 | 更新说明 |
|
||||
|:----: |:----:|:----:|:----:|
|
||||
| `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
|
||||
## 版本
|
||||
| 版本 | 说明 |
|
||||
|:----:|:----:|
|
||||
| 0.xx.xx | 测试版本 |
|
||||
|
@ -20,10 +20,14 @@ void demo_heap_num(void)
|
||||
int temp = 0;
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
|
||||
heap_t heap = heap_min_new2(sizeof(int), 64);
|
||||
heap_t heap = heap_new2(sizeof(int), 64);
|
||||
heap->print_obj = print_num;
|
||||
heap->compare = compare_num;
|
||||
|
||||
// default: maxheap
|
||||
// maxheap or minheap
|
||||
heap->setmin(heap, true);
|
||||
|
||||
printf("\n\n----- demo_heap_num -----\n");
|
||||
|
||||
printf("----- push -----\n");
|
||||
@ -86,7 +90,7 @@ static void demo_heap_struct(void)
|
||||
struct _student temp = {0};
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
|
||||
heap_t heap = heap_min_new2(sizeof(struct _student), 64);
|
||||
heap_t heap = heap_new2(sizeof(struct _student), 64);
|
||||
heap->print_obj = print_struct;
|
||||
heap->compare = compare_struct;
|
||||
|
||||
|
@ -200,7 +200,7 @@ static void demo_stack_struct(void)
|
||||
}
|
||||
}
|
||||
|
||||
stack->_destory(stack);
|
||||
stack->destory(stack);
|
||||
stack_free(&stack);
|
||||
}
|
||||
|
||||
|
265
demo/demo_tree.c
265
demo/demo_tree.c
@ -35,9 +35,8 @@ void demo_avltree_num(void)
|
||||
// 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 };
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
int temp = 0;
|
||||
iterator_t iter = NULL;
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
|
||||
tree_t tree = tree_avl_new(sizeof(int));
|
||||
tree->print_obj = print_num;
|
||||
@ -54,13 +53,7 @@ void demo_avltree_num(void)
|
||||
printf("insert = ");
|
||||
tree->print_obj(&temp);
|
||||
printf("size = %2d : ", tree->size(tree));
|
||||
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
@ -88,85 +81,45 @@ void demo_avltree_num(void)
|
||||
}
|
||||
|
||||
printf("----- preorder -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- inorder -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_IN);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->inorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- postorder -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_POST);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->postorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- breadth -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_BREADTH);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->breadth(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- right priority -----\n");
|
||||
tree->order(tree, true);
|
||||
|
||||
printf("----- preorder(right) -----\n");
|
||||
iter = tree->iter(tree, ORDER_RIGHT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- inorder(right) -----\n");
|
||||
iter = tree->iter(tree, ORDER_RIGHT_IN);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->inorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- postorder(right) -----\n");
|
||||
iter = tree->iter(tree, ORDER_RIGHT_POST);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->postorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- breadth(right) -----\n");
|
||||
iter = tree->iter(tree, ORDER_RIGHT_BREADTH);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->breadth(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
|
||||
printf("----- preorder(left) -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
printf("----- left priority -----\n");
|
||||
tree->order(tree, false);
|
||||
printf("----- preorder -----\n");
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
@ -178,13 +131,7 @@ void demo_avltree_num(void)
|
||||
printf("delete = ");
|
||||
tree->print_obj(&temp);
|
||||
printf("size = %2d : ", tree->size(tree));
|
||||
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
@ -259,9 +206,8 @@ void demo_rbtree_num(void)
|
||||
// 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 };
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
int temp = 0;
|
||||
iterator_t iter = NULL;
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
|
||||
tree_t tree = tree_rb_new(sizeof(int));
|
||||
tree->print_obj = print_num;
|
||||
@ -278,13 +224,7 @@ void demo_rbtree_num(void)
|
||||
printf("insert = ");
|
||||
tree->print_obj(&temp);
|
||||
printf("size = %2d : ", tree->size(tree));
|
||||
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
if(true != tree_rb_check(tree))
|
||||
@ -318,84 +258,45 @@ void demo_rbtree_num(void)
|
||||
}
|
||||
|
||||
printf("----- preorder -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- inorder -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_IN);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->inorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- postorder -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_POST);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->postorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- breadth -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_BREADTH);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->breadth(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- right priority -----\n");
|
||||
tree->order(tree, true);
|
||||
|
||||
printf("----- preorder(right) -----\n");
|
||||
iter = tree->iter(tree, ORDER_RIGHT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- inorder(right) -----\n");
|
||||
iter = tree->iter(tree, ORDER_RIGHT_IN);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->inorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- postorder(right) -----\n");
|
||||
iter = tree->iter(tree, ORDER_RIGHT_POST);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->postorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- breadth(right) -----\n");
|
||||
iter = tree->iter(tree, ORDER_RIGHT_BREADTH);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->breadth(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
#if 1
|
||||
printf("----- left priority -----\n");
|
||||
tree->order(tree, false);
|
||||
printf("----- preorder -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
@ -408,13 +309,7 @@ void demo_rbtree_num(void)
|
||||
tree->delete(tree, &temp);
|
||||
|
||||
printf("size = %2d : ", tree->size(tree));
|
||||
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(int *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
if(true != tree_rb_check(tree))
|
||||
@ -428,6 +323,7 @@ void demo_rbtree_num(void)
|
||||
{
|
||||
printf("----- empty -----\n");
|
||||
}
|
||||
#endif
|
||||
tree_free(&tree);
|
||||
}
|
||||
|
||||
@ -443,7 +339,6 @@ void demo_rbtree_struct(void)
|
||||
};
|
||||
struct _student temp = {0};
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
iterator_t iter = NULL;
|
||||
|
||||
tree_t tree = tree_rb_new(sizeof(struct _student));
|
||||
tree->print_obj = print_struct;
|
||||
@ -460,13 +355,7 @@ void demo_rbtree_struct(void)
|
||||
printf("insert = ");
|
||||
tree->print_obj(&temp);
|
||||
printf("size = %2d : ", tree->size(tree));
|
||||
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(struct _student *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
if(true != tree_rb_check(tree))
|
||||
@ -500,84 +389,45 @@ void demo_rbtree_struct(void)
|
||||
}
|
||||
|
||||
printf("----- preorder -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(struct _student *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- inorder -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_IN);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(struct _student *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->inorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- postorder -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_POST);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(struct _student *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->postorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- breadth -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_BREADTH);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(struct _student *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->breadth(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- right priority -----\n");
|
||||
tree->order(tree, true);
|
||||
|
||||
printf("----- preorder(right) -----\n");
|
||||
iter = tree->iter(tree, ORDER_RIGHT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(struct _student *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- inorder(right) -----\n");
|
||||
iter = tree->iter(tree, ORDER_RIGHT_IN);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(struct _student *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->inorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- postorder(right) -----\n");
|
||||
iter = tree->iter(tree, ORDER_RIGHT_POST);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(struct _student *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->postorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
printf("----- breadth(right) -----\n");
|
||||
iter = tree->iter(tree, ORDER_RIGHT_BREADTH);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(struct _student *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->breadth(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
#if 1
|
||||
printf("----- left priority -----\n");
|
||||
tree->order(tree, false);
|
||||
printf("----- preorder -----\n");
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(struct _student *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
@ -590,13 +440,7 @@ void demo_rbtree_struct(void)
|
||||
tree->delete(tree, &temp);
|
||||
|
||||
printf("size = %2d : ", tree->size(tree));
|
||||
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
temp = *(struct _student *)iter->next(iter);
|
||||
tree->print_obj(&temp);
|
||||
}
|
||||
tree->preorder(tree, tree->_root);
|
||||
printf("\n");
|
||||
|
||||
if(true != tree_rb_check(tree))
|
||||
@ -610,6 +454,7 @@ void demo_rbtree_struct(void)
|
||||
{
|
||||
printf("----- empty -----\n");
|
||||
}
|
||||
#endif
|
||||
tree_free(&tree);
|
||||
}
|
||||
|
||||
|
@ -11,11 +11,9 @@
|
||||
#ifndef _COMMON_H_
|
||||
#define _COMMON_H_
|
||||
|
||||
#define UNICSTL_CONFIG
|
||||
|
||||
#ifdef UNICSTL_CONFIG
|
||||
// #ifdef UNICSTL_CONFIG
|
||||
#include "unicstl_config.h"
|
||||
#endif
|
||||
// #endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
@ -25,18 +23,4 @@
|
||||
#include <limits.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_
|
||||
|
@ -22,7 +22,6 @@ struct _deque_node
|
||||
|
||||
struct _deque
|
||||
{
|
||||
// -------------------- private --------------------
|
||||
struct _deque_node* _head;
|
||||
struct _deque_node* _tail;
|
||||
|
||||
@ -31,11 +30,6 @@ struct _deque
|
||||
// uint32_t _capacity;
|
||||
// uint32_t _ratio;
|
||||
|
||||
struct _iterator _iter;
|
||||
|
||||
void (*_destory)(struct _deque* self);
|
||||
|
||||
// -------------------- public --------------------
|
||||
// kernel
|
||||
bool (*push_back)(struct _deque* self, void* obj);
|
||||
bool (*push_front)(struct _deque* self, void* obj);
|
||||
@ -43,30 +37,30 @@ struct _deque
|
||||
bool (*pop_front)(struct _deque* self, void* obj);
|
||||
bool (*back)(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 (*erase)(struct _deque* self, int index, void* obj);
|
||||
|
||||
int (*index)(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 (*set)(struct _deque* self, int index, void* obj);
|
||||
|
||||
// compare
|
||||
// int (*compare)(void* obj, void* obj2);
|
||||
// bool (*sort)(struct _deque* self, uint8_t reserve);
|
||||
// size
|
||||
uint32_t(*size)(struct _deque* self);
|
||||
bool (*empty)(struct _deque* self);
|
||||
|
||||
// -------------------- debug --------------------
|
||||
// free
|
||||
void (*destory)(struct _deque* self);
|
||||
|
||||
// compare
|
||||
int (*cmp)(void* obj, void* obj2);
|
||||
bool (*sort)(struct _deque* self, uint8_t reserve);
|
||||
|
||||
// print
|
||||
void (*print)(struct _deque* self);
|
||||
void (*print_obj)(void* obj);
|
||||
};
|
||||
|
@ -1,66 +1,64 @@
|
||||
/**
|
||||
* @file heap.h
|
||||
* @author wenjf (Orig5826@163.com)
|
||||
* @brief
|
||||
* @brief
|
||||
* @version 0.1
|
||||
* @date 2024-07-03
|
||||
*
|
||||
*
|
||||
* @copyright Copyright (c) 2024
|
||||
*
|
||||
*
|
||||
*/
|
||||
#ifndef _HEAP_H_
|
||||
#define _HEAP_H_
|
||||
|
||||
#include "common.h"
|
||||
|
||||
typedef enum
|
||||
{
|
||||
HEAP_MIN = 0,
|
||||
HEAP_MAX = 1,
|
||||
}heap_type;
|
||||
|
||||
struct _heap
|
||||
{
|
||||
// -------------------- private --------------------
|
||||
void* obj;
|
||||
void * obj;
|
||||
|
||||
uint32_t _size;
|
||||
uint32_t _obj_size;
|
||||
uint32_t _capacity;
|
||||
uint32_t _ratio;
|
||||
|
||||
heap_type _type;
|
||||
struct _iterator _iter;
|
||||
bool _min_flag;
|
||||
|
||||
void (*_destory)(struct _heap* self);
|
||||
|
||||
// -------------------- public --------------------
|
||||
// kernel
|
||||
bool (*peek)(struct _heap* self, void* obj);
|
||||
bool (*push)(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
|
||||
uint32_t(*size)(struct _heap* self);
|
||||
bool (*clear)(struct _heap* self);
|
||||
bool (*empty)(struct _heap* self);
|
||||
|
||||
// iter
|
||||
iterator_t (*iter)(struct _heap* self);
|
||||
|
||||
// config
|
||||
compare_fun_t compare; // !!! you have to implement this function
|
||||
|
||||
// -------------------- debug --------------------
|
||||
/**
|
||||
* @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);
|
||||
void (*destory)(struct _heap* self);
|
||||
|
||||
// print
|
||||
void (*print)(struct _heap* self);
|
||||
void (*print_obj)(void* obj);
|
||||
};
|
||||
typedef struct _heap* heap_t;
|
||||
|
||||
// create and free heap
|
||||
heap_t heap_max_new2(uint32_t obj_size, uint32_t capacity);
|
||||
heap_t heap_min_new2(uint32_t obj_size, uint32_t capacity);
|
||||
heap_t heap_new2(uint32_t obj_size, uint32_t capacity);
|
||||
|
||||
void heap_free(heap_t* heap);
|
||||
|
||||
|
||||
#endif // _HEAP_H_
|
||||
|
@ -1,29 +0,0 @@
|
||||
/**
|
||||
* @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_
|
@ -12,11 +12,9 @@
|
||||
#define _LIST_H_
|
||||
|
||||
#include "common.h"
|
||||
#include "iterator.h"
|
||||
|
||||
struct _list
|
||||
{
|
||||
// -------------------- private --------------------
|
||||
void * obj;
|
||||
|
||||
uint32_t _obj_size;
|
||||
@ -25,11 +23,6 @@ struct _list
|
||||
uint32_t _ratio;
|
||||
uint32_t _cur;
|
||||
|
||||
struct _iterator _iter;
|
||||
|
||||
void (*_destory)(struct _list* self);
|
||||
|
||||
// -------------------- public --------------------
|
||||
// kernel
|
||||
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.
|
||||
@ -41,25 +34,32 @@ struct _list
|
||||
bool (*get)(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
|
||||
uint32_t(*size)(struct _list* self);
|
||||
bool (*empty)(struct _list* self);
|
||||
bool (*clear)(struct _list* self);
|
||||
|
||||
// iter
|
||||
iterator_t (*iter)(struct _list* self);
|
||||
// clear and free node
|
||||
bool (*clear)(struct _list* self);
|
||||
void (*destory)(struct _list* self);
|
||||
|
||||
|
||||
// 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.
|
||||
The sort is in-place (i.e. the list itself is modified) and stable (i.e. the
|
||||
order of two equal elements is maintained).
|
||||
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));
|
||||
|
||||
// -------------------- debug --------------------
|
||||
// print
|
||||
void (*print)(struct _list* self);
|
||||
void (*print_obj)(void* obj);
|
||||
};
|
||||
|
@ -21,7 +21,6 @@ struct _queue_node
|
||||
|
||||
struct _queue
|
||||
{
|
||||
// -------------------- private --------------------
|
||||
struct _queue_node * _front;
|
||||
struct _queue_node * _back;
|
||||
|
||||
@ -33,28 +32,24 @@ struct _queue
|
||||
uint32_t _capacity;
|
||||
uint32_t _ratio;
|
||||
|
||||
struct _iterator _iter;
|
||||
|
||||
void (*_destory)(struct _queue* self);
|
||||
|
||||
// -------------------- public --------------------
|
||||
// kernel
|
||||
bool (*push)(struct _queue* self, void* obj);
|
||||
bool (*pop)(struct _queue* self, void* obj);
|
||||
|
||||
bool (*back)(struct _queue* self, void* obj);
|
||||
bool (*front)(struct _queue* self, void* obj);
|
||||
bool (*empty)(struct _queue* self);
|
||||
bool (*full)(struct _queue* self);
|
||||
|
||||
// base
|
||||
bool (*empty)(struct _queue* self);
|
||||
bool (*full)(struct _queue* self);
|
||||
uint32_t (*size)(struct _queue* self);
|
||||
uint32_t (*capacity)(struct _queue* self);
|
||||
bool (*clear)(struct _queue* self);
|
||||
|
||||
// iter
|
||||
iterator_t (*iter)(struct _queue* self);
|
||||
|
||||
// -------------------- debug --------------------
|
||||
// clear and free node
|
||||
bool (*clear)(struct _queue* self);
|
||||
void (*destory)(struct _queue* self);
|
||||
|
||||
// print
|
||||
void (*print)(struct _queue* self);
|
||||
void (*print_obj)(void* obj);
|
||||
};
|
||||
|
@ -21,12 +21,6 @@ struct _stack_node
|
||||
|
||||
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;
|
||||
|
||||
uint32_t _size;
|
||||
@ -34,26 +28,21 @@ struct _stack
|
||||
uint32_t _capacity;
|
||||
uint32_t _ratio;
|
||||
|
||||
struct _iterator _iter;
|
||||
|
||||
void (*_destory)(struct _stack* self);
|
||||
|
||||
// -------------------- public --------------------
|
||||
// kernel
|
||||
bool (*push)(struct _stack* self, void* obj);
|
||||
bool (*pop)(struct _stack* self, void* obj);
|
||||
bool (*peek)(struct _stack* self, void* obj);
|
||||
bool (*empty)(struct _stack* self);
|
||||
|
||||
// base
|
||||
uint32_t (*size)(struct _stack* self);
|
||||
bool (*empty)(struct _stack* self);
|
||||
uint32_t (*capacity)(struct _stack* self);
|
||||
bool (*clear)(struct _stack* self);
|
||||
|
||||
// iter
|
||||
iterator_t (*iter)(struct _stack* self);
|
||||
// clear and free node
|
||||
bool (*clear)(struct _stack* self);
|
||||
void (*destory)(struct _stack* self);
|
||||
|
||||
// -------------------- debug --------------------
|
||||
// print
|
||||
void (*print)(struct _stack* self);
|
||||
void (*print_obj)(void* obj);
|
||||
};
|
||||
|
@ -55,7 +55,6 @@ struct _tree_node
|
||||
|
||||
struct _tree
|
||||
{
|
||||
// -------------------- private --------------------
|
||||
struct _tree_node * _root;
|
||||
|
||||
uint32_t _size;
|
||||
@ -68,34 +67,60 @@ struct _tree
|
||||
|
||||
stack_t stack;
|
||||
queue_t queue;
|
||||
struct _tree_node * cur_node;
|
||||
|
||||
struct _iterator _iter;
|
||||
|
||||
void (*_destory)(struct _tree* self);
|
||||
|
||||
// -------------------- public --------------------
|
||||
// kernel
|
||||
bool (*insert)(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);
|
||||
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
|
||||
bool (*clear)(struct _tree* self);
|
||||
bool (*empty)(struct _tree* self);
|
||||
uint32_t (*size)(struct _tree* self);
|
||||
|
||||
// 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
|
||||
bool (*min)(struct _tree* self, void* obj);
|
||||
bool (*max)(struct _tree* self, void* obj);
|
||||
/**
|
||||
* @brief obj compare with obj2
|
||||
*
|
||||
* @return
|
||||
* obj < obj2 return -1
|
||||
* obj == obj2 return 0
|
||||
* obj > obj2 return 1
|
||||
*/
|
||||
int (*compare)(void* obj, void* obj2);
|
||||
|
||||
// config
|
||||
compare_fun_t compare; // !!! you have to implement this function
|
||||
// free
|
||||
void (*destory)(struct _tree* self);
|
||||
|
||||
// ----- 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);
|
||||
};
|
||||
typedef struct _tree* tree_t;
|
||||
@ -107,3 +132,4 @@ tree_t tree_rb_new(uint32_t obj_size);
|
||||
void tree_free(tree_t* tree);
|
||||
|
||||
#endif // _TREE_H_
|
||||
|
||||
|
@ -11,11 +11,6 @@
|
||||
#ifndef _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 "list.h"
|
||||
|
@ -21,24 +21,13 @@
|
||||
#define UNICSTL_TREE
|
||||
#define UNICSTL_HEAP
|
||||
#define UNICSTL_GRAPH
|
||||
#define UNICSTL_ITERATOR
|
||||
|
||||
/**
|
||||
* @brief debug
|
||||
*
|
||||
*/
|
||||
#define NDEBUG // assert disable
|
||||
|
||||
#define NDEBUG
|
||||
#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
|
116
src/deque.c
116
src/deque.c
@ -295,99 +295,35 @@ 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)
|
||||
{
|
||||
assert(self != NULL);
|
||||
if(obj_size == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// -------------------- private --------------------
|
||||
// attribute
|
||||
self->_obj_size = obj_size;
|
||||
self->_size = 0;
|
||||
// self->_capacity = 64;
|
||||
// self->_ratio = 2;
|
||||
|
||||
self->_head = 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;
|
||||
// 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->back = deque_back;
|
||||
self->front = deque_front;
|
||||
self->empty = deque_empty;
|
||||
|
||||
// base
|
||||
self->clear = deque_clear;
|
||||
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;
|
||||
|
||||
// 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;
|
||||
self->_head = NULL;
|
||||
self->_tail = NULL;
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -396,15 +332,13 @@ deque_t deque_new(uint32_t obj_size)
|
||||
{
|
||||
struct _deque* deque = NULL;
|
||||
deque = (struct _deque*)malloc(sizeof(struct _deque));
|
||||
if(deque == NULL)
|
||||
if(deque != NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(deque_init(deque, obj_size) != true)
|
||||
{
|
||||
free(deque);
|
||||
return NULL;
|
||||
if(deque_init(deque, obj_size) != true)
|
||||
{
|
||||
free(deque);
|
||||
deque = NULL;
|
||||
}
|
||||
}
|
||||
return deque;
|
||||
}
|
||||
@ -413,7 +347,7 @@ void deque_free(deque_t *deque)
|
||||
{
|
||||
if(*deque != NULL)
|
||||
{
|
||||
(*deque)->_destory(*deque);
|
||||
(*deque)->destory(*deque);
|
||||
free(*deque);
|
||||
}
|
||||
*deque = NULL;
|
||||
|
142
src/heap.c
142
src/heap.c
@ -70,15 +70,8 @@ static void heap_swap(struct _heap* self, int i, int j)
|
||||
static void heap_fixed_up(struct _heap* self, int i)
|
||||
{
|
||||
assert(self != NULL);
|
||||
assert(self->compare != NULL);
|
||||
int p = 0;
|
||||
|
||||
if(self->compare == NULL)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
if(self->_type == HEAP_MAX)
|
||||
if(self->_min_flag != true)
|
||||
{
|
||||
while(1)
|
||||
{
|
||||
@ -92,7 +85,7 @@ static void heap_fixed_up(struct _heap* self, int i)
|
||||
i = p;
|
||||
}
|
||||
}
|
||||
else /* if(self->_type == HEAP_MIN) */
|
||||
else
|
||||
{
|
||||
while(1)
|
||||
{
|
||||
@ -129,12 +122,7 @@ static void heap_fixed_down(struct _heap* self, int i)
|
||||
int l = 0,r = 0;
|
||||
int max = 0, min = 0;
|
||||
|
||||
if(self->compare == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(self->_type == HEAP_MAX)
|
||||
if(self->_min_flag != true)
|
||||
{
|
||||
while(1)
|
||||
{
|
||||
@ -159,7 +147,7 @@ static void heap_fixed_down(struct _heap* self, int i)
|
||||
i = max;
|
||||
}
|
||||
}
|
||||
else /* if(self->_type == HEAP_MIN) */
|
||||
else
|
||||
{
|
||||
while(1)
|
||||
{
|
||||
@ -204,6 +192,12 @@ static bool heap_pop(struct _heap* self, void* obj)
|
||||
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)
|
||||
{
|
||||
assert(self != NULL);
|
||||
@ -249,124 +243,46 @@ static void heap_print(struct _heap* self)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
iterator_t heap_iter(struct _heap* self)
|
||||
{
|
||||
assert(self != NULL);
|
||||
iterator_t iter = &self->_iter;
|
||||
|
||||
iter->_parent = self;
|
||||
iter->_cur = 0;
|
||||
iter->_cur_node = self->obj;
|
||||
return iter;
|
||||
}
|
||||
|
||||
bool heap_iter_hasnext(struct _iterator* iter)
|
||||
{
|
||||
assert(iter != NULL);
|
||||
assert(iter->parent != NULL);
|
||||
|
||||
heap_t self = (heap_t)iter->_parent;
|
||||
if(iter->_cur < self->size(self))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
const void* heap_iter_next(struct _iterator* iter)
|
||||
{
|
||||
assert(iter != NULL);
|
||||
assert(iter->parent != NULL);
|
||||
|
||||
heap_t self = (heap_t)iter->_parent;
|
||||
void *obj = NULL;
|
||||
|
||||
uint32_t index = self->_iter._cur;
|
||||
obj = self->obj + self->_obj_size * index;
|
||||
|
||||
self->_iter._cur += 1;
|
||||
return obj;
|
||||
}
|
||||
|
||||
static bool heap_init2(struct _heap* self, uint32_t obj_size, uint32_t capacity)
|
||||
{
|
||||
assert(self != NULL);
|
||||
|
||||
// -------------------- private --------------------
|
||||
// 1. set attr
|
||||
self->_obj_size = obj_size;
|
||||
self->_size = 0;
|
||||
self->_capacity = capacity;
|
||||
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);
|
||||
if(self->obj == NULL)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
heap_t heap_max_new2(uint32_t obj_size, uint32_t capacity)
|
||||
heap_t heap_new2(uint32_t obj_size, uint32_t capacity)
|
||||
{
|
||||
heap_t heap = NULL;
|
||||
heap = (struct _heap*)malloc(sizeof(struct _heap));
|
||||
if(heap == NULL)
|
||||
if(heap != NULL)
|
||||
{
|
||||
return NULL;
|
||||
if(heap_init2(heap, obj_size, capacity) != true)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@ -374,7 +290,7 @@ void heap_free(heap_t* heap)
|
||||
{
|
||||
if(*heap != NULL)
|
||||
{
|
||||
(*heap)->_destory(*heap);
|
||||
(*heap)->destory(*heap);
|
||||
free(*heap);
|
||||
}
|
||||
*heap = NULL;
|
||||
|
107
src/list.c
107
src/list.c
@ -179,30 +179,27 @@ static void list_print(struct _list* self)
|
||||
}
|
||||
}
|
||||
|
||||
static const void* list_iter_next(struct _iterator* iter)
|
||||
static void* list_begin(struct _list* self)
|
||||
{
|
||||
list_t self = (list_t)iter->_parent;
|
||||
void *obj = self->obj + self->_iter._cur * self->_obj_size;
|
||||
self->_iter._cur += 1;
|
||||
return obj;
|
||||
self->_cur = 0;
|
||||
return self->obj;
|
||||
}
|
||||
|
||||
static bool list_iter_hasnext(struct _iterator* iter)
|
||||
static void* list_end(struct _list* self)
|
||||
{
|
||||
list_t self = (list_t)iter->_parent;
|
||||
return (char*)self->obj + self->_size * self->_obj_size;
|
||||
}
|
||||
|
||||
if(self->_iter._cur < self->size(self))
|
||||
static void* list_next(struct _list* self)
|
||||
{
|
||||
void *obj = NULL;
|
||||
// if add this, can't go to end
|
||||
// if(self->_cur < self->_size - 1)
|
||||
{
|
||||
return true;
|
||||
self->_cur += 1;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
iterator_t list_iter(struct _list* self)
|
||||
{
|
||||
self->_iter._parent = self;
|
||||
self->_iter._cur = 0;
|
||||
return &self->_iter;
|
||||
obj = (char*)self->obj + self->_cur * self->_obj_size;
|
||||
return obj;
|
||||
}
|
||||
|
||||
static bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity)
|
||||
@ -215,51 +212,41 @@ static bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity)
|
||||
return false;
|
||||
}
|
||||
|
||||
// -------------------- private --------------------
|
||||
// 1. set attr
|
||||
list->_obj_size = obj_size;
|
||||
list->_size = 0;
|
||||
list->_capacity = capacity;
|
||||
list->_ratio = 2;
|
||||
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);
|
||||
if (list->obj == NULL)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@ -267,15 +254,13 @@ list_t list_new2(uint32_t obj_size, uint32_t capacity)
|
||||
{
|
||||
struct _list* list = NULL;
|
||||
list = (struct _list*)calloc(1, sizeof(struct _list));
|
||||
if(list == NULL)
|
||||
if(list != NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(list_init2(list, obj_size, capacity) != true)
|
||||
{
|
||||
free(list);
|
||||
return NULL;
|
||||
if(list_init2(list, obj_size, capacity) != true)
|
||||
{
|
||||
free(list);
|
||||
list = NULL;
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
@ -285,9 +270,9 @@ void list_free(list_t* list)
|
||||
assert(list != NULL);
|
||||
if(list != NULL && *list != NULL)
|
||||
{
|
||||
if((*list)->_destory != NULL)
|
||||
if((*list)->destory != NULL)
|
||||
{
|
||||
(*list)->_destory(*list);
|
||||
(*list)->destory(*list);
|
||||
}
|
||||
free(*list);
|
||||
*list = NULL;
|
||||
|
196
src/queue.c
196
src/queue.c
@ -306,65 +306,6 @@ 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)
|
||||
{
|
||||
assert(self != NULL);
|
||||
@ -374,43 +315,32 @@ static bool queue_init(struct _queue * self, uint32_t obj_size)
|
||||
return false;
|
||||
}
|
||||
|
||||
// -------------------- private --------------------
|
||||
// attribute init
|
||||
self->_size = 0;
|
||||
self->_obj_size = obj_size;
|
||||
self->_capacity = UINT32_MAX;
|
||||
self->_ratio = 1;
|
||||
|
||||
// front & back pointer init
|
||||
// function 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->_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;
|
||||
}
|
||||
|
||||
@ -424,59 +354,51 @@ static bool queue_init2(struct _queue * self, uint32_t obj_size, uint32_t capaci
|
||||
return false;
|
||||
}
|
||||
|
||||
// -------------------- private --------------------
|
||||
// attribute init
|
||||
self->_size = 0;
|
||||
self->_obj_size = obj_size;
|
||||
self->_capacity = capacity;
|
||||
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));
|
||||
if(self->_front == NULL)
|
||||
{
|
||||
return false;
|
||||
goto done;
|
||||
}
|
||||
self->_back = self->_front;
|
||||
|
||||
|
||||
// use self->_front->obj as obj_array
|
||||
//
|
||||
// self->_front->obj = calloc(self->_capacity, self->_obj_size);
|
||||
self->_front->obj = malloc(self->_capacity * self->_obj_size);
|
||||
if(self->_front->obj == NULL)
|
||||
{
|
||||
free(self->_front);
|
||||
return false;
|
||||
goto done1;
|
||||
}
|
||||
self->_index_front = 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;
|
||||
done1:
|
||||
free(self->_front);
|
||||
done:
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -491,15 +413,13 @@ queue_t queue_new(uint32_t obj_size)
|
||||
{
|
||||
struct _queue * queue = NULL;
|
||||
queue = (struct _queue *)calloc(1, sizeof(struct _queue));
|
||||
if(queue == NULL)
|
||||
if(queue != NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(queue_init(queue, obj_size) != true)
|
||||
{
|
||||
free(queue);
|
||||
return NULL;
|
||||
if(queue_init(queue, obj_size) == false)
|
||||
{
|
||||
free(queue);
|
||||
queue = NULL;
|
||||
}
|
||||
}
|
||||
return queue;
|
||||
}
|
||||
@ -517,15 +437,13 @@ queue_t queue_new2(uint32_t obj_size, uint32_t capacity)
|
||||
{
|
||||
struct _queue * queue = NULL;
|
||||
queue = (struct _queue *)calloc(1, sizeof(struct _queue));
|
||||
if(queue == NULL)
|
||||
if(queue != NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(queue_init2(queue, obj_size, capacity) != true)
|
||||
{
|
||||
free(queue);
|
||||
return NULL;
|
||||
if(queue_init2(queue, obj_size, capacity) == false)
|
||||
{
|
||||
free(queue);
|
||||
queue = NULL;
|
||||
}
|
||||
}
|
||||
return queue;
|
||||
}
|
||||
@ -541,9 +459,9 @@ void queue_free(queue_t* queue)
|
||||
assert(queue != NULL);
|
||||
if(queue != NULL && *queue != NULL)
|
||||
{
|
||||
if((*queue)->_destory != NULL)
|
||||
if((*queue)->destory != NULL)
|
||||
{
|
||||
(*queue)->_destory(*queue);
|
||||
(*queue)->destory(*queue);
|
||||
}
|
||||
free(*queue);
|
||||
*queue = NULL;
|
||||
|
190
src/stack.c
190
src/stack.c
@ -124,7 +124,6 @@ static uint32_t stack_capacity(struct _stack* self)
|
||||
static bool stack_clear(struct _stack* self)
|
||||
{
|
||||
assert(self != NULL);
|
||||
assert(self->_head != NULL);
|
||||
if (self->empty(self))
|
||||
{
|
||||
return true;
|
||||
@ -254,80 +253,40 @@ 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)
|
||||
{
|
||||
// assert(self != NULL);
|
||||
// assert(obj_size != 0);
|
||||
assert(self != NULL);
|
||||
assert(obj_size != 0);
|
||||
if(self == NULL || obj_size == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// ---------- private ----------
|
||||
// 1. set attr
|
||||
self->_obj_size = obj_size;
|
||||
self->_size = 0;
|
||||
self->_capacity = UINT32_MAX;
|
||||
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));
|
||||
if (self->_head == NULL)
|
||||
{
|
||||
@ -336,82 +295,51 @@ static bool stack_init(struct _stack* self, uint32_t obj_size)
|
||||
self->_head->obj = 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;
|
||||
}
|
||||
|
||||
static bool stack_init2(struct _stack* self, uint32_t obj_size, uint32_t capacity)
|
||||
{
|
||||
// assert(self != NULL);
|
||||
if(self == NULL || obj_size == 0 || capacity == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
assert(self != NULL);
|
||||
|
||||
// ---------- private ----------
|
||||
// 1. set attr
|
||||
self->_obj_size = obj_size;
|
||||
self->_size = 0;
|
||||
self->_capacity = capacity;
|
||||
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));
|
||||
if (self->_head == NULL)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// self->_head->obj = NULL;
|
||||
self->_head->next = NULL;
|
||||
|
||||
// 4. set array
|
||||
self->_head->obj = (void *)calloc(self->_capacity, self->_obj_size);
|
||||
if (self->_head->obj == NULL)
|
||||
{
|
||||
free(self->_head);
|
||||
self->_head = NULL;
|
||||
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;
|
||||
}
|
||||
|
||||
@ -419,15 +347,13 @@ stack_t stack_new(uint32_t obj_size)
|
||||
{
|
||||
stack_t stack = NULL;
|
||||
stack = (struct _stack*)calloc(1, sizeof(struct _stack));
|
||||
if(stack == NULL)
|
||||
if (stack != NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(stack_init(stack, obj_size) != true)
|
||||
{
|
||||
free(stack);
|
||||
return NULL;
|
||||
if(stack_init(stack, obj_size) != true)
|
||||
{
|
||||
free(stack);
|
||||
stack = NULL;
|
||||
}
|
||||
}
|
||||
return stack;
|
||||
}
|
||||
@ -436,15 +362,13 @@ stack_t stack_new2(uint32_t obj_size, uint32_t capacity)
|
||||
{
|
||||
stack_t stack = NULL;
|
||||
stack = (struct _stack*)calloc(1, sizeof(struct _stack));
|
||||
if (stack == NULL)
|
||||
if (stack != NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(stack_init2(stack, obj_size, capacity) != true)
|
||||
{
|
||||
free(stack);
|
||||
return NULL;
|
||||
if(stack_init2(stack, obj_size, capacity) != true)
|
||||
{
|
||||
free(stack);
|
||||
stack = NULL;
|
||||
}
|
||||
}
|
||||
return stack;
|
||||
}
|
||||
@ -454,9 +378,9 @@ void stack_free(stack_t *stack)
|
||||
assert(stack != NULL);
|
||||
if(stack != NULL && *stack != NULL)
|
||||
{
|
||||
if((*stack)->_destory != NULL)
|
||||
if((*stack)->destory != NULL)
|
||||
{
|
||||
(*stack)->_destory(*stack);
|
||||
(*stack)->destory(*stack);
|
||||
}
|
||||
free(*stack);
|
||||
*stack = NULL;
|
||||
|
960
src/tree.c
960
src/tree.c
File diff suppressed because it is too large
Load Diff
@ -263,61 +263,10 @@ static void test_deque_struct(void)
|
||||
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)
|
||||
{
|
||||
UnitySetTestFile(__FILE__);
|
||||
|
||||
RUN_TEST(test_deque_num);
|
||||
RUN_TEST(test_deque_struct);
|
||||
|
||||
RUN_TEST(test_deque_iter);
|
||||
}
|
||||
|
203
test/test_heap.c
203
test/test_heap.c
@ -36,7 +36,7 @@ static void* get_min(struct _heap* heap, void *array, int start, int end)
|
||||
return min;
|
||||
}
|
||||
|
||||
static void test_heap_min_num(void)
|
||||
static void test_heap_num(void)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
// int data[] = { 2,1,3,4};
|
||||
@ -46,21 +46,24 @@ static void test_heap_min_num(void)
|
||||
int temp = 0;
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
|
||||
heap_t heap = heap_min_new2(sizeof(int), 64);
|
||||
heap_t heap = heap_new2(sizeof(int), 64);
|
||||
TEST_ASSERT_NOT_NULL(heap);
|
||||
heap->print_obj = print_num;
|
||||
heap->compare = compare_num;
|
||||
|
||||
// default: maxheap
|
||||
// maxheap or minheap
|
||||
heap->setmin(heap, true);
|
||||
|
||||
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_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->empty(heap));
|
||||
for (i = 0; i < len; i++)
|
||||
@ -80,23 +83,17 @@ static void test_heap_min_num(void)
|
||||
TEST_ASSERT_NULL(heap);
|
||||
}
|
||||
|
||||
static void test_heap_min_struct(void)
|
||||
static void test_heap_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},
|
||||
{"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]);
|
||||
|
||||
heap_t heap = heap_min_new2(sizeof(struct _student), 64);
|
||||
heap_t heap = heap_new2(sizeof(struct _student), 64);
|
||||
TEST_ASSERT_NOT_NULL(heap);
|
||||
heap->print_obj = print_struct;
|
||||
heap->compare = compare_struct;
|
||||
@ -106,13 +103,12 @@ static void test_heap_min_struct(void)
|
||||
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_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_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->empty(heap));
|
||||
@ -133,173 +129,10 @@ static void test_heap_min_struct(void)
|
||||
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)
|
||||
{
|
||||
UnitySetTestFile(__FILE__);
|
||||
|
||||
RUN_TEST(test_heap_min_num);
|
||||
RUN_TEST(test_heap_min_struct);
|
||||
|
||||
RUN_TEST(test_heap_max_num);
|
||||
RUN_TEST(test_heap_max_struct);
|
||||
|
||||
RUN_TEST(test_heap_max_iter);
|
||||
RUN_TEST(test_heap_num);
|
||||
RUN_TEST(test_heap_struct);
|
||||
}
|
||||
|
@ -284,7 +284,6 @@ static void test_list_struct(void)
|
||||
TEST_ASSERT_NULL(list);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void test_list_iter(void)
|
||||
{
|
||||
int temp = 0;
|
||||
@ -328,45 +327,6 @@ static void test_list_iter(void)
|
||||
TEST_ASSERT_TRUE(list->clear(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)
|
||||
{
|
||||
|
@ -586,84 +586,6 @@ static void test_queue2_struct(void)
|
||||
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)
|
||||
{
|
||||
UnitySetTestFile(__FILE__);
|
||||
@ -678,7 +600,4 @@ void test_queue(void)
|
||||
|
||||
RUN_TEST(test_queue2_num);
|
||||
RUN_TEST(test_queue2_struct);
|
||||
|
||||
RUN_TEST(test_queue_iter);
|
||||
RUN_TEST(test_queue2_iter);
|
||||
}
|
||||
|
@ -440,82 +440,6 @@ static void test_stack2_struct(void)
|
||||
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)
|
||||
{
|
||||
UnitySetTestFile(__FILE__);
|
||||
@ -530,7 +454,4 @@ void test_stack(void)
|
||||
|
||||
RUN_TEST(test_stack2_num);
|
||||
RUN_TEST(test_stack2_struct);
|
||||
|
||||
RUN_TEST(test_stack_iter);
|
||||
RUN_TEST(test_stack2_iter);
|
||||
}
|
||||
|
690
test/test_tree.c
690
test/test_tree.c
@ -19,6 +19,447 @@
|
||||
#undef min
|
||||
#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] = {
|
||||
{ 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
|
||||
@ -67,55 +508,76 @@ static const int expected_int_array_orderpre_delete[15][15] = {
|
||||
{ 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)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
|
||||
int buff[15];
|
||||
uint32_t len = sizeof(data) / sizeof(int);
|
||||
// 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 data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
|
||||
int buff[32];
|
||||
int temp = 0;
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
|
||||
int * iter = NULL;
|
||||
int count = 0;
|
||||
iterator_t iter = NULL;
|
||||
|
||||
tree_t tree = tree_avl_new(sizeof(int));
|
||||
TEST_ASSERT_NOT_NULL(tree);
|
||||
tree->print_obj = print_num;
|
||||
tree->compare = compare_num;
|
||||
|
||||
memcpy(data, expected_int_array[0], len);
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
temp = data[i];
|
||||
TEST_ASSERT_TRUE(tree->insert(tree, &temp));
|
||||
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
count = iter2array_num(iter, buff);
|
||||
|
||||
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
|
||||
{
|
||||
buff[count++] = *iter;
|
||||
}
|
||||
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array_orderpre_insert[i], buff, count);
|
||||
}
|
||||
|
||||
for(i = 0; i < 8; i++)
|
||||
for(i = 1; i < 9; i++)
|
||||
{
|
||||
iter = tree->iter(tree, order[i]);
|
||||
count = iter2array_num(iter, buff);
|
||||
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array[i + 1], buff, count);
|
||||
tree->set_order(tree, i); //ORDER_LEFT_IN
|
||||
// printf("\n ----- iter test -----\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[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_TRUE(tree->clear(tree));
|
||||
TEST_ASSERT_TRUE(tree->empty(tree));
|
||||
@ -127,34 +589,46 @@ static void test_avltree_iter(void)
|
||||
static void test_avltree_insert(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[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
|
||||
int buff[15];
|
||||
uint32_t len = sizeof(data) / sizeof(int);
|
||||
int buff[32];
|
||||
int temp = 0;
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
|
||||
int * iter = NULL;
|
||||
int count = 0;
|
||||
iterator_t iter = NULL;
|
||||
|
||||
tree_t tree = tree_avl_new(sizeof(int));
|
||||
TEST_ASSERT_NOT_NULL(tree);
|
||||
|
||||
tree->print_obj = print_num;
|
||||
tree->compare = compare_num;
|
||||
|
||||
memcpy(data, expected_int_array[0], len);
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
temp = data[i];
|
||||
TEST_ASSERT_TRUE(tree->insert(tree, &temp));
|
||||
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
count = iter2array_num(iter, buff);
|
||||
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
|
||||
{
|
||||
buff[count++] = *iter;
|
||||
}
|
||||
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array_orderpre_insert[i], buff, count);
|
||||
}
|
||||
|
||||
for(i = 0; i < 8; i++)
|
||||
for(i = 1; i < 9; i++)
|
||||
{
|
||||
iter = tree->iter(tree, order[i]);
|
||||
count = iter2array_num(iter, buff);
|
||||
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array[i + 1], buff, count);
|
||||
tree->set_order(tree, i); //ORDER_LEFT_IN
|
||||
// printf("\n ----- iter test -----\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[i], buff, count);
|
||||
}
|
||||
|
||||
tree_free(&tree);
|
||||
@ -164,19 +638,20 @@ static void test_avltree_insert(void)
|
||||
static void test_avltree_delete(void)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
|
||||
int buff[15];
|
||||
uint32_t len = sizeof(data) / sizeof(int);
|
||||
int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
|
||||
int buff[32];
|
||||
int temp = 0;
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
|
||||
int * iter = NULL;
|
||||
int count = 0;
|
||||
iterator_t iter = NULL;
|
||||
|
||||
tree_t tree = tree_avl_new(sizeof(int));
|
||||
TEST_ASSERT_NOT_NULL(tree);
|
||||
|
||||
tree->print_obj = print_num;
|
||||
tree->compare = compare_num;
|
||||
|
||||
memcpy(data, expected_int_array[0], len);
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
temp = data[i];
|
||||
@ -185,13 +660,19 @@ static void test_avltree_delete(void)
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
count = iter2array_num(iter, buff);
|
||||
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
|
||||
{
|
||||
buff[count++] = *iter;
|
||||
// printf("(%2d ) ", *iter);
|
||||
}
|
||||
// printf("\n");
|
||||
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array_orderpre_delete[i], buff, count);
|
||||
|
||||
temp = data[i];
|
||||
// delete
|
||||
TEST_ASSERT_TRUE(tree->delete(tree, &temp));
|
||||
}
|
||||
//
|
||||
TEST_ASSERT_FALSE(tree->delete(tree, &temp));
|
||||
|
||||
tree_free(&tree);
|
||||
@ -253,15 +734,21 @@ static const int rbt_expected_int_array_orderpre_delete[15][15] = {
|
||||
static void test_rbtree_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 buff[15];
|
||||
uint32_t len = sizeof(data) / sizeof(int);
|
||||
// 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 data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
|
||||
int buff[32];
|
||||
int temp = 0;
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
|
||||
int * iter = NULL;
|
||||
int count = 0;
|
||||
iterator_t iter = NULL;
|
||||
|
||||
|
||||
tree_t tree = tree_rb_new(sizeof(int));
|
||||
TEST_ASSERT_NOT_NULL(tree);
|
||||
|
||||
tree->print_obj = print_num;
|
||||
tree->compare = compare_num;
|
||||
|
||||
@ -270,18 +757,51 @@ static void test_rbtree_iter(void)
|
||||
temp = data[i];
|
||||
TEST_ASSERT_TRUE(tree->insert(tree, &temp));
|
||||
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
count = iter2array_num(iter, buff);
|
||||
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
|
||||
{
|
||||
buff[count++] = *iter;
|
||||
}
|
||||
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_insert[i], buff, count);
|
||||
}
|
||||
|
||||
for(i = 0; i < 8; i++)
|
||||
for(i = 1; i < 9; i++)
|
||||
{
|
||||
iter = tree->iter(tree, order[i]);
|
||||
count = iter2array_num(iter, buff);
|
||||
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array[i + 1], buff, count);
|
||||
tree->set_order(tree, i); //ORDER_LEFT_IN
|
||||
// printf("\n ----- iter test -----\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(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_TRUE(tree->clear(tree));
|
||||
TEST_ASSERT_TRUE(tree->empty(tree));
|
||||
@ -293,15 +813,20 @@ static void test_rbtree_iter(void)
|
||||
static void test_rbtree_insert(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[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
|
||||
int buff[15];
|
||||
uint32_t len = sizeof(data) / sizeof(int);
|
||||
int buff[32];
|
||||
int temp = 0;
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
|
||||
int * iter = NULL;
|
||||
int count = 0;
|
||||
iterator_t iter = NULL;
|
||||
|
||||
tree_t tree = tree_rb_new(sizeof(int));
|
||||
TEST_ASSERT_NOT_NULL(tree);
|
||||
|
||||
tree->print_obj = print_num;
|
||||
tree->compare = compare_num;
|
||||
|
||||
@ -310,16 +835,24 @@ static void test_rbtree_insert(void)
|
||||
temp = data[i];
|
||||
TEST_ASSERT_TRUE(tree->insert(tree, &temp));
|
||||
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
count = iter2array_num(iter, buff);
|
||||
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
|
||||
{
|
||||
buff[count++] = *iter;
|
||||
}
|
||||
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_insert[i], buff, count);
|
||||
}
|
||||
|
||||
for(i = 0; i < 8; i++)
|
||||
for(i = 1; i < 9; i++)
|
||||
{
|
||||
iter = tree->iter(tree, order[i]);
|
||||
count = iter2array_num(iter, buff);
|
||||
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array[i + 1], buff, count);
|
||||
tree->set_order(tree, i); //ORDER_LEFT_IN
|
||||
// printf("\n ----- iter test -----\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(rbt_expected_int_array[i], buff, count);
|
||||
}
|
||||
|
||||
tree_free(&tree);
|
||||
@ -330,18 +863,16 @@ static void test_rbtree_delete(void)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
|
||||
int buff[15];
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
int buff[32];
|
||||
int temp = 0;
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
|
||||
int * iter = NULL;
|
||||
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));
|
||||
TEST_ASSERT_NOT_NULL(tree);
|
||||
|
||||
tree->print_obj = print_num;
|
||||
tree->compare = compare_num;
|
||||
|
||||
@ -353,19 +884,26 @@ static void test_rbtree_delete(void)
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
iter = tree->iter(tree, ORDER_LEFT_PRE);
|
||||
count = iter2array_num(iter, buff);
|
||||
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
|
||||
{
|
||||
buff[count++] = *iter;
|
||||
// printf("(%2d ) ", *iter);
|
||||
}
|
||||
// printf("\n");
|
||||
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_delete[i], buff, count);
|
||||
|
||||
temp = data[i];
|
||||
// delete
|
||||
TEST_ASSERT_TRUE(tree->delete(tree, &temp));
|
||||
}
|
||||
//
|
||||
TEST_ASSERT_FALSE(tree->delete(tree, &temp));
|
||||
|
||||
tree_free(&tree);
|
||||
TEST_ASSERT_NULL(tree);
|
||||
}
|
||||
|
||||
|
||||
void test_tree(void)
|
||||
{
|
||||
UnitySetTestFile(__FILE__);
|
||||
@ -377,4 +915,8 @@ void test_tree(void)
|
||||
RUN_TEST(test_rbtree_iter);
|
||||
RUN_TEST(test_rbtree_insert);
|
||||
RUN_TEST(test_rbtree_delete);
|
||||
|
||||
// RUN_TEST(test_avltree_num);
|
||||
// RUN_TEST(test_rbtree_num);
|
||||
// RUN_TEST(test_rbtree_struct);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user