In this declaration of an unnamed structure within the typedef declaration
typedef struct
{
Node *next;
Node *prev;
} Node;
the name Node used as a type specifier of data members next and prev is undeclared. So the compiler issues an error.
In this declaration of an unnamed structure in the typedef declaration
typedef struct
{
struct Node *next;
struct Node *prev;
} Node;
there are introduced the type specifier struct Node and the typedef name Node for the unnamed structure. They are different type specifiers. That is Node and struct Node are not the same specifiers.
What you need is the following
typedef struct Node
{
struct Node *next;
struct Node *prev;
} Node;
Now Node is an alias for the type specifier struct Node.
Pay attention to that this function definition
void link(Node * node) {
node->next = (Node) {node, NULL}
}
does not make a sense and the compiler shall again issue an error. The left operand of the assignment statement (where you forgot to place a semicolon)
node->next = (Node) {node, NULL};
has the type Node * or struct Node * (if you will update the typedef declaration as it is shown above) while the right operand is a compound literal of the type struct Node. Moreover the compound literal has automatic storage duration and will not be alive after exiting the function.
So if you will even write
node->next = &(Node) {node, NULL};
the pointer node->next will be invalid after exiting the function.