解决方法
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[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); /* ... */ }