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