¿Cuál es el propósito del primer “nodo” en la statement: “typedef struct node {- – -} Node;”?

Estoy estudiando ejemplos de código de mi profesor para conocer mejor las estructuras de datos vinculadas.

En nuestro ejemplo de link-list.c, el profesor define un Nodo de tipo de la siguiente manera:

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

¿Cuál es el punto del nodo de minúsculas? Tenía la impresión de que simplemente podías escribir, por ejemplo:

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

y luego usar Node como su propio tipo. ¿Tiene algo que ver con el hecho de que si no incluye un nodo en minúsculas, cuando el comstackdor esté evaluando el código no podrá entender qué significa “struct node * next”?

Echa un vistazo a esta statement:

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

Esto se puede combinar en una sola statement (simplificando una statement):

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

¿Tiene algo que ver con el hecho de que si no incluye un node minúsculas, cuando el comstackdor esté evaluando el código no podrá entender qué significa ” struct node *next “?

Sí.

El node en el node struct node es la etiqueta del tipo de estructura. Si asigna una etiqueta a la estructura, puede referirse a ese tipo desde el momento en que la etiqueta esté completa, por lo que en

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

el struct node *next; declara un miembro next que es un puntero al tipo de estructura que se está definiendo. El Node nombre typedef no está disponible antes de ; Se llega al final de la definición.

Si omite la etiqueta, no puede hacer referencia al tipo que se define de ninguna manera antes de que se complete typedef , por lo que en

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

la línea struct node *next; declara un tipo de struct nuevo, no relacionado e incompleto con el node etiqueta que apunta a continuación.

Eso es válido, pero no se sabe nada sobre struct node (a menos que esté definido en otro lugar), por lo que no puede usar el next puntero sin convertirlo en un puntero a un tipo completo en todas partes (no en todas partes, Node foo; foo.next = malloc(12); etc. todavía funcionaría).

Está definiendo un nombre temporal para el nodo porque está usando una técnica bien conocida para evitar escribir el struct node en la statement de cada objeto struct.

Si el solo hiciera

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

habrías tenido que usar:

 struct node* node; 

para declarar un nuevo nodo. Y para evitar eso tendrías que definirlo después:

 typedef struct node Node; 

Para poder declarar objetos como los siguientes:

 Node* node; 

En el final:

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

Es solo un acceso directo para struct node { ... }; además de typedef struct node Node; .

Aquí struct node es un tipo como int

y por lo tanto

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

significa que está declarando una sola variable Nodo del nodo struct.

como int intVar;

typedef es hacer su código comprensible.

para que cuando lo uses

 typedef struct node Node; 

puedes usar la misma statement que

 Node NodeVar; 

Considere este código:

 #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); } 

Esto no comstackrá. El comstackdor no tiene idea de lo que es un struct node , aparte de que existe. Por lo tanto, puede cambiar la definición en la estructura a Node *next; . El typedef no está dentro del scope antes de ser declarado, por lo que todavía no se comstackrá. La respuesta simple es hacer lo que dijo, usar la etiqueta de node después de la struct , y funciona bien.

El ‘nodo’ en minúsculas es un tipo de estructura … es decir, un nodo struct {stuff} es una estructura de nodo que contiene cosas.

Por otro lado, el “Nodo” en mayúsculas es un tipo de datos completamente nuevo que se refiere a un ‘nodo struct’

Generalmente (aunque en C ++ creo que puedes), no puedes pasar un “nodo” en un progtwig en C … por ejemplo, como un argumento para una función. Más bien, tendría que pasar un ‘nodo struct’ como su argumento …

 // 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 compiler 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 );