简单实例
定义一个decoder
的buffer_list
:
GList* buffer_list;
在使用这个buffer_list
的时候,没有g_list_alloc
分配内存,直接通过g_list_append
把数据append
进list
里面就可以:
if (!dec->buffer_list) {
dec->buffer_list = g_list_alloc();
}
g_list_append
将一个新元素加入到链表尾,函数返回list
的新起点,这个起点可能已经改变。如下,返回值又赋值给了dec->buffer_list:
dec->buffer_list = g_list_append(dec->buffer_list, frame);
在gstreamer中比较多见的对list的遍历:
g_mutex_lock (&priv->mutex);
for (l = msdk_resp->surfaces_avail; l; l = l->next) {
surface = l->data;
if (!surface->Data.Locked) {
msdk_resp->surfaces_avail =
g_list_remove (msdk_resp->surfaces_avail, surface);
msdk_resp->surfaces_used =
g_list_prepend (msdk_resp->surfaces_used, surface);
break;
}
}
g_mutex_unlock (&priv->mutex);
GList的整体概念
GList
结构及其相关函数提供了一个标准的双链接列表数据结构。
GList
是GLib
中的双向链表,其每个元素都包含一块数据和指向前后元素的指针。存储的数据类型是gpointer,在GLib中,gpointer指向实际数据的指针。
要增加元素,可以使用g_list_append()
, g_list_prepend()
, g_list_insert()
和g_list_insert_sorted()
。
要删除元素,使用g_list_remove()
。
要查找列表中的元素,使用g_list_first()
, g_list_last()
, g_list_next()
, g_list_previous()
, g_list_nth()
, g_list_nth_data()
, g_list_find()
和 g_list_find_custom()
。
要找到一个元素的索引,使用g_list_position()
和g_list_index()
。
要为列表中的每个元素调用一个函数,使用g_list_foreach()
。
要释放整个列表,使用g_list_free()
。
GList的原型定义:
/usr/include/glib-2.0/glib/glist.h
typedef struct _GList GList;
struct _GList
{
gpointer data;
GList *next;
GList *prev;
};
GList提供的函数:
// 将一个新元素加入到链表尾
GList *g_list_append(GList *list, gpointer data);
// 将一个新元素加入到链表头
GList *g_list_prepend(GList *list, gpointer data);
// 插入一个新元素到链表的指定位置
GList *g_list_insert(GList *list, gpointer data, gint position);
// 从链表中移除一个具有值data的元素,如果元素不存在,则链表不变
GList *g_list_remove(GList *list, gpointer data);
// 数释放由GList使用的所有存储区
GList *g_list_free(GList *list);
// 从GList中移除一个元素,但不释放该元素。
// 被删除的元素的上一个和下一个链接被设置为NULL,这样它就成为一个有一个元素的独立的列表。
GList *g_list_remove_link(GList *list, GList *link);
// 链表元素位置反转
GList *g_list_reverse(GList *list);
// 获取指定位置元素
GList *g_list_nth(GList *list, gint n);
// 在链表中查找一个含有指定值的元素,没有则返回NULL
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 data);
// 返回指定元素在链表中的位置,没有找到匹配的元素,则返回-1,元素位置从0开始计算
gint g_list_index(GList *list, gconstpointer data);