There is a way to build a similar data structure without pointers. This is the same technique used to serialize a linked data structure for storage or transmission where the pointers lose their meaning.
You allocate a large fixed static array, put your data into it, and use integers to index into the array as your "pointers". Using an integer as an index is commonly called a cursor.
typedef unsigned index;
typedef struct linknode {
int data;
index next;
} link;
link memory[ 1000 ];
index next = 0;
Then you can add data into it.
link *a = memory + next++;
link *b = memory + next++;
a->data = 1;
b->data = 2;
a->next = b - memory;
Some details would need to be worked out for a robust system like whether index 0 is considered valid or a NULL pointer, or if all the .next indices need to be pre-initialized with some non-zero "null" index. IMO, simplest is to treat 0 as NULL and initialize next to 1.
You could also create nodes as above without using pointers, but keeping track of the index is a little clumsier and the expression involving the index is more cumbersome.
index a_index = next++;
index b_index = next++;
memory[ a_index ].data = 1;
memory[ b_index ].data = 2;
memory[ a_index ].next = b_index;
Aside: There's room for improvement in your malloc calls.
linknode *a = malloc(sizeof(Node));
A better style is to use either the typename or variable name from the same line of code, so it can be verified at a glance.
linknode *a = malloc( sizeof( linknode ) );
Or, preferred by many is to use the variable itself, then you can change the type easily if you want because it's only written once.
linknode *a = malloc( sizeof *a );
By giving sizeof an expression argument (which you can do because it's an operator, not a function) you can drop the parentheses, too. The expression argument to sizeof is not evaluated, just inspected for its type. There is one weird exception if the type is variably modified, but that's too complicated to explain (I don't fully understand it). So just remember, there is a weird exception, but for the most part *a in the above code is safe because sizeof just needs the size of the type.
Think of it as "what the size would be if the malloc call succeeds".