GTK Gossip: 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 說明文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值