GSList是一個單向鏈結(Link)的節點,其定義如下:
typedef struct {
gpointer data;
GSList *next;
} GSList;
data是節點資料(物件)的位址資訊,next是下一個節點資料的位址資訊,搭配 GSList 的相關函式,您可以簡單的進行鏈結節點的附加、插入、刪除等動作,例如使用g_slist_append()、g_slist_prepend()附加節點,使用g_slist_sort()進行排序等。
下面這個程式是個簡單的示範,使用GSList實作堆疊:
#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 說明文件。
|
|