2010-10-21 12 views
28

Escribo una lista enlazada en C, el siguiente código representa mi definición de nodo.¿Cómo se define una estructura typedef que contiene punteros a sí misma?

typedef struct { 
    int value; 
    struct Node* next; 
    struct Node* prev; 
} Node; 

entiendo (o piensan que lo hago) que struct Node no es el mismo que typedef struct Node. De acuerdo, mi código se compila y se ejecuta como se supone que debe hacerlo, sin embargo, recibo muchas advertencias al asignar next y prev (advertencia: asignación del tipo de puntero incompatible). Supongo que esto tiene que ver con la forma en que los estoy definiendo en la estructura del Nodo. he subido la fuente completa here

Por lo tanto, si es ése el problema, ¿cómo debería definir next y prev dentro del typedef struct Node?

Me preocupaba que esto pudiera ser un reenvío, pero no podía encontrar lo que estaba buscando. Gracias.

+0

Su lista vinculada me parece muy extraña. Cuando tienes prev y next entonces ¿por qué necesitas cabeza y cola? Encuentre una buena lista enlazada en c y aprenda de ella. Recomendaría la biblioteca de Apache Runtime. Creo que tiene una lista vinculada. – frast

+2

que tiene punteros a la cabeza y la cola hacen agregar y anteponer O (1) en lugar de O (n). Avísame si ves otros errores, ya que esto es principalmente solo un ejercicio para mantener mis habilidades C algo frescas después de todos estos años de Java ... –

Respuesta

55

que tiene que hacer en este orden:

typedef struct Node Node; 

struct Node 
{ 
    int value; 
    Node *next; 
    Node *prev; 
}; 

que no hace exactamente lo que usted pidió, pero resuelve el problema y cómo esto se hace generalmente. No creo que haya una mejor manera.

Este tipo de declaración directa tiene un segundo uso, en el ocultamiento de datos. Si la lista se llevó a cabo en una biblioteca, usted podría tener sólo el typedef en la cabecera del público, junto con funciones como:

Node * list_new(void); 
Node * list_append(Node *head, Node *new_tail); 
size_t list_length(const Node *head); 

De esta manera, los usuarios de la biblioteca no tienen fácil acceso a los componentes internos de su biblioteca, es decir, los campos de la estructura Node.

+2

Sí. Una declaración directa (http://en.wikipedia.org/wiki/Forward_declaration) es exactamente lo que se necesita. –

+0

Oh wow. ¡Creo que probé todas las combinaciones excepto esa! ¡Gracias! ¡las advertencias desaparecieron! :) –

+0

Correcto, soy consciente de las declaraciones avanzadas y las utilicé en C++, pero nunca antes había tenido esta circunstancia en particular, y menos con typedef/structs :) –

17

Otra forma aceptable y con el menor cambio en el código de OP es la siguiente:

typedef struct NodeT { 
    int value; 
    struct NodeT * next; 
    struct NodeT * prev; 
} Node; 

Nota de la introducción de NodeT y su uso en next y prev hasta Node está disponible.

+0

Esto es realmente lo que terminé haciendo en mi implementación. :) por el comentario de @R .. –

Cuestiones relacionadas