Вы можете построить связанный список из статических данных. В ANSI C89 (он же ISO C90) это может выглядеть так:
struct node
{
int data;
struct node *next;
};
struct node nodes[] = { { 42, &nodes[1] }, { 137, 0 } };
struct node *list = nodes;
В ISO C99 (принятом ANSI в 2000 г.) вы можете дополнительно использовать составные литералы, например
struct node *list = &(struct node){ 42, &(struct node){ 137, 0 } };
Смешивать статически распределенные узлы с динамически размещенными узлами проблематично, так как освобождение первых приведет к неопределенному поведению, поэтому необходимо будет отслеживать, какие узлы принадлежат какой группе.