数据结构

二叉树操作接口

在一个二叉树上插入一个节点

void TBTreeInsert(TBTree **root, TBTree *node);

功能:在一个二叉树上插入一个节点

参数:

参数 说明
root 二叉树根节点
node 要插入节点指针

返回值:

在一个二叉树上删除一个节点

void TBTreeDelete(TBTree **root, TBTree *node);

功能:在一个二叉树上删除一个节点

参数:

参数 说明
root 二叉树根节点
node 要删除节点指针

返回值:

在一个二叉树上查找节点

TBTree *TBTreeFind(TBTree *root, Tuintp id);

功能:在一个二叉树上查找节点

参数:

参数 说明
root 二叉树根节点
id 传入节点id

返回值:返回查找到的节点

队列操作接口

初始化队列

void TQueueInit(TQueue *queue, Tint data_size, Tint free_max_num, Tint queue_max_num);

功能:初始化队列

参数:

参数 说明
queue 队列
data_size 队列上每个节点中要容纳的用户数据大小(字节)
free_max_num 当用户释放一个链表节点时,不立即释放内存而是保持起来的最大空闲节点数
queue_max_num 该队列上可以分配的最大节点数(不包括空闲节点)

返回值:

重置队列为初始化状态

void TQueueReset(TQueue *queue);

功能:释放所有分配的节点内存,包括 free 的节点

参数:

参数 说明
queue 队列

返回值:

分配队列节点

void *TQueueMalloc(TQueue *queue, Tbool if_head_or_tail);

功能:分配队列节点

参数:

参数 说明
queue 队列
if_head_or_tail 为 TRUE 时在 head 处分配新节点,为 FALSE 时在 tail 处分配新节点

返回值:

注解:

分配的新节点内存已经memset(0)了

示例:

my_node *pnode1 = TQueueMalloc(&my_queue, TRUE); //分配节点
TQueueFree(&my_queue, pnode1);  //释放节点

把当前节点提升到队列最前面

void TQueueRaise(TQueue *queue, void *data);

功能:把当前节点提升到队列最前面

参数:

参数 说明
queue 队列
data 当前节点

返回值:

摘除并释放队列当前节点

void TQueueFree(TQueue *queue, void *data);

功能:摘除并释放队列当前节点

参数:

参数 说明
queue 队列
data 当前节点

返回值:

示例:

my_node *pnode1 = TQueueMalloc(&my_queue, TRUE); //分配节点
TQueueFree(&my_queue, pnode1);      //释放节点

释放所有节点

void TQueueFreeAll(TQueue *queue);

功能:释放所有节点

参数:

参数 说明
queue 队列

返回值:

获取当前节点的兄弟节点

void *TQueueSeek(TQueue *queue, void *data, Tbool if_next_or_prev);

功能:获取当前节点的兄弟节点

参数:

参数 说明
queue 队列
data 当前节点
if_next_or_prev 为 TRUE 则返回当前节点的后一个节点,为 FALSE 则返回当前节点的前一个节点

返回值:当前节点的兄弟节点

数组操作接口

初始化数组

void TArrayInit(TArray *parray, Tint size);

功能:初始化数组

参数:

参数 说明
parray 数组
size 数组里的每个节点中要容纳的用户数据大小(字节)

返回值:

示例:

TArray my_array;
TArrayInit(&my_array, sizeof(my_node));

重置数组为初始化状态并释放所有分配的内存

void TArrayReset(TArray *parray);

功能:重置数组为初始化状态并释放所有分配的内存

参数:

参数 说明
parray 数组

返回值:

获取数组元素的首地址

void *TArrayGet(TArray *parray, Tint i);

功能:获取数组元素的首地址

参数:

参数 说明
parray 数组
i 获取数组元素的位置,i的取值为[0,数组元素个数-1],没有返回NULL

返回值:第i个数组元素的首地址

添加数组元素

void *TArrayAdd(TArray *parray, Tint i, Tint n);

功能:添加数组元素

参数:

