This is from main:
NODE * head = NULL;
head = read_list(head);
The clear implication is that read_list, if given a NULL pointer, will construct a list and return a pointer to its head. That pointer is of type NODE*, it is not a void *.

If read-list is going to return a pointer to the head, then you have to write some statement in read_list that returns that pointer, after it has been constructed.

Linked lists seem to be difficult at first. I daresay that if you sit down with a pencil and paper and exercise the code that you have written, you will discover that it is not really all that difficult. Really, you should design these things first, then write the code later. Too many employers will recognize the deficiency if you do it the wrong way round.