Может ли кто-нибудь предоставить минимальный пример использования TAILQ из библиотеки Linux linux с объяснением в c, который может быть скомпилирован с использованием gcc в Linux?
Минимальный пример использования TAILQ из библиотеки <sys/queue.h>
Ответ 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.