参数 说明
parray 数组
i 要添加数组元素的位置
n 增加的元素的个数

返回值:增加元素的首地址

注解:i 的范围为[0,数组元素个数-1],没有返回NULL,i=-1表示在尾部减少

示例:

my_node *pnode = TArrayAdd(&my_array, 0, 5);
my_node *pnode2 = TArrayAdd(&my_array, -1, 2);
TArrayDelete(&my_array, 0, 2);
TArrayDelete(&my_array, -1, 1);

删除数组元素

void TArrayDelete(TArray *parray, Tint i, Tint n);

功能:删除数组元素

参数:

参数 说明
parray 数组
i 要删除数组元素的位置
n 删除的元素的个数

返回值:

注解:i 的范围为[0,数组元素个数-1],没有返回NULL,i=-1表示在尾部减少

示例:

my_node *pnode = TArrayAdd(&my_array, 0, 5);
my_node *pnode2 = TArrayAdd(&my_array, -1, 2);
TArrayDelete(&my_array, 0, 2);
TArrayDelete(&my_array, -1, 1);

清除数组元素

void TArrayClear(TArray *parray, Tint i, Tint n);

功能:清除数组元素

参数:

参数 说明
parray 数组
i 要清除的数组元素的位置
n 内存清0元素的个数

返回值:

注解:i的范围为[0,数组元素个数-1],没有返回NULL,i=-1表示在尾部减少

设置数组元素个数

void *TArraySet(TArray *parray, Tint n);

功能:设置数组元素个数

参数:

参数 说明
parray 数组
n 数组元素个数

返回值:第一个元素的内存地址

注解:直接设置数组的元素个数并只分配需要的内存, array 的大小为 n,内部不分配额外空间

THash节点

THash节点回调函数类型定义

THash 节点销毁/重置时的回调函数原型

typedef void (*THashNodeDestroy_Func)(THashNode *node, void *arg);

功能:THash 节点销毁/重置时的回调函数原型

参数:

参数 说明
node 将要销毁/重置的 THash 节点
arg THashDestroy 传入的用户数据

返回值:

注解:函数返回后会自动销毁/重置该node,回调函数中不能销毁/重置node

遍历 THash 节点的回调函数

typedef Tbool (* THashNodeVisit_Func)(THashNode *node, void *arg);

功能:遍历 THash 节点的回调函数

参数:

参数 说明
node THash节点
arg 执行遍历函数传递的用户参数

返回值:TRUE 终止遍历

FALSE 继续遍历后一个节点

注解:此回调函数中不能删除该 THashNode 节点

THash节点操作接口

销毁当前 THash 数据结构

void THashDestroy(THash *str_id_hash, THashNodeDestroy_Func func, void *arg);

功能:销毁当前 THash 数据结构

参数:

参数 说明
str_id_hash THash 数据结构
func 节点销毁时执行的回调函数
arg 传入回调函数 func 中

返回值:

示例:

void func(THashNode *node, void *arg)
{
    int len;
    char *str = THashGetString(node, &len);
    printf("str=%s\n", str);
}
THashDestroy(hash, func, NULL);

注解:销毁每个哈希节点和整个 THash 数据结构,在销毁每个哈希节点之前都回调参数 func 函数,使得用户可以关联的资源。

重置 THash 节点

void THashReset(THash *str_id_hash, THashNodeDestroy_Func func, void *arg);

功能:重置 THash 节点

参数:

参数 说明
str_id_hash THash 数据结构
func 节点重置时执行的回调函数
arg 传入回调函数 func 中

返回值:

示例:

void func(THashNode *node, void *arg)
{
    int len;
    char *str = THashGetString(node, &len);
    printf("str=%s\n", str);
}
THashReset(hash, func, NULL);

通过节点名称查找 THash 节点

THashNode *THashStringFind(THash *str_hash, const char *name, Tint len, Tbool if_add);

功能:通过节点名称查找 THash 节点

参数:

参数 说明
str_hash THash 数据结构
name 节点名称
len name的长度
if_add 如果要查找的节点不存在时是否新建一个节点并返回

