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.