如何使用sys/queue.h中的列表?

rps*_*rps 25 c linux bsd list

目前,我已经实现了一个单链表,如下所示:

struct PeerNode {
     struct Peer* cargo;
     struct PeerNode* next;
};
Run Code Online (Sandbox Code Playgroud)

...我有一个包含几个链接列表的结构,如下所示:

struct Torrent {
     ...
     struct PeerNode* peer_list;
     struct PeerNode* unchoked_peers;
     ...
}
Run Code Online (Sandbox Code Playgroud)

我想通过使用提供的宏来替换它sys/queue.h.我知道我可以用这样的代码替换我的代码:

struct Torrent {
     ...
     LIST_ENTRY(PeerNode, Peer) peer_list;
     struct PeerNode* unchoked_peers;
     ...
}
Run Code Online (Sandbox Code Playgroud)

然后,通过查看man queue,我相信我会通过这样做来初始化列表:

LIST_INIT(&peer_list);
LIST_INIT(unchoked_peers);
Run Code Online (Sandbox Code Playgroud)

但是,我不明白如何LIST_ENTRY使用列表的因素.从man页面上,它说:"宏LIST_ENTRY声明了一个连接列表中元素的结构,"但我真的不明白这意味着什么.

为什么我要声明一个结构来连接列表中的元素?不应该通过指针将每个节点连接到下一个节点,就像我的初始链表实现一样?如何用我提供的实现替换我的链表sys/queue.h?如何在列表中插入元素?

tin*_*man 34

LIST_ENTRY创建了适合链接元素的结构字段,因此您不必关心这些指针的细节.

struct foo {
    int a, b, c;
    /* This is instead of "struct foo *next" */
    LIST_ENTRY(foo) pointers;
};
Run Code Online (Sandbox Code Playgroud)

然后创建一个列表,您将使用LIST_HEAD():

struct Torrent {
    LIST_HEAD(foo_list, foo) bar;
};
Run Code Online (Sandbox Code Playgroud)

您可以使用LIST_INIT()初始化列表标题:

struct Torrent t;
LIST_INIT(&t.bar);
Run Code Online (Sandbox Code Playgroud)

您可以使用LIST_INSERT _*()宏插入元素:

struct foo *item = malloc(sizeof(struct foo));
LIST_INSERT_HEAD(&t.bar, item, pointers);
Run Code Online (Sandbox Code Playgroud)

这些都来自手册页中的列表示例,网址http://www.manpagez.com/man/3/queue/

有关完整示例:http://www.ideone.com/T1EID