INIT_LIST_HEAD(&p->list);
Если структура данных создается статически во время компиляции и на нее есть непосредственная ссылка, то инициализацию можно выполнить следующим образом.
struct my_struct mine = {
.list = LIST_HEAD_INIT(mine.list),
.dog = 0,
.cat = NULL
};
Для того чтобы создать и инициализировать связанный список, можно использовать следующее объявление.
static LIST_HEAD(fox);
Эта команда позволяет статически создать связанный список с именем fox
Нет необходимости явно выполнять какие-либо операции со служебными полями элементов связанного списка. Вместо этого необходимо просто включить структуру узла связанного списка в вашу структуру данных, чтобы можно было легко манипулировать данными и выполнять прохождение по связанному списку.
Работа со связанными списками
Для работы со связанными списками ядро предоставляет семейство функций. Все они принимают указатели на одну или более структур list_head
.Интересно, что время выполнения всех этих функций масштабируется как
Для добавления элемента в связанный список можно использовать следующую функцию.
list_add(struct list_head *new, struct list head *head);
Эта функция добавляет узел new
head
. Поскольку связанный список является кольцевым и для него не существует понятий head
можно использовать указатель на любой элемент списка. Если в качестве рассмотренного параметра всегда передавать указатель на последний элемент, то эту функцию можно использовать для организации стека.Для добавления элемента в конец связанного списка служит следующая функция.
list_add_tail(struct list_head *new,
struct list_head *head);
Эта функция добавляет новый элемент new в связанный список сразу перед элементом, на который указывает параметр head
list_add()
, в качестве параметра head
можно передавать указатель на любой элемент списка. Эту функцию можно использовать для реализации очереди, если передавать указатель на первый элемент.Для удаления узла списка служит следующая функция.
list_del(struct list_head *entry);
Эта функция позволяет удалить из списка элемент, на который указывает параметр entry
entry
. Данная функция просто удаляет узел из списка. После вызова этой функции обычно необходимо удалить структуру данных, в которой находится узел list_head
.Для удаления узла из списка и повторной инициализации этого узла служит следующая функция.
list_del_init(struct list head *entry);
Эта. функция аналогична функции list_del()
list_head
из тех соображений, что эта структура данных больше не нужна в качестве элемента текущего списка и ее повторно можно использовать.Для перемещения узла из одного списка в другой предназначена следующая функция.
list_move(struct list_head *list, struct list_head *head);
Эта функция удаляет элемент list
head
.Для перемещения элемента из одного связанного списка в конец другого служит следующая функция.
list_move_tail(struct list_head *list,
struct list_head *head);
Эта функция выполняет то же самое, что и функция list_move()
head
.Для проверки того, пуст ли список, служит функция.
list_empty(struct list_head *head);
Эта функция возвращает ненулевое значение, если связанный список пуст, и нулевое значение в противном случае.
Для объединения двух не перекрывающихся связанных списков служит следующая функция.
list_splice(struct list_head *list,
struct list_head *head);
Эта функция вставляет список, на который указывает параметр list