Davvero gentile king64.
In effetti dimenticavo di aggiornare il puntatore del nodo di "coda" e quindi puntava ad un valore inesistente.
Se mi permetti ti faccio un piccolo appunto, semplicemente per il piacere di discutere e di capire.
Ragionandoci un po sopra vorrei farti notare che hai inserito la variabile tmp che si poteva evitare, in quanto, Prec nel ciclo if non viene modificato per cui il suo puntatore rimane lo stesso finchè i valori sono pari.Lo stesso vale per la condizione che hai inseito "if (Prec !=NULL)" che ridonda in quanto tale condizione è già all'interno dell'if-else, in particolare nel ramo else:
codice:
if (Prec == NULL)
{
Temp = l;
l = Succ->Next; }
else
{
Temp = Succ;
Succ = Succ->Next;
}
in conclusione bastava aggiornare il puntatore "di coda" Precc in modo che puntasse al nuovo nodo di Succ, solo nel caso in cui la cancellazione non avviene in testa.A finale bastava inserire semplicemente l'aggiornamento in questo modo:
codice:
Tipo_lista cancella_tutti_pari(Tipo_lista l)
{
Tipo_lista Prec, Succ;
Prec = NULL;
Succ = l;
if (Succ == NULL)
return l;
while (Succ != NULL)
{
if (Succ->Value %2 == 0)
{
Tipo_lista Temp = NULL;
if (Prec == NULL)
{
Temp = l;
l = Succ->Next;
}
else
{
Temp = Succ;
Succ = Succ->Next;
Prec->Next = Succ; // MODIFICA
}
free(Temp);
}
else
{
Prec = Succ;
Succ = Succ->Next;
}
}
return l;
}
Ancora grazie.