glib提供了普通的单向链表和双向链表,分别是GSList和GList。
创建链表、添加一个元素的代码:
GSList*list = NULL;
gchar*element = g_strdup("a string");
list= g_slist_append(list, element);
删除上面添加的元素并清空链表:
list= g_slist_remove(list, element);
为了清除整个链表,可使用g_slist_free(),它会快速删除所有的链接;
g_slist_free()只释放链表的单元,它并不知道怎样操作链表内容。
访问链表的元素,可以直接访问GSList结构:
gchar*my_data = list->data;
为了遍历整个链表,可以如下操作:
GSList*tmp = list;
while(tmp != NULL)
{
printf("Listdata: %p/n", tmp->data);
tmp= g_slist_next(tmp);
}
下面的代码可以用来有效地向链表中添加数据:
voidefficient_append(GSList** list, GSList** list_end, gpointer data)
{
g_return_if_fail(list!= NULL);
g_return_if_fail(list_end!= NULL);
if(*list == NULL)
{
g_assert(*list_end== NULL);
*list= g_slist_append(*list, data);
*list_end= *list;
}
else
{
*list_end= g_slist_append(*list_end, data)->next;
}
}
要使用这个函数,应该在其他地方存储指向链表和链表尾的指针,并将地址传递给efficient_append():
GSList*list = NULL;
GSList*list_end = NULL;
efficient_append(&list,&list_end, g_strdup("Foo"));
efficient_append(&list,&list_end, g_strdup("Bar"));
efficient_append(&list,&list_end, g_strdup("Baz"));
函数列表:访问链表中的数据
#include<glib.h>
GSList*g_slist_find(GSList* list,gpointer data)
GSList*g_slist_nth(GSList* list,guint n)
gpointerg_slist_nth_data(GSList* list,guint n)
GSList*g_slist_last(GSList* list)
gintg_slist_index(GSList* list,gpointer data)
voidg_slist_foreach(GSList* list,GFunc func,gpointer user_data)
联系客服