Github地址: https://github.com/wujin1989/cdk
cdk的 list 是基于双向循环链表实现,queue 和 stack 基于 list实现。
所以cdk用一个双向循环链表实现了三种数据结构。
如何使用cdk的链表:
#include "cdk.h"
typedef struct T {
list_node_t node;
int numb;
}T;
int main(void) {
list_t Tlist;
cdk_list_create(&Tlist);
//插入10个T类型元素到链表
for (int i = 0; i < 10; i++) {
T* t = malloc(sizeof(T));
if (!t) {
return -1;
}
t->numb = i;
cdk_list_init_node(&t->node);
cdk_list_insert_tail(&Tlist, &t->node);
}
//遍历链表
for (list_node_t* x = cdk_list_head(&Tlist); x != cdk_list_sentinel(&Tlist); x = cdk_list_next(x)) {
T* t = cdk_list_data(x, T, node);
printf("list element: %d\n", t->numb);
}
//删除链表中某个元素
for (list_node_t* x = cdk_list_head(&Tlist); x != cdk_list_sentinel(&Tlist); ) {
T* t;
t = cdk_list_data(x, T, node);
x = cdk_list_next(x);
if (t->numb == 5) {
cdk_list_remove(&t->node);
free(t);
t = NULL;
}
}
printf("---------------\n");
//遍历链表
for (list_node_t* x = cdk_list_head(&Tlist); x != cdk_list_sentinel(&Tlist); x = cdk_list_next(x)) {
T* t = cdk_list_data(x, T, node);
printf("list element: %d\n", t->numb);
}
return 0;
}
上面程序虽然Tlist是一个包含T类型的链表,但是真正干链表事的是每个T类型里的node成员。
可能刚开始看这种链表有点复杂,但是当了解这种链表的好处后,你就会爱不释手。
这种链表灵活,零拷贝等特性让我们没有理由不用。
如果你还在使用各种数据结构书上那种实现链表的方式?那么,是时候该换下口味了。
那些链表实现有下面几个问题:
- 数据类型强关联
- 不是零拷贝
好了,使用过list后,又由于 queue,stack是基于list阉割的,所以 *** 作和list基本一样。
怎么样?是不是很简单。
快点尝试下吧!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)