Comment définir une structure typedef contenant des pointeurs sur elle-même?

J’écris une LinkedList en C, le code ci-dessous représente ma définition de nœud.

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

Je comprends (ou pense que je comprends) que la struct Node n’est pas identique à la typedef struct Node . Si mon code est compilé et exécuté comme il est supposé, je reçois beaucoup d’avertissements lors de l’atsortingbution de next et prev (warning: affectation à partir d’un type de pointeur incompatible). Je suppose que cela a à voir avec la façon dont je les définit dans la structure du nœud. J’ai téléchargé la source complète ici

Donc, si tel est effectivement le problème, comment dois-je définir next et prev dans la typedef struct Node ?

J’avais peur que ce soit un report, mais je ne trouvais pas ce que je cherchais. Merci.

Vous devez le faire dans cet ordre:

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

Cela ne fait pas exactement ce que vous avez demandé, mais cela résout le problème et correspond à la façon dont cela est généralement fait. Je ne pense pas qu’il existe un meilleur moyen.

Ce type de déclaration forward a un deuxième usage, le masquage de données. Si la liste a été implémentée dans une bibliothèque, vous pourriez n’avoir que le typedef dans l’en-tête public, avec des fonctions comme:

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

De cette manière, les utilisateurs de la bibliothèque n’ont pas facilement access aux éléments internes de votre bibliothèque, c’est-à-dire aux champs de la structure de Node .

Une autre manière acceptable et avec le moins de changements au code de l’OP est la suivante:

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

Notez l’introduction de NodeT et son utilisation dans next et prev jusqu’à ce que Node soit disponible.