[C] Liste dinamiche, SIGSEGV

moari
Salve a tutti,
sto svolgendo un esercizio per il mio esame di informatica. In pratica devo prendere da un file di testo simile:
Matteo Pupo 20 
Asdrubale Pinco 16 
Genoveffa Croce 25 
Steve Jobs 56 
Mario Rossi 14

nome cognome ed età per poi memorizzarle dentro una lista e quindi stamparla a video.
Questo è il plot della lista:
struct listplot{
char nome[25];
char cognome[25];
int eta;
struct listplot *next;
};

typedef struct listplot EL;
EL *list=NULL;


e questa è la mia funzione:
void riempilista (EL *head, FILE *in)
{
   EL *current;
   current=head;
   current=malloc(sizeof(EL));
   do
   {
     fscanf(in, "%s%s%d", current->nome, current->cognome, &current->eta);
     if (feof(in)) current->next=NULL;
     else
     {
         current->next=malloc(sizeof(EL));
         current=current->next;
     }
   }
   while (!feof(in));

}

a cui passo dal main il puntatore list e il puntatore ad un file dopo aver controllato che sia valido.
La funzione compila senza errori nè warning, fscanf ritorna 3 come dovrebbe, la funzione per stampare è questa:

void printlist(struct listplot *current)
{
    printf("%s\n%s\n%d\n\n", current->nome, current->cognome, current->eta);
    if (current->next!=NULL) printlist(current->next);
}


Per qualche motivo quando vado a stampare il programma crasha con segmentation fault, quindi ho pensato che la funzione riempilista non funga a dovere, ma non riesco a capire dove sbaglio... potete aiutarmi?

Risposte
onlyReferee
Ciao moari :!:
La funzione che usi per la stampa è già corretta così. Ciò che non va bene è il passaggio del parametro head alla funzione riempilista. Noi vogliamo far sì che una volta terminata la funzione il valore che assume head mi rappresenti proprio la testa della lista. Per far ciò dobbiamo passare un puntatore alla stessa, pertanto un valore di tipo EL** e non EL* altrimenti quando torniamo fuori abbiamo nuovamente NULL e questo spiega perché la funzione di stampa non funzionava. Inoltre all'interno della nostra funzione è su head che bisogna fare malloc in quanto current cessa di esistere (sebbene punti ad head) una volta che la funzione è terminata.
Ti posto il codice della tua funzione corretto:
void riempilista(EL **head, FILE *in)
{
   EL* current;
   *head=malloc(sizeof(EL));
   current = *head;

   do
   {
     fscanf(in, "%s%s%d", current->nome, current->cognome, &current->eta);
     if (feof(in)) current->next=NULL;
     else
     {
         current->next=malloc(sizeof(EL));
         current=current->next;
     }
   }
   while (!feof(in));
}

Ovviamente ora quando chiamerai la stessa dovrai anteporre & davanti alla tua variabile ti tipo EL* che ti rappresenta la lista (e che puoi inizializzare a NULL).
Spero di esserti stato d'aiuto.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.