Secondo me ci sono due problemi:
1. Se vuoi cancellare un elemento della lista, ti serve oltre al puntatore all'elemento corrente anche quello a precedente (a meno che non fai una lista doppiamente linkata). in questo modo la cancellazione diventa:
2.Quando trovi l'elemento fai un doppio passo avanticodice:prev->next = current->next; free(current); // oppure lo aggiungi alla nuova lista
Come vedi nel caso trovi il nodo fai due volte *l = (*l)->next;. Usando il puntatore prev, ti basta assegnarlo a *lcodice:if(strcmp(...)){ ... *l = (*l)->next; // vai al prossimo free(q); } *l = (*l)->next; // vai al prossimo (del prossimo)
PS: Ovviamente devi gestire il caso in cui devi cancellare la testa della listacodice:if(strcmp(...)){ ... *l = prev; // vai al precendente free(q); } *l = (*l)->next; // vai al prossimo

Rispondi quotando