Списки являются простейшим примером из этих трех структур и поддерживают только вышеперечисленные возможности.
Хвостовые очереди имеют также такие возможности:
Однако:
Циклические очереди имеют такие дополнительные возможности:
Однако:
В определениях макросов 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-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |