Как использовать список из 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? Как вставить элемент в список?


person rps    schedule 02.10.2011    source источник


Ответы (1)


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

person tinman    schedule 02.10.2011
comment
Привет, я ищу исчерпывающий пример использования очереди на основе <sys/queue.h>, и кажется, что ссылка на пример больше недействительна ... возможно, у вас есть альтернативная ссылка? - person ; 05.11.2017