В настоящее время я реализовал односвязный список, например, так:
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
? Как мне вставить элемент в список?