最近的几个课题都是网络编程,发现链表非常常用。现在正在和C语言热恋中,不太愿意再碰C++了,于是需要一个C语言的链表库。今天找到了一个叫做simclist的库,发现非常好用。在此分享一下。
这是官方网站。
先看最基本的用法:
#include "simclist.h"
#include <stdio.h>
int main(void)
{
list_t list;
int i;
list_init(&list);
scanf("%d", &i);
list_append(&list, &i);
printf("You input %d\n",
list_get_at(&list, 0));
list_destroy(&list);
return 0;
}
如果仅此而已,只能把数据按地址存入,那么意义不大。
可以将数据按值复制到链表中。需要定义一个函数,用于把地址作为参数传入时,可以返回数据的大小。
同时,如果想要支持排序,则需要传入一个比较函数。
对于内置的数据类型,在库中都有现成的度量和比较函数。
现在看一下它的强大之处吧!存入了不定长的字符串!
#include "simclist.h"
#include <string.h>
#include <stdio.h>
int main(void)
{
char str[20];
list_t l;
list_init(&l);
/*使用字符串度量函数,1表示每个节点的内存均要在删除时释放*/
/*只有这样才是按值存储*/
list_attributes_copy(&l, list_meter_string, 1);
/*使用字符串比较函数,可以支持sort操作*/
list_attributes_comparator(&l, list_comparator_string);
scanf("%s", str);
while(strcmp(str, "quit") != 0) {
list_append(&l, str);
scanf("%s", str);
}
/*如果第2个参数是-1,则是反向排序*/
list_sort(&l, 1);
/*迭代遍历操作*/
list_iterator_start(&l);
while (list_iterator_hasnext(&l)){
printf("%s\n", (char*)list_iterator_next(&l));
}
/*一定要有遍历结束的函数,否则其它的诸如append
的操作会出现问题*/
list_iterator_stop(&l);
/*释放所有的内存空间*/
list_destroy(&l);
return 0;
}