PROBLEMA Funzione Linguaggio C

SaltyNenno

Nuovo Utente
58
7
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.

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:

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
A cosa serve?

Inviato dal mio Nexus 5 utilizzando Tapatalk
 

Andretti60

Utente Èlite
6,440
5,091
La fai troppo complicata, non hai bisogno nè di un condizionale iniziale nè di una variabile bool, puoi fare tutto in un ciclo while. Ma attento, poiché questa funzione può modificare il valore della variabile lista, che è un puntatore, devi passare il suo indirizzo (che è quindi un puntatore di puntatore). Tutti noi odiamo il C per questo .
 

SaltyNenno

Nuovo Utente
58
7
La fai troppo complicata, non hai bisogno nè di un condizionale iniziale nè di una variabile bool, puoi fare tutto in un ciclo while. Ma attento, poiché questa funzione può modificare il valore della variabile lista, che è un puntatore, devi passare il suo indirizzo (che è quindi un puntatore di puntatore). Tutti noi odiamo il C per questo .

Ho risolto, in effetti molta roba era davvero inutile e con un while sono riuscito ad evitarla. Tuttavia non capisco come potrei liberarli della booleana, come farei senza di essa a interrompere il ciclo quando trovo il primo elemento da rimuovere? Dopo e se trovo la prima occorrenza uguale al valore dato devo interrompere il ciclo e ripeterlo sul successivo valore che inserirò da tastiera.
 

SaltyNenno

Nuovo Utente
58
7
Con un banale break; all'interno del if()
Capisco, tuttavia ho smesso di usare la break nei codici da quando a lezione ci hanno detto di evitarla, non ricordo se per "eleganza del codice" o perchè bisognava stare attenti all'uso che se ne faceva. Comunque grazie mille per l'aiuto :)
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili