2 Star 3 Fork 0

wujilingfeng / cstructures

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

CSTRUCTURES

  • c语言的红黑树,平衡树,堆和链表
  • c++遍历接口

COMPILER

本库使用xmake编译,在根目录执行

compile library and demo

xmake for windows without IDE

xmake f --demo=y --demo_path="Demo"
xmake

xmake for windows mingw(假设你已配置好mingw)

xmake f -p mingw  --demo=y --demo_path="Demo"
xmake 

xmake for vsxmake

xmake f --demo=y --demo_path="Demo"
xmake project -k vsxmake

xmake for cmake(for mingw)

xmake f -p mingw -a arm64 --demo=y --demo_path="Demo"
xmake project -k cmake

xmake for vs

xmake f --demo=y --demo_path="Demo"
xmake project -k vs -m release

xmake for linux

xmake f --demo=y --demo_path="Demo"
xmake
compile library only

你只需要将上述--demo=y替换为--demo=n

TUTORIAL

Node

一下当节点Node* n表示链表时,均表示以当前节点n为开始节点并向下遍历。

接口 意义
node_init(Node*) 初始化节点
free_node_value(Node*) 释放节点链表所有的value内存(以当前节点为开始节点,向下遍历)
free_node(Node*) 释放节点链表的内存(以当前节点为开始节点,向下遍历)
node_find(Node*n,void*value) 返回当前链表中值等于value的节点(以n节点为开始节点,向下遍历),没有找到时返回NULL
Node*node_copy(Node*) 复制当前链表并返回
int node_size(Node*) 返回链表的长度
Node*node_overlying(Node*n,void*v) 给当前链表n向前插入值为v的节点,返回链表的开始节点(请确保n是链表开端)
Node*node_pushback(Node*n,void*v) 给当前链表n向后插入值为v的节点,返回链表的末端节点(请确保n时链表末端)
Node* node_reverse(Node*) 输入链表的开端或末端,返回链表的末端或开端
Node* node_eliminate(Node*n,Node* n2) 从链表n中删除并释放节点n2
Node*node_delete_value(Node*n,void*v) 删除并释放链表n中值等于v的节点,返回链表的开端
Node*node_splicing(Node*,Node*) 复制两个链表,并拼接它们,返回拼接后的链表
Node* node_union(Node*n1,Node*n2) 返回两个链表的并(返回的链表的内存和n1,n2无关)
Node* node_intersection(Node* n1,Node* n2) 返回两个链表的交
Node*node_minus(Node* n1,Node* n2) 返回链表n1-n2的集合
Node* node_bub_sortn(Node*n,int(*cmp)(void* a,void* b)) 对链表进行冒泡排序(从大到小),返回排序后的链表。cmp返回1表示大于,0表示等于,-1表示小于
Node* node_filter_condition(Node*n,int (*filter_condition)(void*,)) 从链表中删除filter_condition=1的节点,返回的链表和n无内存关联

在上面的接口中除了node_delete_value,node_bub_sortn,node_reverse,node_overlying, node_pushback返回的链表的内存和输入链表相关联,其他的均无关。

RB_Tree

红黑树的接口采用宏进行类似c++的模板扩展,比如:如果你想要获得适配int类型的接口,你需要在头文件中加入一行RB_Tree_func_declare(int),那么就会在头文件展开int类型接口的声明,并在源文件.c中加入一行RB_Tree_func(int),那么就会在源文件中展开定义。

此时你就可以调用RB_Tree_init_int()就会初始化红黑树的内部函数指针为适配int的函数指针。然后你就可以对这颗红黑树操作了。

以下是RB_Tree内部成员的意义

接口 意义
size 树的节点数
int (*cmp)(const void* ,const void*) 值的比较函数,1表示大于,0表示等于,-1表示小于
void* (* copy)(void*) 树的复制j节点data的函数
void (* del)(void*) 树 的释放节点内部data的函数
void* (*find)(struct RB_Tree*,void*v) 查找树值为v的节点
void*(* insert)(strcut RB_Tree*,void*v) 插入树以copy(v)为值的节点,copy正是上面的从copy函数
int(* erase)(RB_Tree* tree,void* data) 释放树以data为值的节点,释放函数时上面的del函数
struct RB_Tree_Trav*(* begin)(struct RB_Tree*) 返回树的遍历结构体,RB_Tree_Trav指向开端
struct RB_Tree_Trav*(* rbegin)(struct RB_Tree*) 返回树的遍历结构体,RB_Tree_Trav指向末端
void(\iterator_init)(struct RB_Tree_Trav*) 初始化RB_Tree_Trav的函数

一般来说,上面的函数只有size ,find ,insert,erase,begin,rbegin是用户用到的。

RB_Tree_Trav的接口:

接口 意义
tree 指向的树
it 当前迭代器指向的节点
void*(*next)(struct RB_Tree_Trav*) 使it指向下一个节点,然后返回it的data
void*(*prev)(struct RB_Tree_Trav*) 使it指向上一个节点,然后返回it的data
void*(*first)(struct RB_Tree_Trav*) 仿std::map接口,返回data的key部分
void*(*second)(struct RB_Tree_Trav*) 仿std::map接口,返回data的value部分
AVL_Tree

设计和接口完全类似RB_Tree。

c++ iterator

库也提供了非常简单的c++的迭代器,

for(Node it=*n;*nit!=NULL;nit++)
{}
//rt是RB_Tree_Trav指针
for(RB_Tree_Trav it=*rt;it.it!=NULL;it++)
{}
//at是AVL_Tree_Trav指针
for(AVL_Tree_Trav it=*at;it.it!=NULL;it++)
{
    
}

Copyright (c) 2021 libo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

c语言的数据结构 展开 收起
C 等 3 种语言
MIT
取消

贡献者

全部

近期动态

加载更多
不能加载更多了
C
1
https://gitee.com/wujilingfeng/cstructures.git
git@gitee.com:wujilingfeng/cstructures.git
wujilingfeng
cstructures
cstructures
master

搜索帮助