Derzeit habe ich eine einfach verknüpfte Liste wie folgt implementiert:
struct PeerNode {
struct Peer* cargo;
struct PeerNode* next;
};
… und ich habe eine Struktur, die ein paar dieser verknüpften Listen enthält, etwa so:
struct Torrent {
...
struct PeerNode* peer_list;
struct PeerNode* unchoked_peers;
...
}
Ich möchte dies durch die Verwendung der von bereitgestellten Makros ersetzen sys/queue.h
. Ich nehme an, dass ich meinen Code durch so etwas ersetzen könnte:
struct Torrent {
...
LIST_ENTRY(PeerNode, Peer) peer_list;
struct PeerNode* unchoked_peers;
...
}
Dann, vom Betrachten man queue
ich glaube, ich würde die Listen initialisieren, indem ich so etwas mache:
LIST_INIT(&peer_list);
LIST_INIT(unchoked_peers);
Allerdings verstehe ich nicht wie LIST_ENTRY
Faktoren bei der Verwendung der Liste. Von dem man
Seite, da steht: “Das Makro LIST_ENTRY
deklariert eine Struktur, die die Elemente in der Liste verbindet”, aber ich verstehe nicht wirklich, was das bedeutet.
Warum sollte ich eine Struktur deklarieren wollen, um die Elemente in der Liste zu verbinden? Sollte nicht jeder Knoten über einen Zeiger mit dem nächsten Knoten verbunden sein, wie bei meiner anfänglichen Linked-List-Implementierung? Wie würde ich meine verknüpften Listen durch die von bereitgestellte Implementierung ersetzen? sys/queue.h
? Wie würde ich ein Element in die Liste einfügen?