GSList是一個單向鏈結(Link)的節點,其定義如下:
typedef struct {
gpointer data;
GSList *next;
} GSList;
gpointer data;
GSList *next;
} GSList;
data是節點資料(物件)的位址資訊,next是下一個節點資料的位址資訊,搭配 GSList 的相關函式,您可以簡單的進行鏈結節點的附加、插入、刪除等動作,例如使用g_slist_append()、g_slist_prepend()附加節點,使用g_slist_sort()進行排序等。
下面這個程式是個簡單的示範,使用GSList實作堆疊:
- gslist_demo.c
#include <glib.h>
void for_callback(GString *string, gpointer user_data) {
if(string) {
printf("%s\n", string->str);
}
}
int main(int argc, char *argv[]) {
GString *string;
GSList *list;
int select;
char input[10];
list = NULL; // 一開始是沒有節點的
while(TRUE) {
printf(
"\n請輸入選項(-1結束): (1)新增至堆疊 (2)刪除頂端值 (3)顯示所有內容");
printf("\n\$c>");
scanf("%d", &select);
if(select == -1) {
break;
}
switch(select) {
case 1:
printf("\n輸入值:");
scanf("%s", &input);
string = g_string_new(input);
list = g_slist_prepend(list, string);
break;
case 2:
string = list->data;
list = g_slist_remove(list, string);
printf("\n頂端值移除:%s", string->str);
break;
case 3:
g_slist_foreach(list, (GFunc) for_callback, NULL);
break;
default:
printf("\n選項錯誤!");
}
}
printf("\n");
g_slist_free(list);
return 0;
}
一個執行的結果如下所示:
請輸入選項(-1結束): (1)新增至堆疊 (2)刪除頂端值 (3)顯示所有內容
\$c>1
輸入值:caterpillar
請輸入選項(-1結束): (1)新增至堆疊 (2)刪除頂端值 (3)顯示所有內容
\$c>1
輸入值:momor
請輸入選項(-1結束): (1)新增至堆疊 (2)刪除頂端值 (3)顯示所有內容
\$c>1
輸入值:bush
請輸入選項(-1結束): (1)新增至堆疊 (2)刪除頂端值 (3)顯示所有內容
\$c>3
bush
momor
caterpillar
請輸入選項(-1結束): (1)新增至堆疊 (2)刪除頂端值 (3)顯示所有內容
\$c>2
頂端值移除:bush
請輸入選項(-1結束): (1)新增至堆疊 (2)刪除頂端值 (3)顯示所有內容
\$c>-1
\$c>1
輸入值:caterpillar
請輸入選項(-1結束): (1)新增至堆疊 (2)刪除頂端值 (3)顯示所有內容
\$c>1
輸入值:momor
請輸入選項(-1結束): (1)新增至堆疊 (2)刪除頂端值 (3)顯示所有內容
\$c>1
輸入值:bush
請輸入選項(-1結束): (1)新增至堆疊 (2)刪除頂端值 (3)顯示所有內容
\$c>3
bush
momor
caterpillar
請輸入選項(-1結束): (1)新增至堆疊 (2)刪除頂端值 (3)顯示所有內容
\$c>2
頂端值移除:bush
請輸入選項(-1結束): (1)新增至堆疊 (2)刪除頂端值 (3)顯示所有內容
\$c>-1
GList則是雙向鏈結,其定義如下:
typedef struct {
gpointer data;
GList *next;
GList *prev;
} GList;
gpointer data;
GList *next;
GList *prev;
} GList;
prev是指向前一個節點,關於其搭配使用的函式,可參考 GList 說明文件。