Списки являются простейшим примером из этих трех структур и поддерживают только вышеперечисленные возможности.
Хвостовые очереди имеют также такие возможности:
Однако:
Циклические очереди имеют такие дополнительные возможности:
Однако:
В определениях макросов Fa TYPE является названием структуры, определяемой пользователем, которая должна содержать поле типа LIST_ENTRY TAILQ_ENTRY или CIRCLEQ_ENTRY с названием Fa NAME . Аргумент Fa HEADNAME является названием структуры, определяемой пользователем, которая должна быть объявлена, используя макрос LIST_HEAD TAILQ_HEAD или CIRCLEQ_HEAD Смотрите далее приведенные примеры для более подробного пояснения использования этих макросов.
LIST_HEAD(HEADNAME, TYPE) head;
где Fa HEADNAME является названием определяемой структуры, а Fa TYPE является типом элементов, связанных в списке. Указатель на заголовок списка может быть в дальнейшем быть объявлен, как:
struct HEADNAME *headp;
(Названия head и headp выбираются пользователем.)
Макрос LIST_ENTRY объявляет структуру, соединяющую элементы в списке.
Макрос LIST_INIT инициализирует список, ссылающийся на Fa head .
Макрос LIST_INSERT_HEAD вставляет новый элемент Fa elm в начало списка.
Макрос LIST_INSERT_AFTER вставляет новый элемент Fa elm после элемента Fa listelm .
Макрос LIST_REMOVE удаляет элемент Fa elm из списка.
LIST_HEAD(listhead, entry) head;
struct listhead *headp; /* заголовок списка */
struct entry {
...
LIST_ENTRY(entry) entries; /* список */
...
} *n1, *n2, *np;
LIST_INIT(&head); /* инициализация списка */
n1 = malloc(sizeof(struct entry)); /* вставка в начало */
LIST_INSERT_HEAD(&head, n1, entries);
n2 = malloc(sizeof(struct entry)); /* вставка после */
LIST_INSERT_AFTER(n1, n2, entries);
/* продвижение вперед */
for (np = head.lh_first; np != NULL; np = np->entries.le_next)
np-> ...
while (head.lh_first != NULL) /* удаление */
LIST_REMOVE(head.lh_first, entries);
TAILQ_HEAD(HEADNAME, TYPE) head;
где HEADNAME является названием определяемой структуры, а TYPE является типом связываемых элементов в хвостовой очереди. Указатель на заголовок хвостовой очереди может быть далее определен так:
struct HEADNAME *headp;
(Названия head и headp выбираются пользователем.)
Макрос TAILQ_ENTRY объявляет структуру, связывающую элементы в хвостовой очереди.
Макрос TAILQ_INIT инициализирует хвостовую очередь, на которую ссылается Fa head .
Макрос TAILQ_INSERT_HEAD вставляет новый элемент Fa elm в начало хвостовой очереди.
Макрос TAILQ_INSERT_TAIL вставляет новый элемент Fa elm в конец хвостовой очереди.
Макрос TAILQ_INSERT_AFTER вставляет новый элемент Fa elm после элемента Fa listelm .
Макрос TAILQ_REMOVE удаляет элемент Fa elm из хвостовой очереди.
TAILQ_HEAD(tailhead, entry) head;
struct tailhead *headp; /* заголовок хвостовой очереди */
struct entry {
...
TAILQ_ENTRY(entry) entries; /* хвостовая очередь */
...
} *n1, *n2, *np;
TAILQ_INIT(&head); /* инициализация очереди */
n1 = malloc(sizeof(struct entry)); /* вставка в начало */
TAILQ_INSERT_HEAD(&head, n1, entries);
n1 = malloc(sizeof(struct entry)); /* вставка в хвост */
TAILQ_INSERT_TAIL(&head, n1, entries);
n2 = malloc(sizeof(struct entry)); /* вставка после */
TAILQ_INSERT_AFTER(&head, n1, n2, entries);
/* вперед по очереди */
for (np = head.tqh_first; np != NULL; np = np->entries.tqe_next)
np-> ...
/* удаление */
while (head.tqh_first != NULL)
TAILQ_REMOVE(&head, head.tqh_first, entries);
CIRCLEQ_HEAD(HEADNAME, TYPE) head;
где HEADNAME является названием определяемой структуры, а TYPE является типом связываемых элементов в циклической очереди. Указатель на заголовок циклической очереди может быть далее определен, как:
struct HEADNAME *headp;
(Названия head и headp выбираются пользователем.)
Макрос CIRCLEQ_ENTRY объявляет структура, соединяющую элементы в циклической очереди.
Макрос CIRCLEQ_INIT инициализирует циклическую очередь, на которую указывает Fa head .
Макрос CIRCLEQ_INSERT_HEAD вставляет новый элемент Fa elm в начало циклической очереди.
Макрос CIRCLEQ_INSERT_TAIL вставляет новый элемент Fa elm в конец циклической очереди.
Макрос CIRCLEQ_INSERT_AFTER вставляет новый элемент Fa elm после элемента Fa listelm .
Макрос CIRCLEQ_INSERT_BEFORE вставляет новый элемент Fa elm перед элементом Fa listelm .
Макрос CIRCLEQ_REMOVE удаляет элемент Fa elm из циклической очереди.
CIRCLEQ_HEAD(circleq, entry) head;
struct circleq *headp; /* заголовок циклической очереди */
struct entry {
...
CIRCLEQ_ENTRY(entry) entries; /* циклическая очередь */
...
} *n1, *n2, *np;
CIRCLEQ_INIT(&head); /* инициализация циклической очереди */
n1 = malloc(sizeof(struct entry)); /* вставка заголовка */
CIRCLEQ_INSERT_HEAD(&head, n1, entries);
n1 = malloc(sizeof(struct entry)); /* вставка в хвост */
CIRCLEQ_INSERT_TAIL(&head, n1, entries);
n2 = malloc(sizeof(struct entry)); /* вставка после */
CIRCLEQ_INSERT_AFTER(&head, n1, n2, entries);
n2 = malloc(sizeof(struct entry)); /* вставка перед */
CIRCLEQ_INSERT_BEFORE(&head, n1, n2, entries);
/* вперед по очереди */
for (np = head.cqh_first; np != (void *)&head; np = np->entries.cqe_next)
np-> ...
/* назад по очереди */
for (np = head.cqh_last; np != (void *)&head; np = np->entries.cqe_prev)
np-> ...
/* удаление */
while (head.cqh_first != (void *)&head)
CIRCLEQ_REMOVE(&head, head.cqh_first, entries);
|
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |