Compare commits

...

18 Commits

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -16,6 +16,7 @@
struct _list
{
// -------------------- private --------------------
void * obj;
uint32_t _obj_size;
@ -26,6 +27,9 @@ struct _list
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.
@ -37,30 +41,25 @@ struct _list
bool (*get)(struct _list* self, int index, void* obj);
bool (*set)(struct _list* self, int index, void* obj);
// iter
iterator_t (*iter)(struct _list* self);
// base
uint32_t(*size)(struct _list* self);
bool (*empty)(struct _list* self);
// clear and free node
bool (*clear)(struct _list* self);
void (*destory)(struct _list* self);
// iter
iterator_t (*iter)(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));
// print
// -------------------- debug --------------------
void (*print)(struct _list* self);
void (*print_obj)(void* obj);
};

View File

@ -55,6 +55,7 @@ struct _tree_node
struct _tree
{
// -------------------- private --------------------
struct _tree_node * _root;
uint32_t _size;
@ -67,60 +68,34 @@ 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
/**
* @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);
iterator_t (*iter)(struct _tree* self, enum _order);
/**
* @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 (*min)(struct _tree* self, void* obj);
bool (*max)(struct _tree* self, void* obj);
// 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);
// config
compare_fun_t compare; // !!! you have to implement this function
// -------------------- debug --------------------
void (*print_obj)(void* obj);
};
typedef struct _tree* tree_t;
@ -132,4 +107,3 @@ tree_t tree_rb_new(uint32_t obj_size);
void tree_free(tree_t* tree);
#endif // _TREE_H_

View File

@ -11,6 +11,11 @@
#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"

View File

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

View File

@ -215,42 +215,51 @@ static bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity)
return false;
}
// 1. set attr
// -------------------- private --------------------
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;
// iterator
list->iter = list_iter;
list->_iter.next = list_iter_next;
list->_iter.hasnext = list_iter_hasnext;
// 3. set array
// list->obj = (void*)calloc(list->_capacity, list->_obj_size);
list->obj = (void*)malloc(list->_capacity * list->_obj_size);
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;
}
@ -276,9 +285,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;

File diff suppressed because it is too large Load Diff

View File

@ -36,7 +36,7 @@ static void* get_min(struct _heap* heap, void *array, int start, int end)
return min;
}
static void test_heap_num(void)
static void test_heap_min_num(void)
{
uint32_t i = 0;
// int data[] = { 2,1,3,4};
@ -56,9 +56,10 @@ static void test_heap_num(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(*(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));
@ -79,12 +80,18 @@ static void test_heap_num(void)
TEST_ASSERT_NULL(heap);
}
static void test_heap_struct(void)
static void test_heap_min_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,
{"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]);
@ -99,14 +106,14 @@ static void test_heap_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));
for (i = 0; i < len; i++)
@ -126,10 +133,173 @@ static void test_heap_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_num);
RUN_TEST(test_heap_struct);
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);
}

View File

@ -19,447 +19,6 @@
#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
@ -508,76 +67,55 @@ 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[] = { 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 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 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));
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
buff[count++] = *iter;
}
iter = tree->iter(tree, ORDER_LEFT_PRE);
count = iter2array_num(iter, buff);
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array_orderpre_insert[i], buff, count);
}
for(i = 1; i < 9; i++)
for(i = 0; i < 8; i++)
{
tree->set_order(tree, i); //ORDER_LEFT_IN
// 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);
iter = tree->iter(tree, order[i]);
count = iter2array_num(iter, buff);
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array[i + 1], 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));
@ -589,46 +127,34 @@ 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[32];
int buff[15];
uint32_t len = sizeof(data) / sizeof(int);
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));
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
buff[count++] = *iter;
}
iter = tree->iter(tree, ORDER_LEFT_PRE);
count = iter2array_num(iter, buff);
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array_orderpre_insert[i], buff, count);
}
for(i = 1; i < 9; i++)
for(i = 0; i < 8; i++)
{
tree->set_order(tree, i); //ORDER_LEFT_IN
// 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);
iter = tree->iter(tree, order[i]);
count = iter2array_num(iter, buff);
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array[i + 1], buff, count);
}
tree_free(&tree);
@ -638,20 +164,19 @@ 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[32];
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 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];
@ -660,19 +185,13 @@ static void test_avltree_delete(void)
for (i = 0; i < len; i++)
{
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
buff[count++] = *iter;
// printf("(%2d ) ", *iter);
}
// printf("\n");
iter = tree->iter(tree, ORDER_LEFT_PRE);
count = iter2array_num(iter, buff);
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);
@ -734,21 +253,15 @@ static const int rbt_expected_int_array_orderpre_delete[15][15] = {
static void test_rbtree_iter(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 data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
int buff[32];
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 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;
@ -757,51 +270,18 @@ static void test_rbtree_iter(void)
temp = data[i];
TEST_ASSERT_TRUE(tree->insert(tree, &temp));
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
buff[count++] = *iter;
}
iter = tree->iter(tree, ORDER_LEFT_PRE);
count = iter2array_num(iter, buff);
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_insert[i], buff, count);
}
for(i = 1; i < 9; i++)
for(i = 0; i < 8; i++)
{
tree->set_order(tree, i); //ORDER_LEFT_IN
// 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);
iter = tree->iter(tree, order[i]);
count = iter2array_num(iter, buff);
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array[i + 1], 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));
@ -813,20 +293,15 @@ 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[32];
int buff[15];
uint32_t len = sizeof(data) / sizeof(int);
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;
@ -835,24 +310,16 @@ static void test_rbtree_insert(void)
temp = data[i];
TEST_ASSERT_TRUE(tree->insert(tree, &temp));
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
buff[count++] = *iter;
}
iter = tree->iter(tree, ORDER_LEFT_PRE);
count = iter2array_num(iter, buff);
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_insert[i], buff, count);
}
for(i = 1; i < 9; i++)
for(i = 0; i < 8; i++)
{
tree->set_order(tree, i); //ORDER_LEFT_IN
// 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);
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_free(&tree);
@ -863,16 +330,18 @@ 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[32];
int temp = 0;
int buff[15];
uint32_t len = sizeof(data) / sizeof(data[0]);
int * iter = NULL;
int temp = 0;
int count = 0;
iterator_t iter = NULL;
enum _order order[8] = {
ORDER_LEFT_PRE, ORDER_LEFT_IN, ORDER_LEFT_POST, ORDER_LEFT_BREADTH,
ORDER_RIGHT_PRE, ORDER_RIGHT_IN, ORDER_RIGHT_POST, ORDER_RIGHT_BREADTH
};
tree_t tree = tree_rb_new(sizeof(int));
TEST_ASSERT_NOT_NULL(tree);
tree->print_obj = print_num;
tree->compare = compare_num;
@ -884,26 +353,19 @@ static void test_rbtree_delete(void)
for (i = 0; i < len; i++)
{
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
buff[count++] = *iter;
// printf("(%2d ) ", *iter);
}
// printf("\n");
iter = tree->iter(tree, ORDER_LEFT_PRE);
count = iter2array_num(iter, buff);
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__);
@ -915,8 +377,4 @@ 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);
}