Quel est le but du premier “noeud” dans la déclaration: “typedef struct node {- – -} Node;”

J’étudie des exemples de code fournis par mon professeur afin de mieux connaître les structures de données liées.

Dans notre exemple, linked-list.c, le professeur définit un type de nœud comme suit:

typedef struct node { int data; struct node *next; } Node; 

Quel est le point du nœud minuscule? J’avais l’impression que vous pouviez simplement écrire, par exemple:

 typedef struct { int data; struct node *next; } Node; 

puis utilisez Node comme son propre type. Cela a-t-il quelque chose à voir avec le fait que si vous n’incluez pas de nœud minuscule, lorsque le compilateur évalue le code, il ne sera pas en mesure de comprendre ce que l’on entend par “struct node * next”?

Regardez cette déclaration:

 struct node { int data; struct node *next; }; typedef struct node Node; 

Ceci peut être combiné en une seule déclaration (simplifier une déclaration):

 typedef struct node { int data; struct node *next; } Node; 

Cela a-t-il quelque chose à voir avec le fait que si vous n’incluez pas de node minuscule, lorsque le compilateur évalue le code, il ne sera pas en mesure de comprendre ce que l’on entend par ” struct node *next “?

Oui.

Le node dans le node struct node est la balise du type struct. Si vous atsortingbuez une balise à la structure, vous pouvez faire référence à ce type à partir du moment où la balise est terminée.

 typedef struct node { int data; struct node *next; } Node; 

le struct node *next; déclare un membre next qui est un pointeur sur le type de struct en cours de définition. Le nom typedef Node n’est pas disponible avant le ; mettre fin à la définition est atteint.

Si vous omettez la balise, vous ne pouvez en aucun cas faire référence au type défini avant la fin de la typedef .

 typedef struct { int data; struct node *next; } Node; 

la ligne struct node *next; déclare un nouveau type de struct , non associé et incomplet, avec le node balise sur lequel pointe ensuite.

C’est valide, mais rien sur le struct node n’est connu (à moins qu’il ne soit défini ailleurs), vous ne pouvez donc pas utiliser le pointeur next sans le convertir en pointeur vers un type complet partout (pas tout à fait, Node foo; foo.next = malloc(12); etc. fonctionnerait toujours).

Il définit un nom temporaire pour le nœud car il utilise une technique bien connue pour éviter d’écrire le struct node sur la déclaration de chaque object struct.

S’il voulait juste faire:

 struct node { int data; struct node *next; }; 

vous auriez dû utiliser:

 struct node* node; 

déclarer un nouveau noeud. Et pour éviter que vous deviez définir plus tard:

 typedef struct node Node; 

afin de pouvoir déclarer des objects comme suit:

 Node* node; 

À la fin:

 typedef struct node { int data; struct node *next; } Node; 

Est-ce juste un raccourci pour struct node { ... }; en plus de typedef struct node Node; .

Ici le struct node est un type comme int

et donc

 struct node { int data; struct node *next; }NodeVar; 

signifie que vous déclarez une seule variable Node of struct node.

comme int intVar;

typedef est de rendre votre code compréhensible.

de sorte que lorsque vous utilisez

 typedef struct node Node; 

vous pouvez utiliser la même déclaration que

 Node NodeVar; 

Considérons ce code:

 #include  typedef struct { int data; struct node *next; } Node; int main() { Node a, b = {10, NULL}; a.next = &b; printf("%d\n", a.next->data); } 

Cela ne comstackra pas. Le compilateur n’a aucune idée de ce qu’est un struct node , si ce n’est qu’il existe. Vous pouvez donc changer la définition dans la structure en Node *next; . Le typedef n’est pas dans la scope avant sa déclaration, donc il ne comstackra toujours pas. La réponse simple est de faire ce qu’il a dit, d’utiliser la balise node après struct , et cela fonctionne bien.

Le ‘noeud’ minuscule est un type de structure … c’est-à-dire qu’un noeud struct {stuff} est une structure de noeud contenant des éléments.

En revanche, la majuscule “Node” est un type de données entièrement nouveau qui fait référence à un “nœud struct”

En général (bien qu’en C ++, je pense que vous puissiez le faire), vous ne pouvez pas faire passer un “nœud” dans un programme C … par exemple en tant qu’argument d’une fonction. Au lieu de cela, vous devrez passer un “nœud struct” comme argument …

 // this will throw a syntax error because "node" is not a data type, // it's a structure type. void myFunc( node* arg ); // while this will not because we're telling the comstackr we're // passing a struct of node void myFunc( struct node* arg ); // On the other hand, you *can* use the typedef shorthand to declare // passing a pointer to a custom data type that has been defined // as 'struct node' void myFunc( Node* arg );