返回值:查找结果

如果要查找的节点存在则返回该节点指针

如果要查找的节点不存在且 if_add 为 TRUE 则新建一个节点并返回该节点指针

如果要查找的节点不存在且 if_add 为 FALSE 则返回NULL

示例:

THashNode *node = THashStringFind(style_type_hash, str, -1, TRUE);
THashNodeSetData(node, (void*)"hello");

通过节点ID查找 THash 节点

THashNode *THashIDFind(THash *id_hash, Tuintp id, Tbool if_add);

功能:通过节点ID查找 THash 节点

参数:

参数 说明
id_hash THash数据结构
id 节点ID,不能为None
if_add 如果要查找的节点不存在时是否新建一个节点并返回

返回值:查找结果

如果要查找的节点存在则返回该节点指针

如果要查找的节点不存在且 if_add 为 TRUE 则新建一个节点并返回该节点指针

如果要查找的节点不存在且 if_add 为 FALSE 则返回NULL

释放当前 THash 节点

void THashFreeNode(THash *str_id_hash, THashNode *hash);

功能:释放当前 THash 节点

参数:

参数 说明
str_id_hash THash 数据结构
hash 将要被释放的 THash 节点

返回值:

获取 THash 节点的字符串标识

const char *THashGetString(THashNode *hash, Tint *len);

功能:获取 THash 节点的字符串标识

参数:

参数 说明
hash THash 节点指针
len 保存字符串标识长度

返回值:THash 节点的字符串标识

获取 THash 节点整数 ID 标识

Tuintp THashGetID(THashNode *hash);

功能:获取 THash 节点整数 ID 标识

参数:

参数 说明
hash THash 节点指针

返回值:THash 节点整数ID标识

给 THash 节点关联一个用户指针

void THashNodeSetData(THashNode *hash, void *data);

功能:给 THash 节点关联一个用户指针

参数:

参数 说明
hash THash 节点指针
data 用户指针

返回值:

获取当前 THash 节点关联的用户指针

void *THashNodeGetData(THashNode *hash);

功能:获取当前 THash 节点关联的用户指针

参数:

参数 说明
hash THash 节点指针

返回值:当前 THash 节点关联的用户指针

遍历每一个THash节点对节点遍历顺序不一定和节点的创建顺序相同

THashNode * THashVisitEach(THash *str_id_hash, THashNodeVisit_Func func, void *arg);

功能:遍历每一个THash节点对节点遍历顺序不一定和节点的创建顺序相同

参数:

参数 说明
str_id_hash THash 数据结构
func 遍历每一个节点都会回调的回调函数
arg 用户参数,会传递到回调函数func中

返回值:终止遍历时的THashNode;如果没有终止遍历, 返回NULL

将字符串转成哈希ID

Tuintp TString2HashID(const char *str, Tint len);

功能:将字符串转成哈希ID

参数:

参数 说明
str 传入字符串地址
len 传入字符串固定长度

返回值:返回哈希ID

将字符串转成哈希ID

Tuintp TString2HashID2(const char *str, Tint *plen);

功能:将字符串转成哈希ID

参数:

参数 说明
str 传入字符串地址,长度不固定,'\0' 结束
plen 得到传入长度len

返回值:返回哈希ID

TTable

TTable回调函数类型定义

节点排序

typedef int (*TTableQuickSort_func)(const TTableNode *n1, const TTableNode *n2, void *arg);

功能:节点快速排序回调函数原型

参数:

参数 说明
n1 节点1
n2 节点2
arg 排序函数 TTableQuickSort 的传递的用户参数

返回值:TRUE 节点1和节点2互换顺序,FALSE 节点1和节点2顺序保持不变

TTable节点操作接口

创建TTable

TTable *TTableCreate(void);

功能:创建一个空表

参数:

返回值:TTable 对象

示例:

/*创建一个表*/
TTable *my_table = TTableCreate();

清空TTable

void TTableReset(TTable *table);

