Compare commits

..

No commits in common. "08ba5296bef914a1556ad69cd319d48ddb4ab22a" and "23fc67cb490f790ab6a8ef3e49e98ae05772be7b" have entirely different histories.

28 changed files with 1733 additions and 1733 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -13,53 +13,51 @@
#include "common.h" #include "common.h"
typedef enum
{
HEAP_MIN = 0,
HEAP_MAX = 1,
}heap_type;
struct _heap struct _heap
{ {
// -------------------- private -------------------- void * obj;
void* obj;
uint32_t _size; uint32_t _size;
uint32_t _obj_size; uint32_t _obj_size;
uint32_t _capacity; uint32_t _capacity;
uint32_t _ratio; uint32_t _ratio;
heap_type _type; bool _min_flag;
struct _iterator _iter;
void (*_destory)(struct _heap* self);
// -------------------- public --------------------
// kernel // kernel
bool (*peek)(struct _heap* self, void* obj); bool (*peek)(struct _heap* self, void* obj);
bool (*push)(struct _heap* self, void* obj); bool (*push)(struct _heap* self, void* obj);
bool (*pop)(struct _heap* self, void* obj); bool (*pop)(struct _heap* self, void* obj);
bool (*empty)(struct _heap* self);
// default: max heap
void (*setmin)(struct _heap* self, bool min_flag);
// base // base
uint32_t(*size)(struct _heap* self); uint32_t(*size)(struct _heap* self);
bool (*empty)(struct _heap* self);
/**
* @brief obj compare with obj2
*
* @return
* obj < obj2 return -1
* obj == obj2 return 0
* obj > obj2 return 1
*/
int (*compare)(void* obj, void* obj2);
// others
bool (*clear)(struct _heap* self); bool (*clear)(struct _heap* self);
void (*destory)(struct _heap* self);
// iter // print
iterator_t (*iter)(struct _heap* self);
// config
compare_fun_t compare; // !!! you have to implement this function
// -------------------- debug --------------------
void (*print)(struct _heap* self); void (*print)(struct _heap* self);
void (*print_obj)(void* obj); void (*print_obj)(void* obj);
}; };
typedef struct _heap* heap_t; typedef struct _heap* heap_t;
// create and free heap // create and free heap
heap_t heap_max_new2(uint32_t obj_size, uint32_t capacity); heap_t heap_new2(uint32_t obj_size, uint32_t capacity);
heap_t heap_min_new2(uint32_t obj_size, uint32_t capacity);
void heap_free(heap_t* heap); void heap_free(heap_t* heap);

View File

@ -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_

View File

