Это объявление функции
node * createnode(char firstName[], char lastName[], char puid[], char age[]);
не имеет смысла, потому что параметры не используются в функции.
Поэтому функция должна быть объявлена как
node * createnode( void );
Внутри функции операторы вроде этого
scanf("%s", &(head -> fName));
^^^
неверны. Они должны выглядеть следующим образом:
scanf("%s", head -> fName);
Что касается неправильного вывода, то кажется, что вы вводите больше символов в массив символов, чем он может содержать, включая завершающий ноль строки.
Например, введенные символы 7894569875
будут храниться в элементе данных PUID
как строка "7894569875"
, которая содержит 11 символов (включая завершающий нулевой символ) вместо 10.
Более безопасно использовать функцию fgets вместо scanf с указателем формата% s.
Например,
#include <string.h>
//...
fgets( head->fName, maxName, stdin );
head->fName[ strcspn( head->fName, "\n" ) ] = '\0';
Обратите внимание, что плохая идея, когда функция зависит от глобальной переменной. В этом случае вы не сможете, например, иметь списки в программе.