2011-10-02 15 views
18

Actualmente, he implementado una lista enlazada, así:¿Cómo usar la lista de sys/queue.h?

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

... y tengo una estructura que contiene un par de estas listas enlazadas, así:

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

I quisiera reemplazar esto usando las macros proporcionadas por sys/queue.h. Tengo entendido que podía reemplazar mi código con algo como esto:

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

Entonces, al mirar man queue, creo que habría inicializar las listas haciendo algo como esto:

LIST_INIT(&peer_list); 
LIST_INIT(unchoked_peers); 

Sin embargo, no entiendo cómo LIST_ENTRY factores en el uso de la lista. Desde la página man, dice: "La macro LIST_ENTRY declara una estructura que conecta los elementos en la lista", pero realmente no entiendo lo que esto significa.

¿Por qué querría declarar una estructura para conectar los elementos de la lista? ¿No debería cada nodo estar conectado al siguiente nodo a través de un puntero, como mi implementación de la lista vinculada inicial? ¿Cómo reemplazaría mis listas vinculadas con la implementación provista por sys/queue.h? ¿Cómo insertaría un elemento en la lista?

Respuesta

25

LIST_ENTRY crea campos para poner en su estructura que son adecuados para vincular los elementos, por lo que no tiene que preocuparse por los detalles de esos punteros.

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

A continuación, crear una lista que tendría que utilizar LIST_HEAD():

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

Usted puede inicializar el encabezado de la lista usando LIST_INIT():

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

Puede insertar elementos usando LIST_INSERT _ *() macros:

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

Todo esto fue tomado del ejemplo de la lista en las páginas del manual en http://www.manpagez.com/man/3/queue/

Para un ejemplo completo: http://www.ideone.com/T1EID

+0

Hola, estoy buscando un ejemplo de uso integral de cola basado en '' y parece el enlace de ejemplo ya no es válido ... ¿quizás tienes un enlace alternativo? – osxUser

Cuestiones relacionadas