有些人可以提供最简单的使用linux系统库的TAILQ使用示例,并在c中解释可以在Linux中使用gcc编译吗?
答案 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_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上编写和测试的示例中逐字逐句采用的。