mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-17 19:41:36 +08:00
编码统一使用utf8
This commit is contained in:
parent
349889ea98
commit
170c2a5421
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"cmake.configureOnOpen": true,
|
"cmake.configureOnOpen": true,
|
||||||
"files.encoding": "gb18030",
|
"files.encoding": "utf8",
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"common.h": "c",
|
"common.h": "c",
|
||||||
"unicstl.h": "c",
|
"unicstl.h": "c",
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
|
|
||||||
# 0. cmake 最低版本号要求
|
# 0. cmake 最低版本号要求
|
||||||
cmake_minimum_required(VERSION 3.29)
|
cmake_minimum_required(VERSION 3.29)
|
||||||
|
|
||||||
# 0. 项目信息
|
# 0. 项目信息
|
||||||
project(demo VERSION 0.0.01)
|
project(demo VERSION 0.0.01)
|
||||||
|
|
||||||
# 2. 支持GDB
|
# 2. 支持GDB
|
||||||
set(CMAKE_BUILD_TYPE "Debug")
|
set(CMAKE_BUILD_TYPE "Debug")
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g --std=c99")
|
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g --std=c99")
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall --std=c99")
|
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall --std=c99")
|
||||||
@ -14,11 +14,11 @@ set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall --std=c99")
|
|||||||
set(CMAKE_INSTALL_PREFIX "release")
|
set(CMAKE_INSTALL_PREFIX "release")
|
||||||
|
|
||||||
|
|
||||||
# 1. 添加头文件路径
|
# 1. 添加头文件路径
|
||||||
include_directories(include)
|
include_directories(include)
|
||||||
include_directories(3rdparty/unicstl-unity/src)
|
include_directories(3rdparty/unicstl-unity/src)
|
||||||
|
|
||||||
# 1. 添加子目录
|
# 1. 添加子目录
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
add_subdirectory(demo)
|
add_subdirectory(demo)
|
||||||
add_subdirectory(3rdparty)
|
add_subdirectory(3rdparty)
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
#include "demo.h"
|
#include "demo.h"
|
||||||
|
|
||||||
// vs2022 ア默<EFBDB1>袁サ
|
// if vs2022 has error: 'max': macro redefinition
|
||||||
#ifdef max
|
#ifdef max
|
||||||
#undef max
|
#undef max
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
|
|
||||||
|
|
||||||
# tree
|
# tree
|
||||||
日志
|
|
||||||
```
|
```
|
||||||
----- unicstl test -----
|
----- unicstl test -----
|
||||||
|
|
||||||
|
@ -22,13 +22,13 @@ struct _deque_node
|
|||||||
|
|
||||||
struct _deque
|
struct _deque
|
||||||
{
|
{
|
||||||
struct _deque_node* _head; // 头节点
|
struct _deque_node* _head;
|
||||||
struct _deque_node* _tail; // 尾节点
|
struct _deque_node* _tail;
|
||||||
|
|
||||||
uint32_t _obj_size; // 元素大小
|
uint32_t _obj_size;
|
||||||
uint32_t _size; // 栈大小
|
uint32_t _size;
|
||||||
// uint32_t _capacity; // 总容量
|
// uint32_t _capacity;
|
||||||
// uint32_t _ratio; // 扩展比率
|
// uint32_t _ratio;
|
||||||
|
|
||||||
// kernel
|
// kernel
|
||||||
bool (*push_back)(struct _deque* self, void* obj);
|
bool (*push_back)(struct _deque* self, void* obj);
|
||||||
|
@ -17,12 +17,12 @@ struct _heap
|
|||||||
{
|
{
|
||||||
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;
|
||||||
|
|
||||||
bool _min_flag; // 最大/小堆标志
|
bool _min_flag;
|
||||||
|
|
||||||
// kernel
|
// kernel
|
||||||
bool (*peek)(struct _heap* self, void* obj);
|
bool (*peek)(struct _heap* self, void* obj);
|
||||||
|
@ -17,22 +17,22 @@ struct _list
|
|||||||
{
|
{
|
||||||
void * obj;
|
void * obj;
|
||||||
|
|
||||||
uint32_t _obj_size; // 元素大小
|
uint32_t _obj_size;
|
||||||
uint32_t _size; // 栈大小
|
uint32_t _size;
|
||||||
uint32_t _capacity; // 总容量
|
uint32_t _capacity;
|
||||||
uint32_t _ratio; // 扩展比率
|
uint32_t _ratio;
|
||||||
uint32_t _cur; // 当前索引
|
uint32_t _cur;
|
||||||
|
|
||||||
// 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.
|
||||||
bool (*pop)(struct _list* self, int index, void* obj); // Remove and return item at index.
|
bool (*pop)(struct _list* self, int index, void* obj); // Remove and return item at index.
|
||||||
|
|
||||||
int (*index)(struct _list* self, void* obj); // Return first index of obj. Return -1 if the obj is not present.
|
int (*index)(struct _list* self, void* obj); // Return first index of obj. Return -1 if the obj is not present.
|
||||||
bool (*remove)(struct _list* self, void *obj); // Remove first occurrence of obj.
|
bool (*remove)(struct _list* self, void *obj); // Remove first occurrence of obj.
|
||||||
|
|
||||||
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
|
// iter
|
||||||
void* (*begin)(struct _list* self);
|
void* (*begin)(struct _list* self);
|
||||||
@ -49,7 +49,7 @@ struct _list
|
|||||||
|
|
||||||
|
|
||||||
// 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.
|
||||||
|
@ -27,10 +27,10 @@ struct _queue
|
|||||||
uint32_t _index_front;
|
uint32_t _index_front;
|
||||||
uint32_t _index_back;
|
uint32_t _index_back;
|
||||||
|
|
||||||
uint32_t _obj_size; // 元素大小
|
uint32_t _obj_size;
|
||||||
uint32_t _size; // 栈大小
|
uint32_t _size;
|
||||||
uint32_t _capacity; // 总容量
|
uint32_t _capacity;
|
||||||
uint32_t _ratio; // 扩展比率
|
uint32_t _ratio;
|
||||||
|
|
||||||
// kernel
|
// kernel
|
||||||
bool (*push)(struct _queue* self, void* obj);
|
bool (*push)(struct _queue* self, void* obj);
|
||||||
|
@ -23,10 +23,10 @@ struct _stack
|
|||||||
{
|
{
|
||||||
struct _stack_node * _head;
|
struct _stack_node * _head;
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
// kernel
|
// kernel
|
||||||
bool (*peek)(struct _stack* self, void* obj);
|
bool (*peek)(struct _stack* self, void* obj);
|
||||||
|
@ -36,12 +36,12 @@ struct _tree
|
|||||||
{
|
{
|
||||||
struct _tree_node * _root;
|
struct _tree_node * _root;
|
||||||
|
|
||||||
uint32_t _size; // 栈大小
|
uint32_t _size;
|
||||||
uint32_t _obj_size; // 元素大小
|
uint32_t _obj_size;
|
||||||
uint32_t _capacity; // 总容量
|
uint32_t _capacity;
|
||||||
uint32_t _ratio; // 扩展比率
|
uint32_t _ratio;
|
||||||
|
|
||||||
bool _right_priority; // 右优先
|
bool _right_priority;
|
||||||
|
|
||||||
// kernel
|
// kernel
|
||||||
bool (*insert)(struct _tree* self, void* obj);
|
bool (*insert)(struct _tree* self, void* obj);
|
||||||
|
@ -76,7 +76,7 @@ static void heap_fixed_up(struct _heap* self, int i)
|
|||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
p = parent(i);
|
p = parent(i);
|
||||||
// 若当前节点大于其父节点,则交换位置,否则退出循环
|
// if current node is greater than its parent, swap the position. otherwise break out of loop
|
||||||
if(p < 0 || self->compare((char *)self->obj + i * self->_obj_size, (char *)self->obj + p * self->_obj_size) <= 0)
|
if(p < 0 || self->compare((char *)self->obj + i * self->_obj_size, (char *)self->obj + p * self->_obj_size) <= 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@ -90,7 +90,7 @@ static void heap_fixed_up(struct _heap* self, int i)
|
|||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
p = parent(i);
|
p = parent(i);
|
||||||
// 若当前节点大于其父节点,则交换位置,否则退出循环
|
// if current node is less than its parent, swap the position. otherwise break out of loop
|
||||||
if(p < 0 || self->compare((char *)self->obj + i * self->_obj_size, (char *)self->obj + p * self->_obj_size) >= 0)
|
if(p < 0 || self->compare((char *)self->obj + i * self->_obj_size, (char *)self->obj + p * self->_obj_size) >= 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
|
@ -61,7 +61,7 @@ bool list_insert(struct _list* self, int index, void* obj)
|
|||||||
bool list_pop(struct _list* self, int index, void* obj)
|
bool list_pop(struct _list* self, int index, void* obj)
|
||||||
{
|
{
|
||||||
assert(self != NULL);
|
assert(self != NULL);
|
||||||
assert(index >= (int)(0 - self->size(self)) && index < (int)self->size(self)); // list空的时候也会报错,太严格了有点
|
assert(index >= (int)(0 - self->size(self)) && index < (int)self->size(self));
|
||||||
|
|
||||||
if (self->empty(self))
|
if (self->empty(self))
|
||||||
{
|
{
|
||||||
@ -193,7 +193,7 @@ void* list_end(struct _list* self)
|
|||||||
void* list_next(struct _list* self)
|
void* list_next(struct _list* self)
|
||||||
{
|
{
|
||||||
void *obj = NULL;
|
void *obj = NULL;
|
||||||
// 加了判断之后,回不到下一个了
|
// if add this, can't go to end
|
||||||
// if(self->_cur < self->_size - 1)
|
// if(self->_cur < self->_size - 1)
|
||||||
{
|
{
|
||||||
self->_cur += 1;
|
self->_cur += 1;
|
||||||
|
@ -85,14 +85,10 @@ static bool stack_pop(struct _stack* self, void* obj)
|
|||||||
|
|
||||||
if (obj != NULL)
|
if (obj != NULL)
|
||||||
{
|
{
|
||||||
// 将弹出的数据输出
|
|
||||||
memmove(obj, node->obj, self->_obj_size);
|
memmove(obj, node->obj, self->_obj_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新指针
|
|
||||||
self->_head->next = node->next;
|
self->_head->next = node->next;
|
||||||
|
|
||||||
// 释放数据和节点
|
|
||||||
free(node->obj);
|
free(node->obj);
|
||||||
free(node);
|
free(node);
|
||||||
|
|
||||||
@ -111,10 +107,8 @@ static bool stack_clear(struct _stack* self)
|
|||||||
struct _stack_node* node = self->_head->next;
|
struct _stack_node* node = self->_head->next;
|
||||||
while (node != NULL)
|
while (node != NULL)
|
||||||
{
|
{
|
||||||
// 更新指针
|
|
||||||
self->_head->next = node->next;
|
self->_head->next = node->next;
|
||||||
|
|
||||||
// 释放数据和节点
|
|
||||||
free(node->obj);
|
free(node->obj);
|
||||||
free(node);
|
free(node);
|
||||||
|
|
||||||
@ -321,7 +315,7 @@ bool stack_init2(struct _stack* self, uint32_t obj_size, uint32_t capacity)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// self->_head->obj = NULL;
|
// self->_head->obj = NULL;
|
||||||
self->_head->next = NULL; // 无效参数
|
self->_head->next = NULL;
|
||||||
|
|
||||||
// 4. set array
|
// 4. set array
|
||||||
self->_head->obj = (void *)calloc(self->_capacity, self->_obj_size);
|
self->_head->obj = (void *)calloc(self->_capacity, self->_obj_size);
|
||||||
|
46
src/tree.c
46
src/tree.c
@ -185,14 +185,14 @@ int32_t tree_height(struct _tree* self, struct _tree_node* root)
|
|||||||
/**
|
/**
|
||||||
* @brief
|
* @brief
|
||||||
*
|
*
|
||||||
* 以 balance = rigth - left 为标准,调整平衡因子
|
* if balance = rigth - left,so
|
||||||
*
|
*
|
||||||
* | 情况 | root->balance | node->balance | 调整方式 |
|
* | case | root->balance | node->balance | function |
|
||||||
* | ---- | ------------ | -------------- | -------- |
|
* | ---- | ------------ | -------------- | -------- |
|
||||||
* | 1 | 2 | >= 0 | 左旋
|
* | 1 | 2 | >= 0 | left rotation
|
||||||
* | 2 | 2 | < 0 | 先右旋后左旋
|
* | 2 | 2 | < 0 | first right rotation, then left rotation
|
||||||
* | 3 | -2 | <= 0 | 右旋
|
* | 3 | -2 | <= 0 | right rotation
|
||||||
* | 4 | -2 | > 0 | 先左旋后右旋
|
* | 4 | -2 | > 0 | forth left rotation, then right rotation
|
||||||
*
|
*
|
||||||
* @param self
|
* @param self
|
||||||
* @return true
|
* @return true
|
||||||
@ -347,10 +347,10 @@ static bool tree_node_free(struct _tree_node* node)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 在树中查找插入位置
|
* @brief find the position to insert or find object
|
||||||
*
|
*
|
||||||
* @param self 树的指针
|
* @param self
|
||||||
* @param obj 要查找或插入的对象
|
* @param obj
|
||||||
*/
|
*/
|
||||||
struct _tree_node * tree_find_pos(struct _tree* self, void* obj)
|
struct _tree_node * tree_find_pos(struct _tree* self, void* obj)
|
||||||
{
|
{
|
||||||
@ -1185,14 +1185,14 @@ bool tree_rb_insert(struct _tree* self, void* obj)
|
|||||||
/**
|
/**
|
||||||
* @brief
|
* @brief
|
||||||
*
|
*
|
||||||
* 以 balance = rigth - left 为标准,调整平衡因子
|
* 以 balance = rigth - left 为标准,调整平衡因子
|
||||||
*
|
*
|
||||||
* | 情况 | root->balance | node->balance | 调整方式 |
|
* | 情况 | root->balance | node->balance | 调整方式 |
|
||||||
* | ---- | ------------ | -------------- | -------- |
|
* | ---- | ------------ | -------------- | -------- |
|
||||||
* | 1 | 2 | >= 0 | 左旋
|
* | 1 | 2 | >= 0 | 左旋
|
||||||
* | 2 | 2 | < 0 | 先右旋后左旋
|
* | 2 | 2 | < 0 | 先右旋后左旋
|
||||||
* | 3 | -2 | <= 0 | 右旋
|
* | 3 | -2 | <= 0 | 右旋
|
||||||
* | 4 | -2 | > 0 | 先左旋后右旋
|
* | 4 | -2 | > 0 | 先左旋后右旋
|
||||||
*
|
*
|
||||||
* @param self
|
* @param self
|
||||||
* @return true
|
* @return true
|
||||||
@ -1210,18 +1210,18 @@ static bool tree_rb_rebalance(struct _tree* self, struct _tree_node* node)
|
|||||||
struct _tree_node* uncle = NULL;
|
struct _tree_node* uncle = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 新插入节点为红色,且父节点为红色的情况下,需要调整。
|
* @brief 新插入节点为红色,且父节点为红色的情况下,需要调整。
|
||||||
*
|
*
|
||||||
* 主要考虑前三种情况[1-3],其余三种[4-6]对称操作即可
|
* 主要考虑前三种情况[1-3],其余三种[4-6]对称操作即可
|
||||||
*
|
*
|
||||||
* 原则只有一个,那就是想办法维持红黑树性质不变
|
* 原则只有一个,那就是想办法维持红黑树性质不变
|
||||||
*
|
*
|
||||||
* | 情况 | 说明 | 调整方式 |
|
* | 情况 | 说明 | 调整方式 |
|
||||||
* | ---- | --- | -------- |
|
* | ---- | --- | -------- |
|
||||||
* | 0 | 父节点为黑色 | 不用处理
|
* | 0 | 父节点为黑色 | 不用处理
|
||||||
* | 1 | 父红,爷黑,叔红 | 仅变色即可:父黑,爷红,叔黑
|
* | 1 | 父红,爷黑,叔红 | 仅变色即可:父黑,爷红,叔黑
|
||||||
* | 2 | 父红,爷黑,叔黑 | (若爷孙在同一边)父黑,爷红,爷左/右旋
|
* | 2 | 父红,爷黑,叔黑 | (若爷孙在同一边)父黑,爷红,爷左/右旋
|
||||||
* | 3 | 父红,爷黑,叔黑 | (若爷孙在不同边)先父左右旋,将新父变黑,随后爷红,爷左/右旋
|
* | 3 | 父红,爷黑,叔黑 | (若爷孙在不同边)先父左右旋,将新父变黑,随后爷红,爷左/右旋
|
||||||
*/
|
*/
|
||||||
while(node->parent != NULL && node->parent->color == RBT_RED)
|
while(node->parent != NULL && node->parent->color == RBT_RED)
|
||||||
{
|
{
|
||||||
|
@ -56,7 +56,7 @@ void print_str(void* obj)
|
|||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
// --------------------------------------------------
|
||||||
// 测试用例
|
// 测试用例
|
||||||
// --------------------------------------------------
|
// --------------------------------------------------
|
||||||
void setUp(void)
|
void setUp(void)
|
||||||
{
|
{
|
||||||
|
@ -10,10 +10,6 @@
|
|||||||
*/
|
*/
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
* 每成功init一次,就需要对应的destory一次。否则可能存在内存泄漏
|
|
||||||
*/
|
|
||||||
static void test_queue_init(void)
|
static void test_queue_init(void)
|
||||||
{
|
{
|
||||||
struct _queue queue;
|
struct _queue queue;
|
||||||
@ -36,10 +32,6 @@ static void test_queue_init(void)
|
|||||||
queue.destory(&queue);
|
queue.destory(&queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
* 每成功init一次,就需要对应的free一次。否则可能存在内存泄漏
|
|
||||||
*/
|
|
||||||
static void test_queue_new(void)
|
static void test_queue_new(void)
|
||||||
{
|
{
|
||||||
queue_t queue = NULL;
|
queue_t queue = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user