Glib 就是懶.資料處理好手 - GList 雙向鏈結(Doubly-Linked)
許多資深的『慣C』老手,對雙向鏈結串列(Doubly-Linked List)應該並不陌生,這種資料結構被大量地應用在資料記錄,但這對於其他 Scripts Language 或一些高階語言的慣用者來說,卻是一個無法理解的存在,因為對他們來說,動態增減 Array 的數量和內容,是再平常不過且應該要存在的東西。
但對 C 語言卻不是如此,同樣的功能要利用『記憶體的控制技巧(俗稱資料結構)』,才能達成。但由於 GLib 的 GList 整合,使用鏈結串列時,已經不需要再自己對指標(Pointer)做許多低階的處理,這對『慣C』一族和 C 語言的新手來說,毫無疑問地是件好事。
這裡是個使用 GList 的範例,大致說明了基本的操作:
此外,最近在撰寫一些程式時,用了些奇淫技巧,以列出 GList 最前面 10 筆資料:
GLib 的出現,讓許多人可以丟掉手邊的『資料結構』工具書,真的是很便利呀。 :P
但對 C 語言卻不是如此,同樣的功能要利用『記憶體的控制技巧(俗稱資料結構)』,才能達成。但由於 GLib 的 GList 整合,使用鏈結串列時,已經不需要再自己對指標(Pointer)做許多低階的處理,這對『慣C』一族和 C 語言的新手來說,毫無疑問地是件好事。
這裡是個使用 GList 的範例,大致說明了基本的操作:
#include <glib.h>
typedef struct {
gchar *name;
gchar *tel;
} ContactNode;
int main() {
GList *contactlist = NULL;
GList *list = NULL;
ContactNode *node;
/* Fred's contact information */
node = (ContactNode *)g_new0(ContactNode, 1);
node->name = g_strdup("Fred Chien");
node->tel = g_strdup("0926333xxx");
/* add the node to the list */
contactlist = g_list_append(contactlist, node);
/* Penx contact information */
node = (ContactNode *)g_new0(ContactNode, 1);
node->name = g_strdup("Penx");
node->tel = g_strdup("09xxxxxxxx");
/* add the node to the list */
contactlist = g_list_append(contactlist, node);
/* print all of list */
for (list=contactlist;list;list=g_list_next(list)) {
node = (ContactNode *)list->data;
printf("Name: %s, Tel:%s\n", node->name, node->tel);
}
/* remove all */
for (list=contactlist;list;list=g_list_next(list)) {
contactlist = g_list_remove(contactlist, list->data);
}
return 0;
}
此外,最近在撰寫一些程式時,用了些奇淫技巧,以列出 GList 最前面 10 筆資料:
for (i=10, list=contactlist;(list) ? i : NULL;list=g_list_next(list), --i) {
node = (ContactNode *)list->data;
printf("Name: %s, Tel:%s\n", node->name, node->tel);
}
GLib 的出現,讓許多人可以丟掉手邊的『資料結構』工具書,真的是很便利呀。 :P
This condition expression:
回覆刪除list && i
is, IMO, more straightforward and readable than:
(list) ? i : NULL
Thanks for your nice comment, the condition expression is a general usage correctly. For most of situations, that's a right way to use it.
回覆刪除BTW, just for my note, I prefer the unusual expression, because it means I can stuff "for()" with more works in the future even if it's not readable.
compile時找不到"glib.h"
回覆刪除應該怎麼安裝呢?
我是使用Ubuntu
感謝您提供的精簡範例!
回覆刪除只是有點不大明白,資料應該是有兩筆
但印出來只有一筆被remove
{
contactlist = g_list_remove(contactlist, list->data);
printf("remove!\n");
}
是我哪裡弄錯了嗎? XD