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.