2009年1月7日 星期三

Glib 就是懶.資料處理好手 - GList 雙向鏈結(Doubly-Linked)

Standard
許多資深的『慣C』老手,對雙向鏈結串列(Doubly-Linked List)應該並不陌生,這種資料結構被大量地應用在資料記錄,但這對於其他 Scripts Language 或一些高階語言的慣用者來說,卻是一個無法理解的存在,因為對他們來說,動態增減 Array 的數量和內容,是再平常不過且應該要存在的東西。

但對 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