2011-10-02 10 views
18

Obecnie mam wdrożony pojedynczo połączonej listy, tak jak poniżej:Jak używać listy z sys/queue.h?

struct PeerNode { 
    struct Peer* cargo; 
    struct PeerNode* next; 
}; 

... i mam struct, który zawiera parę tych połączonych listach, tak jak:

struct Torrent { 
    ... 
    struct PeerNode* peer_list; 
    struct PeerNode* unchoked_peers; 
    ... 
} 

I chciałby zastąpić to za pomocą makr dostarczonych przez sys/queue.h. Wnoszę, że mogę wymienić mój kod z mniej więcej tak:

struct Torrent { 
    ... 
    LIST_ENTRY(PeerNode, Peer) peer_list; 
    struct PeerNode* unchoked_peers; 
    ... 
} 

Następnie, patrząc na man queue wierzę, chciałbym zainicjować list robiąc coś takiego:

LIST_INIT(&peer_list); 
LIST_INIT(unchoked_peers); 

Jednak ja nie rozumiem, jak czynniki wpływają na korzystanie z listy. Ze strony man jest napisane: "Makro LIST_ENTRY deklaruje strukturę, która łączy elementy na liście", ale tak naprawdę nie rozumiem, co to oznacza.

Dlaczego chciałbym zadeklarować strukturę do łączenia elementów na liście? Czy każdy węzeł nie powinien być połączony z następnym węzłem za pomocą wskaźnika, tak jak moja początkowa implementacja listy powiązanej? Jak zastąpić moje połączone listy implementacją dostarczoną przez sys/queue.h? Jak wstawić element do listy?

Odpowiedz

25

LIST_ENTRY tworzy pola do wstawienia w strukturę, które są odpowiednie do łączenia elementów, dzięki czemu nie musisz martwić się o szczegóły tych wskaźników.

struct foo { 
    int a, b, c; 
    /* This is instead of "struct foo *next" */ 
    LIST_ENTRY(foo) pointers; 
}; 

Aby następnie utworzyć listę byłoby użyć LIST_HEAD():

struct Torrent { 
    LIST_HEAD(foo_list, foo) bar; 
}; 

można zainicjalizować nagłówek listy za pomocą LIST_INIT():

struct Torrent t; 
LIST_INIT(&t.bar); 

można wstawiać elementy za pomocą LIST_INSERT _ *() makra:

struct foo *item = malloc(sizeof(struct foo)); 
LIST_INSERT_HEAD(&t.bar, item, pointers); 

To wszystko było zrobione z przykładu lista na stronach man at http://www.manpagez.com/man/3/queue/

Pełny przykład: http://www.ideone.com/T1EID

+0

Cześć, szukam wszechstronnego użytkowania na przykład w oparciu o kolejce '' i wydaje się, że przykładowy link nie jest już prawidłowy. Może masz alternatywny link? – osxUser

Powiązane problemy