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