singly single linked generic doubly data create c linked-list

single - ¿Qué es exactamente typedef struct node{...} Node; ¿representar?



single linked list (5)

Cuando usa typedef , crea un alias de algún tipo.

Entonces sí, Node es un alias para struct node .

Además, el código que tienes es equivalente a

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

El typedef no es parte de la definición de la estructura, es parte de la definición del Node .

Por favor, mira este bloque de código:

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

En este código, ¿ Node es Node a struct node , tal como lo define typedef, o es node a struct? Si este último es el caso, entonces es struct node *next; equivalente a struct struct *next; ?

¿Estoy sobrecomplicando cosas?


En C las estructuras gramaticales se definen de la siguiente manera

struct-or-union-specifier:
identificador struct-or-union opt {struct-declaration-list}

Entonces, para referirse a este especificador de estructura necesita usar su nombre.

Puede declarar las variables de la siguiente manera

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

Aquí el Node es un objeto del tipo struct node . A su vez, struct node es un especificador de tipo de Node variable.

Puede omitir el identificador en un especificador de estructura. En este caso, la estructura se llama estructura sin nombre . Sin embargo, al utilizar una estructura de este tipo no puede referirse a ella misma dentro de su definición. Por ejemplo, no puedes escribir

struct { int data; struct *next; ^^^^^^^^^^^^^ } Node;

porque se desconoce a qué estructura se hace referencia aquí.

Puede usar estructuras sin nombre como miembros de otras estructuras. En este caso, dicha estructura se denomina estructura anónima y sus miembros se convierten en miembros de la estructura adjunta.

Por ejemplo

struct A { struct { int x; int y; ]; int z; };

Esta estructura A tiene tres miembros x , y y z .

Cuando se usa el especificador de clase de almacenamiento, el declarador es un identificador para ser un nombre de tipodef que denota el tipo especificado para el identificador.

Por lo tanto, en esta declaración

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

Node ya no es un objeto. Es un nombre de tipo que denota struct node.

Entonces, a partir de ahora, puede usar el nombre de tipo Node lugar del struct node especificador de struct node tipo


ya no tienes que escribir struct todos lados. Eso no solo ahorra las pulsaciones de teclas, sino que también puede hacer que el código sea más limpio, ya que proporciona una mayor abstracción.

Cosas como

typedef struct { int x, y; } Point; Point point_new(int x, int y) { Point a; a.x = x; a.y = y; return a; }


Node es sinónimo de struct node . Por eso (para su ejemplo) en lugar de usar

struct node* p;

Uno puede usar

Node* p;


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

Esto se puede entender simplemente por

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

struct [structure tag or label] { member definition; ... member definition; } [one or more structure variables];

nueva variable se puede definir como:

struct label <variable>;

o si usa typedef, la etiqueta struct no necesita repetirse cada vez para definir una nueva variable de estructura, es decir,

typedef struct label Node;

Now Node se puede utilizar para definir un nuevo tipo de variable similar.