功能:销毁所有节点,释放节点内存,回到新创建时的状态

参数:

参数 说明
table TTable 对象

返回值:

示例:

/*清空我的表*/
TTableReset(my_table);

销毁TTable

void TTableDestroy(TTable *table);

功能:销毁所有节点和TTable本身,释放所有内存

参数:

参数 说明
table TTable 对象

返回值:

示例:

/*摧毁我的表*/
TTableDestroy(my_table);

打印TTable

void TTableDump(TTable *table);

功能:打印一个TTable的内容,用于调试

参数:

参数 说明
table TTable 对象

返回值:

打印:

/*打印我的表*/
TTableDump(my_table);
/*结果演示*/
{
    name="xiaoBlue"
    age=23
}

复制TTable(创建)

TTable *TTableCopy(TTable *src, TTable *dst);

功能:复制一个TTable的内容

参数:

参数 说明
src 源 TTable
dst 目标 TTbale

返回值:返回 dst, 如果(src!=NULL)&&(dst==NULL) 就创建一个返回

示例:

TTable *dst_table = TTableCreate();
TTableCopy(src_table, dst_table);
TTableDump(dst_table);

复制TTable

TTable *TTableDuplicate(TTable *table);

功能:复制的 TTable 需要用户自己销毁等同于TTableCopy(table, NULL)

参数:

参数 说明
table 源 TTable

返回值:复制后的 TTable

节点个数

Tint TTableGetCount(TTable *table);

功能:获取TTable节点个数

参数:

参数 说明
table TTable 对象

返回值:table 的节点个数

示例:

int count = TTableGetCount(table);

父节点

TTable *TTableGetParent(TTable *table);

功能:获取TTable的父节点

参数:

参数 说明
table TTable 对象

返回值:TTable 的父节点

示例:

TTable *parent = TTableGetParent(table);

创建和查找

TTableNode *TTableGetNode(TTable *table, T_ID id, Tbool if_create);

功能:创建或查找table中为id的节点

参数:

参数 说明
table TTable 对象
id 要查找的节点 id,如果id 为 None,就增加一个空节点
if_create 为TRUE 则增加一个空节点并返回,否则返回NULL

返回值:如果节点存在则返回此节点指针,否则返回NULL

示例:

TTableNode *node = TTableGetNode(table, TStrigID("node"), True);
TTableNodeSetInt(node, 0);

序号查找

TTableNode *TTableGetIndexNode(TTable *table, Tint index);

功能:获取table中指定序号index的节点

参数:

参数 说明
table TTable 对象
index 节点序号,取值范围为[0,节点个数-1]

返回值:指定序号的节点,节点个数为0则返回NULL

示例:

for(int i = 0 ;i < TTableGetCount(table); i++)
{
    TTableNode *node = TTableGetIndexNode(table, i);
    int val = TTableNodeGetInt(node, TStringID("val"));
    printf("val = %d\n", val);
}

删除节点

void TTableDeleteNode(TTable *table, TTableNode *node);

功能:删除table中的node节点,该函数的时间是O(n)

参数:

参数 说明
table TTable 对象
node 要删除的节点

返回值:

示例:

TTableDeleteNode(table, TTableGetNode(table, TStrigID("node"), True));

整型节点赋值

Tint TTableNodeSetInt(TTableNode *tnode, Tintp value);

功能:给整数型节点tnode赋值value,首次赋值也可理解为创建一个整型的节点并赋值

参数:

参数 说明
tnode 节点对象
value 需要设置的值

返回值:类型不对返回-1,修改成功返回0

示例:

TTableNodeSetInt(node, 0);

浮点型节点赋值

Tint TTableNodeSetFloat(TTableNode *tnode, TFloat value);

功能:给浮点型节点tnode赋值value,首次赋值也可理解为创建一个浮点型的节点并赋值

参数:

参数 说明
tnode 节点对象
value 需要设置的值

返回值:类型不对返回-1,修改成功返回0

示例:

TTableNodeSetFloat(node, 1);

给指针型节点赋值

