# unicstl
## 简介
基于C语言实现的通用C库,包含常用数据结构和算法。
**全称:** Universal C standard library
**作者:** 温建峰
**主页:** [博客](https://blog.wenjianfeng.top)
**邮箱:**[orig5826@163.com](mailto:orig5826@163.com)
**gitee:**[源码](https://gitee.com/apaki/unicstl)
**github:**[镜像](https://github.com/Orig5826/unicstl)
## 设计架构
```mermaid
flowchart TB
subgraph low
darray
linklist
dlinklist
ringbuffer[ringbuffer
小数据或尽量不扩容]
end
subgraph hal
segarray[segarray
大数据扩容优先] --> darray
string --> darray
hashtable --> darray
end
subgraph adapter
deque -->|仅学习| dlinklist
deque ==> segarray
deque --> ringbuffer
end
subgraph top
stack --> deque
queue --> deque
rbtree -.-> stack
rbtree -.-> queue
map -.-> rbtree
unordered_map -.-> hashtable
end
subgraph embed
estack --> ringbuffer
equeue --> ringbuffer
end
```
## 数据结构
### 基础结构
|数据结构 |名称 |说明 |
|---|---|---|
| darray | 动态数组 | 扩容
| ringbuf | 环形缓存区 | 扩容/固定容量
| linlist | 单链表 |
| dlinlist | 双向链表 |
### 容器结构
|数据结构 |名称 |说明 |
|---|---|---|
| deque | 双端队列 | 扩容
| stack | 栈 | 扩容
| queue | 队列 | 扩容
### 嵌入式结构
|数据结构 |名称 |说明 |
|---|---|---|
| estack | 栈 | 固定容量
| equeue | 队列 | 固定容量
## 接口函数原型
```c
// -------------------- 初始化 --------------------
struct* new(size_t obj_size, size_t capacity); // 创建
void free(struct**); // 释放
bool init(size_t obj_size, size_t capacity, void *mem_pool); // 静态初始化,支持传入内存池,不扩容
// 外部实现
int compare(void* obj1, void* obj2); // 比较函数,若调用了和比较有关的接口,需要在初始化后配置(树、图必须)
// -------------------- 核心功能 --------------------
// 核心操作
bool push(const void* obj); // [栈、队列] 入栈/入队
bool push_front(const void* obj); // [双端队列] 头部入队
bool push_back(const void* obj); // [双端队列] 尾部入队
bool append(const void* obj); // [动态数组] 追加元素
bool pop(void* obj); // [栈、队列,动态数组] 出栈/出队/移除元素
bool pop_front(void* obj); // [双端队列] 头部出队
bool pop_back(void* obj); // [双端队列] 尾部出队
bool peek(void* obj); // [栈] 查看栈顶元素
bool front(void* obj); // [队列、双端队列] 查看头部元素
bool back(void* obj); // [队列、双端队列] 查看尾部元素
// 基础操作
size_t size(); // 获取大小
size_t capacity(); // 获取容量
bool empty(); // 判断是否空
bool full(); // 判断是否满
void clear(); // 清空
// 迭代器操作
iterator_t iter(...); // 返回迭代器
bool iter_hasnext(); // 是否有下一个元素
const void* iter_next(); // 迭代器下一个元素 <只读访问>
// 索引操作
size_t index(void *obj); // 获取元素索引, -1为不存在
bool contains(const void* obj); // 判断元素是否存在 <返回bool>
bool insert(size_t index, const void* obj); // 插入元素
bool remove(size_t index, const void *obj); // 删除元素 < delete !!!废弃:防止项目用于C++,关键字冲突>
bool set(uint32_t index, const void* obj); // 设置元素
bool get(uint32_t index, void* obj); // 获取元素
const void* at(size_t index); // 获取元素指针
// 统计
uint32_t count(const void* obj); // 统计元素的个数
// 树
bool insert(const void* obj); // [树] 插入元素
bool delete(const void* obj); // [树] 删除元素
bool add_(const void* obj); // [图:顶点、边] 添加元素
bool del_(const void* obj); // [图:顶点、边] 删除元素
bool find_(const void* obj); // [图:顶点、边] 查找元素
```
### 分支命名
|命名 |说明 | 示例
|:----: |:----: | ----
| master | 主分支 | master
| dev | 开发分支 | dev-stack
| test | 测试分支| test-tree
| release | 发布分支 | v1.2.5
| feature | 新功能分支 | feature-tree
| bugfix | bug修复分支 | bugfix-map
| refactor | 重构分支| refactor-darray
## 修改日志
### Unicstl 0.0.10 (2026-5-11)
- new features
- add darray/ringbuf/linlist/dlinklist
- add estack/equeue for embedded
- darray add function: search/sort
- add algo: sort and search
- refactor:
- deque base on ringbuf
- stack base on deque
- queue base on deque
### Unicstl 0.0.02 (2025-05-06)
- new features
- graph add function: add/del/find vertex/edge
- graph add function: bfs/dfs
- tree add new iterator and optimize code
- deque add order select and delete some functions
- iter change the name of container/index...
- list optimize code and add slice function
- unicstl add default function
### 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