можно понадеяться что линкер положит подряд объявленные переменные
подряд typedef struct NODE
{
unsigned x;
struct NODE *next;
} NODE;
#define CONCATENATE_DIRECT(s1, s2) s1##s2
#define CONCATENATE(s1, s2) CONCATENATE_DIRECT(s1, s2)
#define NODE_N(name, val) __root NODE CONCATENATE(name, __LINE__) = {.x=val, .next = &CONCATENATE(name, __LINE__)+1}
#define NODE_FRST(name, val) __root NODE name = {.x=val, .next = &name + 1}
#define NODE_END(name, val) __root NODE name##end = {.x=val, .next = &name}
NODE_FRST(linked_list, 9);
NODE_N(linked_list, 10);
NODE_N(linked_list, 11);
NODE_END(linked_list,55);