@ -12,11 +12,9 @@
#define _LIST_H_ #define _LIST_H_
#include "common.h" #include "common.h"
#include "iterator.h"
struct _list struct _list
{ {
// -------------------- private --------------------
void * obj; void * obj;
uint32_t _obj_size; uint32_t _obj_size;
@ -25,11 +23,6 @@ struct _list
uint32_t _ratio; uint32_t _ratio;
uint32_t _cur; uint32_t _cur;
struct _iterator _iter;
void (*_destory)(struct _list* self);
// -------------------- public --------------------
// kernel // kernel
bool (*append)(struct _list* self, void* obj); // Append object to the end of the list. bool (*append)(struct _list* self, void* obj); // Append object to the end of the list.
bool (*insert)(struct _list* self, int index, void* obj); // Insert object before index. bool (*insert)(struct _list* self, int index, void* obj); // Insert object before index.
@ -41,25 +34,32 @@ struct _list
bool (*get)(struct _list* self, int index, void* obj); bool (*get)(struct _list* self, int index, void* obj);
bool (*set)(struct _list* self, int index, void* obj); bool (*set)(struct _list* self, int index, void* obj);
// iter
void* (*begin)(struct _list* self);
void* (*next)(struct _list* self);
void* (*end)(struct _list* self);
// base // base
uint32_t(*size)(struct _list* self); uint32_t(*size)(struct _list* self);
bool (*empty)(struct _list* self); bool (*empty)(struct _list* self);
bool (*clear)(struct _list* self);
// iter // clear and free node
iterator_t (*iter)(struct _list* self); bool (*clear)(struct _list* self);
void (*destory)(struct _list* self);
// sort // sort
// bool (*reverse)(struct _list* self); // Reverse *IN PLACE*. bool (*reverse)(struct _list* self); // Reverse *IN PLACE*.
/** /**
Sort the list in ascending order and return false. Sort the list in ascending order and return false.
The sort is in-place (i.e. the list itself is modified) and stable (i.e. the The sort is in-place (i.e. the list itself is modified) and stable (i.e. the
order of two equal elements is maintained). order of two equal elements is maintained).
The reverse flag can be set to sort in descending order. The reverse flag can be set to sort in descending order.
*/ */
// bool (*sort)(struct _list* self, uint8_t reserve, int (*compare)(void* obj, void* obj2)); bool (*sort)(struct _list* self, uint8_t reserve, int (*compare)(void* obj, void* obj2));
// -------------------- debug -------------------- // print
void (*print)(struct _list* self); void (*print)(struct _list* self);
void (*print_obj)(void* obj); void (*print_obj)(void* obj);
}; };

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -179,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; self->_cur = 0;
void *obj = self->obj + self->_iter._cur * self->_obj_size; return self->obj;
self->_iter._cur += 1;
return 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; obj = (char*)self->obj + self->_cur * self->_obj_size;
} return obj;
iterator_t list_iter(struct _list* self)
{
self->_iter._parent = self;
self->_iter._cur = 0;
return &self->_iter;
} }
static bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity) static bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity)
@ -215,51 +212,41 @@ static bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity)
return false; return false;
} }
// -------------------- private -------------------- // 1. set attr
list->_obj_size = obj_size; list->_obj_size = obj_size;
list->_size = 0; list->_size = 0;
list->_capacity = capacity; list->_capacity = capacity;
list->_ratio = 2; list->_ratio = 2;
list->_cur = 0; list->_cur = 0;
// 2. set function
// kernel
list->append = list_append;
list->get = list_get;
list->clear = list_clear;
list->destory = list_destory;
list->empty = list_empty;
list->index = list_index;
list->insert = list_insert;
list->pop = list_pop;
list->print = list_print;
list->remove = list_remove;
list->reverse = list_reverse;
list->set = list_set;
list->size = list_size;
list->sort = list_sort;
list->begin = list_begin;
list->next = list_next;
list->end = list_end;
// 3. set array
// list->obj = (void*)calloc(list->_capacity, list->_obj_size);
list->obj = (void*)malloc(list->_capacity * list->_obj_size); list->obj = (void*)malloc(list->_capacity * list->_obj_size);
if (list->obj == NULL) if (list->obj == NULL)
{ {
return false; return false;
} }
list->_iter.next = list_iter_next;
list->_iter.hasnext = list_iter_hasnext;
list->_destory = list_destory;
// -------------------- public --------------------
// kernel
list->append = list_append;
list->insert = list_insert;
list->pop = list_pop;
list->empty = list_empty;
// base
list->clear = list_clear;
list->size = list_size;
// iter
list->iter = list_iter;
// others
list->index = list_index;
list->remove = list_remove;
list->get = list_get;
list->set = list_set;
// list->reverse = list_reverse;
// list->sort = list_sort;
// -------------------- debug --------------------
list->print = list_print;
return true; return true;
} }
@ -267,15 +254,13 @@ list_t list_new2(uint32_t obj_size, uint32_t capacity)
{ {
struct _list* list = NULL; struct _list* list = NULL;
list = (struct _list*)calloc(1, sizeof(struct _list)); list = (struct _list*)calloc(1, sizeof(struct _list));
if(list == NULL) if(list != NULL)
{ {
return NULL;
}
if(list_init2(list, obj_size, capacity) != true) if(list_init2(list, obj_size, capacity) != true)
{ {
free(list); free(list);
return NULL; list = NULL;
}
} }
return list; return list;
} }
@ -285,9 +270,9 @@ void list_free(list_t* list)
assert(list != NULL); assert(list != NULL);
if(list != NULL && *list != NULL) if(list != NULL && *list != NULL)
{ {
if((*list)->_destory != NULL) if((*list)->destory != NULL)
{ {
(*list)->_destory(*list); (*list)->destory(*list);
} }
free(*list); free(*list);
*list = NULL; *list = NULL;

View File

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

View File

@ -124,7 +124,6 @@ static uint32_t stack_capacity(struct _stack* self)
static bool stack_clear(struct _stack* self) static bool stack_clear(struct _stack* self)
{ {
assert(self != NULL); assert(self != NULL);
assert(self->_head != NULL);
if (self->empty(self)) if (self->empty(self))
{ {
return true; return true;
@ -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) static bool stack_init(struct _stack* self, uint32_t obj_size)
{ {
// assert(self != NULL); assert(self != NULL);
// assert(obj_size != 0); assert(obj_size != 0);
if(self == NULL || obj_size == 0) if(self == NULL || obj_size == 0)
{ {
return false; return false;
} }
// ---------- private ---------- // 1. set attr
self->_obj_size = obj_size; self->_obj_size = obj_size;
self->_size = 0; self->_size = 0;
self->_capacity = UINT32_MAX; self->_capacity = UINT32_MAX;
self->_ratio = 1; self->_ratio = 1;
// 2. set function
// kernel
self->push = stack_push;
self->pop = stack_pop;
self->peek = stack_peek;
// base
self->size = stack_size;
self->empty = stack_empty;
self->capacity = stack_capacity;
// clear and free node
self->clear = stack_clear;
self->destory = stack_destory;
// print
self->print = stack_print;
// 3. set node
self->_head = (struct _stack_node *)malloc(sizeof(struct _stack_node)); self->_head = (struct _stack_node *)malloc(sizeof(struct _stack_node));
if (self->_head == NULL) if (self->_head == NULL)
{ {
@ -336,82 +295,51 @@ static bool stack_init(struct _stack* self, uint32_t obj_size)
self->_head->obj = NULL; self->_head->obj = NULL;
self->_head->next = NULL; self->_head->next = NULL;
self->_iter.next = stack_iter_next;
self->_iter.hasnext = stack_iter_hasnext;
self->_destory = stack_destory;
// ---------- public ----------
// kernel
self->push = stack_push;
self->pop = stack_pop;
self->peek = stack_peek;
self->empty = stack_empty;
// base
self->size = stack_size;
self->capacity = stack_capacity;
self->clear = stack_clear;
// iter
self->iter = stack_iter;
// ---------- debug ----------
self->print = stack_print;
return true; return true;
} }
static bool stack_init2(struct _stack* self, uint32_t obj_size, uint32_t capacity) static bool stack_init2(struct _stack* self, uint32_t obj_size, uint32_t capacity)
{ {
// assert(self != NULL); assert(self != NULL);
if(self == NULL || obj_size == 0 || capacity == 0)
{
return false;
}
// ---------- private ---------- // 1. set attr
self->_obj_size = obj_size; self->_obj_size = obj_size;
self->_size = 0; self->_size = 0;
self->_capacity = capacity; self->_capacity = capacity;
self->_ratio = 2; self->_ratio = 2;
// 2. set function
// kernel
self->push = stack2_push;
self->pop = stack2_pop;
self->peek = stack2_peek;
// others
self->empty = stack_empty;
self->size = stack_size;
self->capacity = stack_capacity;
// clear and free node
self->clear = stack_clear;
self->destory = stack2_destory;
// print
self->print = stack2_print;
// 3. set node
self->_head = (struct _stack_node*)malloc(sizeof(struct _stack_node)); self->_head = (struct _stack_node*)malloc(sizeof(struct _stack_node));
if (self->_head == NULL) if (self->_head == NULL)
{ {
return false; return false;
} }
// self->_head->obj = NULL;
self->_head->next = NULL; self->_head->next = NULL;
// 4. set array
self->_head->obj = (void *)calloc(self->_capacity, self->_obj_size); self->_head->obj = (void *)calloc(self->_capacity, self->_obj_size);
if (self->_head->obj == NULL) if (self->_head->obj == NULL)
{ {
free(self->_head);
self->_head = NULL;
return false; return false;
} }
self->_iter.next = stack_iter_next;
self->_iter.hasnext = stack_iter_hasnext;
self->_destory = stack2_destory;
// ---------- public ----------
// kernel
self->push = stack2_push;
self->pop = stack2_pop;
self->peek = stack2_peek;
self->empty = stack_empty;
// base
self->size = stack_size;
self->capacity = stack_capacity;
self->clear = stack_clear;
// iter
self->iter = stack_iter;
// ---------- debug ----------
self->print = stack2_print;
return true; return true;
} }
@ -419,15 +347,13 @@ stack_t stack_new(uint32_t obj_size)
{ {
stack_t stack = NULL; stack_t stack = NULL;
stack = (struct _stack*)calloc(1, sizeof(struct _stack)); stack = (struct _stack*)calloc(1, sizeof(struct _stack));
if(stack == NULL) if (stack != NULL)
{ {
return NULL;
}
if(stack_init(stack, obj_size) != true) if(stack_init(stack, obj_size) != true)
{ {
free(stack); free(stack);
return NULL; stack = NULL;
}
} }
return stack; return stack;
} }
@ -436,15 +362,13 @@ stack_t stack_new2(uint32_t obj_size, uint32_t capacity)
{ {
stack_t stack = NULL; stack_t stack = NULL;
stack = (struct _stack*)calloc(1, sizeof(struct _stack)); stack = (struct _stack*)calloc(1, sizeof(struct _stack));
if (stack == NULL) if (stack != NULL)
{ {
return NULL;
}
if(stack_init2(stack, obj_size, capacity) != true) if(stack_init2(stack, obj_size, capacity) != true)
{ {
free(stack); free(stack);
return NULL; stack = NULL;
}
} }
return stack; return stack;
} }
@ -454,9 +378,9 @@ void stack_free(stack_t *stack)
assert(stack != NULL); assert(stack != NULL);
if(stack != NULL && *stack != NULL) if(stack != NULL && *stack != NULL)
{ {
if((*stack)->_destory != NULL) if((*stack)->destory != NULL)
{ {
(*stack)->_destory(*stack); (*stack)->destory(*stack);
} }
free(*stack); free(*stack);
*stack = NULL; *stack = NULL;

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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