C, Funzione che cancella un elemento da una lista

di Anonimizzato14594 il
7 risposte
Ciao a tutti, ho un problema con la procedura che cancella un elemento da una lista...
la funzione scritta da me è la seguente:
void delete(item *l, int input){

  item *aux, *corr;

  if(l==NULL) return;

  aux=l;

  if(aux->key==input){

    l=l->next; 

    free(aux);

  }

  corr=l->next;

  while(corr!=NULL){

    if(corr->key==input){

      aux->next=corr->next;

      corr->next=NULL;

      free(corr);

    }

    else{

      aux=aux->next;

      corr=corr->next;

    }

  }

}
la procedura va funziona benissimo in tutti i casi, tranne quando l'elemento da eliminare è il primo della lista...non capisco il problema....

ho provato a fare delle stampe di debug e ho notato che ogni volta che cancello il primo elemento di una lista, se successivamente stampo la lista in prima posizione mi appare uno zero..

potete aiutarmi?

7 Risposte

  • Ciao,
    vedo subito una cosa strana. Nel tuo codice hai
    
    if(l'elemento da eliminare e' quello in testa)
    {
        elimina elemento in testa;
    }
    altro codice...
    
    Ma questo significa che "altro codice..." viene eseguito anche se l'elemento da eliminare è quello in testa. Non so se mi sono spiegato bene: entra nell'if, esegue il codice dell'if, poi prosegue ed esegue anche il resto del codice. Invece dovresti fare if...else... oppure mettere un return nell'if che blocchi l'esecuzione della funzione.

  • Grazie, quindi dici che nel caso in cui il primo sia quello da eliminare, una volta eliminato di bloccare la funzione...allora ci metterò un else....
  • Un' altra domanda..dovrei passare per indirizzo il puntatore al primo elemento della lista o va bene così....non è che se la lascio così le modifiche sono solo sulla "copia" della lista e non sulla lista vera e propria?
  • riccac ha scritto:


    un' altra domanda..dovrei passare per indirizzo il puntatore al primo elemento della lista o va bene così....non è che se la lascio così le modifiche sono solo sulla "copia" della lista e non sulla lista vera e propria?
    Sì, quello è un altro problema.
    Quello che solitamente si fa (almeno io l'ho fatto e visto fare più volte) è
    typedef item* Lista;
    cioè definire un tipo Lista come puntatore ad un item (ovviamente sarà il puntatore alla testa della lista). Poi nella funzione passi un puntatore alla Lista, quindi un item**, per permettere alla funzione stessa di modificare la lista.
  • Ho provato mettendo un else alla condizione che non sia il primo elemento quello da eliminare ma continua a darmi lo stesso problema!
  • Questo perché operi su una copia di l...
    Ti posto un esempio di codice che avevo scritto per un altro utente in un altro thread (sono problemi piuttosto frequenti! )
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct elemento_t
    {
    	int val;
    	struct elemento_t *next;
    } Elemento;
    
    typedef Elemento* Lista;
    
    /* La funzione prende come parametro un puntatore alla lista:
     * può modificare la lista stessa! */
    void inserisci_coda(Lista *l, int x)
    {
    	/* allocazione di un nuovo elemento della lista */
    	Elemento *new_el = (Elemento *) malloc(sizeof(Elemento));
    	new_el -> val = x;
    	new_el -> next = NULL;
    
    	/* se la lista è vuota */
    	if(*l == NULL)
    	{
    		*l = new_el;
    	}
    
    	else
    	{	
    		Lista aux = *l;
    		/* scorro fino in fondo */
    		while(aux->next != NULL)
    			aux = aux->next;
    
    		aux->next = new_el;
    	}
    }
    
    
    void rimuovi_elemento(Lista *l, int x)
    {
    	Lista aux = *l;
    	if(aux->val == x)
    	{
    		*l = aux->next;
    		free(aux);
    	}
    	else
    	{
    		while(aux->next->val != x)
    			aux = aux->next;
    
    		Lista tmp = aux->next;
    		aux->next = aux->next->next;
    		free(tmp);
    	}
    }
    
    
    void stampa_lista(Lista l)
    {
    	while(l != NULL)
    	{
    		printf("%d\n", l->val);
    		l = l->next;
    	}
    }
    
    
    int main()
    {
    	Lista l;
    
    	inserisci_coda(&l, 5);
    	inserisci_coda(&l, 2);
    	inserisci_coda(&l, 1);
    
    	stampa_lista(l);	
    	printf("\n");
    
    	rimuovi_elemento(&l, 5);
    
    	stampa_lista(l);
    	printf("\n");
    
    	rimuovi_elemento(&l, 1);
    
    	stampa_lista(l);
    	printf("\n");
    
    	rimuovi_elemento(&l, 2);
    
    	stampa_lista(l);
    	printf("\n");
    
    	return 0;
    }
    
  • Oook grazie mille!
Devi accedere o registrarti per scrivere nel forum
7 risposte