Salve a tutti, devo realizzare una funzione che, data una lista e un determinato valore 'v',
vada a rimuovere la prima occorrenza di |v| (valore assoluto) presente nella lista, altrimenti non faccio nulla. Specifico per completezza che il ciclo si ripete ogni volta che inserisco un valore 'v' da tastiera per un indefinito numero di valori (quindi il ciclo può essere richiamato più volte). Quando il valore inserito è uno 0 stampa la lista e termina il programma (tramite un'altra funzione).
Ci sto perdendo la testa da un pò e vorrei capire dove sbaglio. Allego di seguito la funzione da me creata.
Chiedo scusa in anticipo per il disordine, ho cercato di spiegare al meglio cosa, almeno nella mia testa, credo di aver fatto con ogni riga di codice tramite i commenti. Ringrazio in anticipo chiunque contribuirà.
vada a rimuovere la prima occorrenza di |v| (valore assoluto) presente nella lista, altrimenti non faccio nulla. Specifico per completezza che il ciclo si ripete ogni volta che inserisco un valore 'v' da tastiera per un indefinito numero di valori (quindi il ciclo può essere richiamato più volte). Quando il valore inserito è uno 0 stampa la lista e termina il programma (tramite un'altra funzione).
Ci sto perdendo la testa da un pò e vorrei capire dove sbaglio. Allego di seguito la funzione da me creata.
C:
void EliminaPrimaOcc (ListaDiElementi* lista,int valore) {
ListaDiElementi aux, elim;
int TROVATO= 0;
aux= (ListaDiElementi)sizeof(ElementoDiLista);
aux= *lista;
if (*lista!=NULL) { /*mi assicuro che la lista non sia vuota, in tal caso non faccio nulla*/
if (aux->info==abs(valore)) { /*CASO1: l'occorrenza è il primo elemento della lista*/
if (aux->next!=NULL) { /*Se l'elemento successivo è !=NULL ovvero la lista contiene più di un elemento eseguo l'if collegando la lista all'elemento successivo e chiamando free sul puntatore ausiliario che punta l'elemento da eliminare*/
*lista= (*lista)->next;
free(aux);
}
else { /*Nel caso opposto ho che la lista contiene solo 1 elemento (quello da eliminare) pertanto elimino il collegamento tra lista e elemento1 e col puntatore ausiliario chiamo la free sull'elemento da eliminare */
*lista= aux;
free(aux);
}
TROVATO=1;
}
}
while (aux->next!=NULL || !TROVATO) { /*Ora che sono sicuro che non rientro nel CASO1 la possiblità rimanete è che l'elemento da eliminare sia in mezzo alla lista o in ultima posizione */
if (aux->next->info==abs(valore)) {
if (aux->next->next!=NULL) { /*Verifico se l'elemento successivo all'occorrenza da eliminare sia !=NULL, in tal caso devo collegare l'elemento precedente a quello che segue l'occorrenza da eliminare che si trova in mezzo ai due */
elim= aux->next;
aux= aux->next->next;
free(elim);
TROVATO= 1;
}
else { /* Se invece l'occorrenza da eliminare ha next==NULL elimino il collegamento con l'elemento precedente ponendo il suo next=NULL e con un puntatore ausiliario chiamo la free sull'elemento da eliminare*/
elim= aux->next;
free(elim);
aux->next= NULL;
TROVATO= 1;
}
}
aux= aux->next; /* Passo all'elemento successivo, se ho già trovato l'elemento o sono giunto alla fine della lista le due condizioni del while mi impediranno di ripetere il ciclo, quindi nella lista non sono presenti occorrenze del valore dato */
}
}
Chiedo scusa in anticipo per il disordine, ho cercato di spiegare al meglio cosa, almeno nella mia testa, credo di aver fatto con ogni riga di codice tramite i commenti. Ringrazio in anticipo chiunque contribuirà.
Ultima modifica: