26

現在、次のように単一リンクリストを実装しています。

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ですか? リストに要素を挿入するにはどうすればよいですか?

4

1 に答える 1

38

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://infnis.wikidot.com/list-from-sys-queue-h

于 2011-10-02T15:11:09.210 に答える