Per i cognomi oppure per stringhe array o matrici di cui non sai quanto saranno lunghe a priori ti consiglio di usare l'allocazione dinamica tramite i puntatori. In questo modo ti permette di utilizzare proprio la memoria esattamente occorrente,senza sprecarla.

Esempio:

printf("\nNumero di liste: ");
scanf("%d",& nListe);
lista=(LISTA*)calloc(nListe,sizeof(LISTA));
assert(lista != NULL);

in questo caso l'origine era una struttura di tipo LISTA e di nome lista.
inizialmente ti fai dare quante sono le liste, poi utilizzi la funzione di libreria calloc che ti chiede il numero in questo caso delle liste e come secondo parametro il sizeof del tipo della struttura da allocare in memoria.

assert è una funzione che ti permette di gestire il caso in cui l'allocazione in memoria sia fallita(rarissimo al giorno d'oggi).

Questo era un esempio, cmq puoi estendere questa soluzione anche al tuo caso