Как использовать список из 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
задан rps 2 October 2011 в 14:58
поделиться