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

Kha*_*lla 15 c linux queue gcc

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

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

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

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

while (!TAILQ_EMPTY(&q)) {
    p = TAILQ_FIRST(&q);
    TAILQ_REMOVE(&q, p, tailq);
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

上面的代码主要是从我在IDEONE上编写和测试的示例中逐字逐句采用的.

  • [在线试用!(https://tio.run/##rVJda4MwFH3Pr7hzrMRhN7s@7MGtIFtKhbXdUimMUYqoXQVr/YhbR/G3u0QtjaXsaRGjuTn3nMu51@1@um5ZXgaRG@aeDw8Z84LtzXqApNBPdpvkfu6LMMpYmrsMVtst7BHwZZvWy9uSTGz6jnlUBeYEYWJUd0HEwHNYvjFQYbRyxYvF9ZcTqg2TdL2DR9jzR9dAh0ITKChqztRneRrBjlMiVIuPiPkstBNNJKtcSTBvnCACrKJT8gSa6iQ9XqTz0V9UqvyM@2pFhe@bb089yEtJ1zFXOlpgTSwbdxLVaMVmhNp1gR1eXqcS0hda7dI5rDm0CT0B13@9v9LEQcq6k7ASeDilxHwa4ZjjkgOisV@sOOXOrbACV56iQdwdVN1r9Ipqj3OWYUU5y7ukZE7ojBz46578g8r3Ogh9wBfNsI1f7XdhdYuUN68pxqIzqRPHKikZT@ekciluW1kgebZ0Pltl@Qs“C(GCC) - 试用在线的”) (3认同)