以下的函数用于创建、管理和销毁标准双向链表。链表中每个元素都包含一块数据和指向前后元素的指针。这使得通过链表的双向移动变的容易。数据项的类型是 "gpointer",意指数据可为一指向实际数据的指针或 (通过类型转换) 为一数值(但不要设想 int 和 gpointer 有相同的大小!)。这些函数在内部按块为链表元素分配空间,这比单为每个元素分配空间更有效率。
不存在专用于创建链表的函数。而是简单地创建一个类型为 Glist* 的变量,并把它的值设置为 NULL;NULL被当作空表。
向链表中加入一个新元素,使用函数 g_list_append()、g_list_prepend()、g_list_insert() 或 g_list_insert_sorted() 。无论如何,函数都接收一个指向表头的指针作为参数,并返回一个指向表头的指针(可能和接收的指针不同)。因此,对所有添加或撤除链表元素的操作,一定要保存返回值!
GList *g_list_append( GList *list, gpointer data ); |
此函数把一个新元素(具有值data)加到链表尾。
GList *g_list_prepend( GList *list, gpointer data ); |
此函数把一个新元素(具有值data)加到链表头。
GList *g_list_insert( GList *list, gpointer data, gint position ); |
此函数插入一个新元素(具有值data)到链表中指定位置,如果位置是 0,它和 g_list_prepend() 函数作用相同,如果位置,它和 g_list_append() 函数作用相同。
GList *g_list_remove( GList *list, gpointer data ); |
此函数从表中移除一个具有值data的元素,如果该元素不存在,链表不变。
void g_list_free( GList *list ); |
此函数释放由Glist使用的所有存储区,如果表元素空间是通过动态分配的,则应首先被释放。
还有许多其它支持双向链表的Glib函数;查看文档获得更多的信息。这儿列出几个更有用的函数的声明:
GList *g_list_remove_link( GList *list, GList *link ); GList *g_list_reverse( GList *list ); GList *g_list_nth( GList *list, gint n ); GList *g_list_find( GList *list, gpointer data ); GList *g_list_last( GList *list ); GList *g_list_first( GList *list ); gint g_list_length( GList *list ); void g_list_foreach( GList *list, GFunc func, gpointer user_data ); |