Подтвердить что ты не робот

Минимальный пример использования TAILQ из библиотеки <sys/queue.h>

Может ли кто-нибудь предоставить минимальный пример использования TAILQ из библиотеки Linux linux с объяснением в c, который может быть скомпилирован с использованием gcc в Linux?

4b9b3361

Ответ 1

Макрос TAILQ_ENTRY используется для установки указателей, используемых для вставки элементов в список. Вы помещаете его в свою структуру, которую хотите перечислить.

struct foo {
    TAILQ_ENTRY(foo) tailq;
    int datum;
    /* ... */
};

TAILQ_HEAD используется для определения структуры, которая будет действовать как контейнер для элементов списка ссылок. Вы предоставляете ему имя структуры и имя типа, который будет содержать.

TAILQ_HEAD(fooq, foo);

Используйте TAILQ_INIT для инициализации экземпляра вашего контейнера списка.

struct fooq q;
TAILQ_INIT(&q);

Используйте макросы TAILQ_INSERT_* для добавления элементов.

struct foo data[3] = { foo(3), foo(7), foo(1) };
TAILQ_INSERT_HEAD(&q, &data[0], tailq);
TAILQ_INSERT_AFTER(&q, &data[0], &data[1], tailq);
TAILQ_INSERT_TAIL(&q, &data[2], tailq);

Вы можете использовать TAILQ_FOREACH и TAILQ_FOREACH_REVERSE для перемещения по списку.

struct foo *p;
TAILQ_FOREACH(p, &q, tailq) {
    printf(" %d", p->datum);
}
puts("");

Если вы хотите перебирать список при удалении всех его элементов, возможно, проще использовать цикл while и использовать макросы TAILQ_EMPTY и TAILQ_FIRST.

while (!TAILQ_EMPTY(&q)) {
    p = TAILQ_FIRST(&q);
    TAILQ_REMOVE(&q, p, tailq);
    /* ... */
}

Вышеприведенный код был в основном составлен дословно из примера, который я написал и протестировал на IDEONE.