GSList、GList


GSList是一個單向鏈結(Link)的節點,其定義如下:
typedef struct {
  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


GList則是雙向鏈結,其定義如下:
typedef struct {
  gpointer data;
  GList *next;
  GList *prev;
} GList;

prev是指向前一個節點,關於其搭配使用的函式,可參考 GList 說明文件。