Ciao, interpretare le righe di codice altrui è abbastanza complicato, ma a volte la lettura potrebbe esserci facilitata da alcuni commenti... Comunque, io in effetti non riesco a capire perchè ti serva usare delle variabili per cercare di saltare la testa della lista e perchè vuoi prima cercare il nodo da eliminare, se tanto devi deallocare tutti quelli che hanno quel codice, vorrei invece suggerirti di usare una funzione per l'eliminazione ricorsiva, quindi eliminando la parte di ricerca e i vari if, cioè qualcosa del tipo:
(Tieni conto che uso *laLista perchè ho passato un nodo * *, quindi DOPPIO puntatore a nodo)
/* Premettendo che ovviamente dal main avrai già letto la condizione di eliminazione,
puoi definire la funzione canc_articolo in questo modo */
void canc_articolo (int codice, TipoLista *laLista){ /* TipoLista sarebbe nodo * */
nodo *aux; /* Un puntatore a nodo ausiliario, per l'eliminazione */
if (!(*laLista)) /* Per prima cosa, se la lista è vuota, esco */
return;
if ((*laLista)->codiceArticolo == codice)){ /* Quindi se questo nodo è quello che cercavo */
aux = *laLista; /* Punto aux a questo nodo */
*laLista = (*laLista)->next; /* Invece sposto la lista sul nodo successivo */
free(aux); /* E poi dealloco quel nodo */
/* Se però ci sono più elementi con quel codice? allora chiamo di nuovo la funzione */
canc_articolo (codice, laLista); /* Occhio che ora laLista punta già al nodo successivo! */
}
/* Se però l'elemento da eliminare non era questo (cioè diciamo "il primo")
richiamo la funzione, ma sul successivo */
else canc_articolo (codice, &(*laLista)->next);
/* E da qui in poi, in pratica, scorro tutta la lista, appena trovo un nodo da
eliminare, ne sposto il puntatore al nodo successivo e poi lo elimino (con aux),
ma poi controllo sul resto della lista, cioè proprio sul nodo successivo!
Alla fine, si arriverà al caso base di lista vuota, perchè un next sarà di sicuro
NULL, quindi la funzione fa return e poi, */
return; /* tramite questo return, si chiudono anche tutti gli altri record di attivazione */
}
Preciso che ho scritto il codice qui sul forum e non l'ho provato, ma dovrebbe essere abbastanza corretto...
Spero di essere stato chiaro e di averti suggerito una soluzione più facile da scrivere, buona programmazione e alla prossima