Tint TTableNodeSetPointer(TTableNode *tnode, void *value);

功能:给指针型节点tnode赋值value,首次赋值也可理解为创建一个指针型的节点并赋值

参数:

参数 说明
tnode 节点对象
value 需要设置的值

返回值:类型不对返回-1,修改成功返回0

TTableNodeSetPointer(node, (void *)value);

表格型节点赋值

Tint TTableNodeSetTable(TTableNode *tnode, TTable *value);

功能:给表格型节点tnode赋值value并自动释放以前的table,首次赋值也可理解为创建一个表格型的节点并赋值

参数:

参数 说明
tnode 节点对象
value 需要设置的值

返回值:类型不对返回-1,修改成功返回0

示例:

TTable *value = TTableCreate();
TTableNodeSetTable(node, value);

字符串型节点赋值

Tint TTableNodeSetString(TTableNode *tnode, const char *value, Tint len);

功能:给字符串型节点tnode赋值value,首次赋值也可理解为创建一个字符串型的节点并赋值

参数:

参数 说明
tnode 节点对象
value 需要设置的值
len 如果len==-1,那么len=strlen(value);如果len==0,那么value==NULL;如果len > 0,那么内部分配(len+1)内存,拷贝value内存,并末尾置'\0'

返回值:类型不对返回-1,修改成功返回0

示例:

TTableNodeSetString(node, "hello world", -1);

节点类型

TTableNodeTypeEnum TTableNodeGetType(TTableNode *tnode);

功能:获取节点tnode的值的类型

参数:

参数 说明
tnode 节点对象

返回值:当前节点的值的类型

示例:

TTableNodeTypeEnum type = TTableNodeGetType(node);

节点ID

T_ID TTableNodeGetID(TTableNode *tnode);

功能:获取节点tnode的ID

参数:

参数 说明
tnode 节点对象

返回值:当前节点的ID

示例:

T_ID type = TTableNodeGetID(node);

获取整型节点值

Tintp TTableNodeGetInt(TTableNode *tnode);

功能:获取整数型节点tnode的值

参数:

参数 说明
tnode 节点对象

返回值:节点不存在返回0,否则返回当前节点的值;返回0也有可能是节点值本身就是0,或者类型不匹配

示例:

int value = TTableNodeGetInt(node);

获取浮点型节点值

TFloat TTableNodeGetFloat(TTableNode *tnode);

功能:获取浮点型节点tnode的值

参数:

参数 说明
tnode 节点对象

返回值:节点不存在返回0,否则返回当前节点的值;返回0也有可能是节点值本身就是0,或者类型不匹配

示例:

TFloat value = TTableNodeGetFloat(node);

获取指针型节点值

void *TTableNodeGetPointer(TTableNode *tnode);

功能:获取指针型节点tnode的值

参数:

参数 说明
tnode 节点对象

返回值:节点不存在返回NULL,否则返回当前节点的值;返回NULL也有可能是节点值本身就是NULL,或者类型不匹配

示例:

TTable *value = TTableNodeGetPointer(node);

获取字符串型节点值

char *TTableNodeGetString(TTableNode *tnode, Tint *len);

功能:获取字符串型节点tnode的值

参数:

参数 说明
tnode 节点对象
len 当前节点值的长度

返回值:节点不存在返回NULL,否则返回当前节点的值;返回NULL也有可能是节点值本身就是NULL,或者类型不匹配

示例:

char *str = TTableNodeGetString(node, &len);

获取表格型节点的值

TTable * TTableNodeGetTable(TTableNode *tnode, Tbool bring_out);

功能:获取表格型节点tnode的值

参数:

参数 说明
tnode 节点对象
bring_out 是否把里面的table 指针赋NULL

返回值:节点不存在返回NULL,否则返回当前节点的值;返回NULL也有可能是节点值本身就是NULL,或者类型不匹配

示例:

TTable *value = TTableNodeGetTable(node, True);

序列化内存大小

Tint TTableStringLength(TTable *table);

功能:获取table序列化所需的内存大小

