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

目前,我已经实施了一个单独的链接列表,如下所示:

struct PeerNode { struct Peer* cargo; struct PeerNode* next; }; 

…我有一个包含这些链表的结构,如下所示:

 struct Torrent { ... struct PeerNode* peer_list; struct PeerNode* unchoked_peers; ... } 

我想通过使用sys/queue.h提供的macros来replace它。 我收集,我可以用这样的东西replace我的代码:

 struct Torrent { ... LIST_ENTRY(PeerNode, Peer) peer_list; struct PeerNode* unchoked_peers; ... } 

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

 LIST_INIT(&peer_list); LIST_INIT(unchoked_peers); 

不过,我不明白LIST_ENTRY如何转化为列表的用法。 从man页上,它说:“macrosLIST_ENTRY声明一个连接列表中的元素的结构,”但我不明白这是什么意思。

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

LIST_ENTRY创建的字段放入你的结构中,适合链接元素,所以你不必关心这些指针的细节。

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

然后创建一个使用LIST_HEAD()的列表:

 struct Torrent { LIST_HEAD(foo_list, foo) bar; }; 

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

 struct Torrent t; LIST_INIT(&t.bar); 

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

 struct foo *item = malloc(sizeof(struct foo)); LIST_INSERT_HEAD(&t.bar, item, pointers); 

这全部来自http://www.manpagez.com/man/3/queue/手册页中的列表示例

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