2010-10-21 2 views
28

J'écris une LinkedList en C, le code ci-dessous représente ma définition de Node.Comment définir une structure typedef contenant des pointeurs sur lui-même?

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

Je comprends (ou penser que je fais) que struct Node pas le même que typedef struct Node. Certes, mon code se compile et s'exécute comme il est censé, cependant, je reçois beaucoup d'avertissements lors de l'attribution next et prev (avertissement: affectation de type pointeur incompatible). Je suppose que cela a à voir avec la façon dont je les définis dans la structure du nœud. Je téléchargé la source complète here

Donc, si tel est bien le problème, comment dois-je définir next et prev à l'intérieur du typedef struct Node? Je m'inquiétais que ce soit un repos, mais je n'ai pas vraiment trouvé ce que je cherchais. Merci.

+0

Votre liste liée me semble très étrange. Quand vous avez prev et ensuite pourquoi avez-vous besoin de tête et de queue alors? Trouvez une bonne liste de liens en c et apprenez-en. Je recommande la bibliothèque Apache Runtime. Je pense qu'il a une liste liée. – frast

+2

ayant des pointeurs sur la tête et la queue font append et préfixent O (1) au lieu de O (n). Faites-moi savoir si vous voyez d'autres erreurs, car il s'agit principalement d'un exercice pour garder mes compétences C un peu frais après toutes ces années de Java .. –

Répondre

55

Vous devez le faire dans cet ordre:

typedef struct Node Node; 

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

qui ne fait pas exactement ce que vous avez demandé, mais il permet de résoudre le problème et comment cela se fait généralement. Je ne pense pas qu'il y ait un meilleur moyen.

Ce type de déclaration avant a une deuxième utilisation, dans le masquage de données. Si la liste a été mis en œuvre dans une bibliothèque, vous pourriez avoir juste le typedef dans l'en-tête du public, ainsi que des fonctions telles que:

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

De cette façon, les utilisateurs de la bibliothèque n'ont pas un accès facile aux entrailles de votre bibliothèque, c'est-à-dire les champs de la structure Node.

+2

Oui. Une déclaration directe (http://en.wikipedia.org/wiki/Forward_declaration) est exactement ce dont vous avez besoin. –

+0

Oh wow. Je pense que j'ai essayé toutes les combinaisons sauf celle-là! Merci! avertissements tous partis! :) –

+0

A droite, je suis au courant des déclarations forward et je les ai utilisées tout au long de C++, mais je n'ai jamais vu cette circonstance arriver avant, encore moins avec typedef/structs :) –

17

Une autre façon acceptable et avec le moindre changement au code de OP est la suivante:

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

note l'introduction de NodeT et son utilisation dans next et prev jusqu'à Node est disponible.

+0

C'est en fait ce que j'ai fini par faire dans ma mise en œuvre. :) Commentaire de @ per @R .. –

Questions connexes