参数:

参数 说明
table 需要序列化的table

返回值:序列化所需的内存大小

示例:

Tint size = TTableStringLength(table);

序列化table

char *TTableToString(TTable *table, Tint *size);
Tint TTableToString2(TTable *table, char *buf);

功能:把table序列化成一段连续内存

参数:

参数 说明
table 需要序列化的table
size 返回内存大小
buf 用户提供序列化的内存

返回值:TTableToString返回序列化内存的首地址;TTableToString2返回实际使用的内存大小,但要保证用户提供内存 buf 足够大

示例:

char *str = TTableToString(table, &size);

反序列化table

TTable *TTableFromString(const char *buf, Tint size);
TTable *TTableFromString2(const char *buf, Tint size);

功能:从一段指定大小size的内存buf中反序列化重构table

参数:

参数 说明
buf 需要反序列化的内存地址
size 内存大小

返回值:反序列化后重构的 table;TTableFromString2会重构 table,table中的字符串项不拷贝,而是直接指向 buf 中的内容。

示例:

TTable *t = TTableFromString(buf, sizeof(buf));

序列化table(文件)

void TTableSaveToFile(TTable *table, const char *file);

功能:把table序列化成二进制数据文件file

参数:

参数 说明
table 传入table地址
file 传入文件地址

返回值:

示例:

TTableSaveToFile(table, TGetExecutePath("../etc/info.ini"));

反序列化table(文件)

TTable *TTableLoadFromFile(const char *file);

功能:从序列化的二进制数据文件file中加载table

参数:

参数 说明
file 传入序列化文件地址

返回值:TTable 传入从序列化的二进制文件中加载的table

示例:

TTable *value = TTableLoadFromFile(TGetExecutePath("../etc/info.ini"));

节点排序

void TTableQuickSort(TTable * table, TTableQuickSort_func sort_func, void *arg);

功能:将table的节点按照sort_func的规则排序

参数:

参数 说明
table 需要排序的table
sort_func 回调函数
arg 传递到回调函数中的用户参数参数

返回值:

示例:

int sort_func(const TTableNode *n1, const TTableNode *n2, void *arg)
{
    if (TTableNodeGetInt(n1)>=TTableNodeGetInt(n2))
        return 1;
    return 0;
}
TTableQuickSort(table, sort_func, NULL);

字符串转TTable

TTable *TParseTableString(TTable *table, const char *buf, Tint len);

功能:将一个字符串buf转化成TTable结构

参数:

参数 说明
table 为NULL时内部会创建一个新的 table 并返回,否则将file中的内容加入到已有的table中
buf 要转化的字符串首地址
len 字符串长度

返回值:转化后的 TTable 结构

示例:

TTable *t = TParseTableString(table, buf, strlen(buf));

过滤文本

void TFileWriteCFGParse_filter(int fd, struct CFG_Context *parse);

功能:过滤文本的功能 过滤规则:

        - 去掉"#" 注释
        - 消除UTF-8 BOM 标记的代码
        - 去掉文本中的'\0'
        - 最后增加一个'\n'

参数:

参数 说明
fd 文件描述符
parse 要处理的文本内容

返回值:

TTable化配置文件

TTable *TLoadIniFile(TTable *table, const char *file, TIniFileFlag_Func func);

功能:将配置文件file中的内容读取到一个TTable中

参数:

参数 说明
table 为NULL时内部会创建一个新的 table 并返回,否则将file中的内容加入到已有的table中
file 文件路径
func 一般传 NULL

返回值:TTable 返回从文件读取到的TTable

示例:

TTable *table = TLoadIniFile(NULL, TGetExecutePath("../etc/info.ini"), NULL);

保存TTable到配置文件

void TSaveIniFile(TTable *table, const char *file);

功能:将TTable中的内容保存到配置文件file中

参数:

参数 说明
table 要保存的 TTable
file 文件路径

返回值:

示例:

TSaveIniFile(table, TGetExecutePath("../etc/info.ini"));

results matching ""

    No results matching ""