In C grammatical structures is defined as follows:
struct-or-union-specifier:
struct-or-union identifier opt {struct-declaration-list}
So, to refer to this structure specifier, you need to use its name.
You can declare variables as follows
struct node { int data; struct node *next; } Node;
Here, Node is an object of type struct node . In turn, the struct node is a Node variable type specifier.
You can omit the identifier in the structure specifier. In this case, the structure is called an unnamed structure. However, using such a structure, you cannot refer to it inside its definition. For example, you cannot write
struct { int data; struct *next; ^^^^^^^^^^^^^ } Node;
because it is not known which structure is referenced here.
You can use unnamed structures as members of other structures. In this case, such a structure is called an anonymous structure, and its members become members of the encompassing structure.
for instance
struct A { struct { int x; int y; ]; int z; };
This structure A has three members x , y and z .
When a storage class specifier is used, the declarator is an identifier of type typedef, which indicates the type specified for the identifier.
So in this ad
typedef struct node { int data; struct node *next; } Node;
Node no longer an object. This is a type name denoting a struct node.
So now you can use a name of type Node instead of a specifier of type struct node