GTK+ 2.0 Tutorial |
||
---|---|---|
GLib |
Следующие функции используются для создания, управления и уничтожения стандартных списков двойной связи. Каждый элемент в списке содержит часть данных, вместе с указателями, которые связываются с предыдущими и следующими элементами в списке. Это позволяет легко передвигаться по списку в любом направлении. Элемент данных имеет тип "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 );
|
GLib |
Singly Linked Lists |