jxh*_*jxh 27
该TAILQ_ENTRY宏用于建立用于将项插入列表的指针.您将它放入要列出的结构中.
struct foo {
TAILQ_ENTRY(foo) tailq;
int datum;
/* ... */
};
Run Code Online (Sandbox Code Playgroud)
将TAILQ_HEAD用于定义将作为您的链接列表元素的容器的结构.您为它提供了一个结构名称,以及它将包含的类型的名称.
TAILQ_HEAD(fooq, foo);
Run Code Online (Sandbox Code Playgroud)
使用TAILQ_INIT初始化列表容器的一个实例.
struct fooq q;
TAILQ_INIT(&q);
Run Code Online (Sandbox Code Playgroud)
使用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);
Run Code Online (Sandbox Code Playgroud)
您可以使用TAILQ_FOREACH和TAILQ_FOREACH_REVERSE遍历列表.
struct foo *p;
TAILQ_FOREACH(p, &q, tailq) {
printf(" %d", p->datum);
}
puts("");
Run Code Online (Sandbox Code Playgroud)
如果要在删除其所有元素的同时迭代列表,则可能更容易使用while循环并使用TAILQ_EMPTY和TAILQ_FIRST宏.
while (!TAILQ_EMPTY(&q)) {
p = TAILQ_FIRST(&q);
TAILQ_REMOVE(&q, p, tailq);
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
上面的代码主要是从我在IDEONE上编写和测试的示例中逐字逐句采用的.