<sys queue.h =“”>库</sys>中TAILQ使用的最小示例

时间:2014-03-11 02:21:44

标签: c linux gcc queue

有些人可以提供最简单的使用linux系统库的TAILQ使用示例,并在c中解释可以在Linux中使用gcc编译吗?

1 个答案:

答案 0 :(得分:27)

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_FOREACHTAILQ_FOREACH_REVERSE来遍历列表。

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

如果要在删除所有元素的同时迭代列表,可能更容易使用while循环并使用TAILQ_EMPTYTAILQ_FIRST宏。

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

以上代码大部分都是从我在IDEONE上编写和测试的示例中逐字逐句采用的。