Ciao, innanzitutto toglierei di mezzo inizializza() e listaVuota()... non ha senso utilizzare delle funzioni per delle operazioni tanto banali.
Detto questo passiamo alla funzione cancellatutti(). Consideriamo il seguente frammento di codice:
if(listaVuota(l))
{
return l;
}
while(l -> info == el)
{
temp = l;
l = l -> next;
free(temp);
}
Cosa succede nel caso della lista
1 --> 1 --> NULL
?
Il programma crasha in quanto cerca di accedere al membro info di un puntatore nullo.
Consideriamo ora il frammento:
puntCorr=l;
while(puntCorr !=NULL)
{
while(puntCorr !=NULL && puntCorr->info!=el)
{
puntPrec = puntCorr;
puntCorr = puntCorr -> next;
}
if(puntCorr ->info==el)
{
temp = puntCorr;
puntCorr = puntCorr -> next;
puntPrec->next = puntCorr;
free(temp);
}
}
Cosa succede nel caso della lista
2 --> 3 --> NULL
?
Il programma crasha in quanto cerca di accedere (nella condizione dell'if) al membro info di un puntatore nullo.
Aggiunti gli opportuni controlli sui puntatori dovrebbe andare, ma ti faccio notare che la funzione potrebbe essere riscritta in modo molto più semplice (e senza usare il puntatore temp) seguendo il seguente schema:
Nodo* cancellatutti(Nodo *l, int el)
{
Nodo *corr = l;
Nodo *prec = NULL;
while(corr)
{
if(corr->info == el)
{
if(prec)
{
...
}
else
{
...
}
}
else
{
...
}
}
return l;
}
P.S.
Non so se li hai mai utilizzati, ma con i puntatori doppi il tutto poteva essere fatto in modo molto più conciso!