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