GTK+ 2.0 Tutorial

<<< Previous

GLib

Next >>>


Списки двойной связи

Следующие функции используются для создания, управления и уничтожения стандартных списков двойной связи. Каждый элемент в списке содержит часть данных, вместе с указателями, которые связываются с предыдущими и следующими элементами в списке. Это позволяет легко передвигаться по списку в любом направлении.  Элемент данных имеет тип "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(); если позиция - меньше чем 0, то результат аналогичен g_list_append().

GList *g_list_remove( GList *list, gpointer data );

Это удаляет из списка элемент со значением data; если элемент не существует, список не изменяется.

void g_list_free( GList *list );

Это освобождает всю память используемую GList.  Если элементы списка обращаются к динамически-распределенной памяти, то они должны быть сначала освобождены.

Есть много других функций GLib которые поддерживают списки двойной связи; для более подробной информации смотрите документацию 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 );

<<< Previous

Home

Next >>>

GLib

Up

Singly Linked Lists