目前,我已经实施了一个单独的链接列表,如下所示:
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