最近的幾個課題都是網絡編程,發現鏈表非常常用。現在正在和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;
}