J'écris une LinkedList en C, le code ci-dessous représente ma définition Node.
typedef struct {
int value;
struct Node* next;
struct Node* prev;
} Node;
Je comprends (ou je pense que je le fais) que struct Node
différent de typedef struct Node
. Certes, mon code se compile et s'exécute comme il est censé le faire, cependant, je reçois beaucoup d'avertissements lors de l'attribution de next
et prev
(avertissement: affectation à partir d'un type de pointeur incompatible). Je suppose que cela a à voir avec la façon dont je les définis dans la structure Node. J'ai téléchargé la source complète ici
Donc, si c'est bien le problème, comment définir next
et prev
à l'intérieur de typedef struct Node
?
J'avais peur que ce soit une nouvelle publication, mais je n'ai pas pu trouver 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 c'est comment cela se fait généralement. Je ne pense pas qu'il y ait une meilleure façon.
Ce type de déclaration directe a un deuxième usage, dans la dissimulation de données. Si la liste a été implémentée dans une bibliothèque, vous pourriez avoir juste 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 façon, les utilisateurs de la bibliothèque n'ont pas facilement accès aux éléments internes de votre bibliothèque, c'est-à-dire les champs de la structure Node
.
Une autre manière acceptable et avec le moins de changement dans le code 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.