2011-10-02 27 views
18

目前,我實現了一個單向鏈表,就像這樣:如何使用sys/queue.h中的列表?

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

...我有一個包含幾個這樣的鏈表,像這樣一個結構:

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

我想用sys/queue.h提供的宏替換它。據我瞭解,我可以像這樣的東西取代我的代碼:

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頁面,它說:「宏LIST_ENTRY聲明瞭一個連接列表中的元素的結構,」但我不明白這意味着什麼。

爲什麼我要聲明一個結構來連接列表中的元素?不應該每個節點通過指針連接到下一個節點,就像我的初始鏈表實現?我如何用sys/queue.h提供的實現來替換我的鏈接列表?我如何將一個元素插入到列表中?

回答

25

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

+0

嗨,我正在尋找基於''隊列全面的使用例子,它看起來像示例鏈接不再有效..也許你有一個替代鏈接? – osxUser