web-dev-qa-db-fra.com

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

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.

33
Kenny Cason

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.

64
unwind

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.

25
Arun