C, Funzione che cancella un elemento da una lista

di il
7 risposte

C, Funzione che cancella un elemento da una lista

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

  • Re: C, Funzione che cancella un elemento da una lista

    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.

  • Re: C, Funzione che cancella un elemento da una lista

    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....
  • Re: C, Funzione che cancella un elemento da una lista

    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?
  • Re: C, Funzione che cancella un elemento da una lista

    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.
  • Re: C, Funzione che cancella un elemento da una lista

    Ho provato mettendo un else alla condizione che non sia il primo elemento quello da eliminare ma continua a darmi lo stesso problema!
  • Re: C, Funzione che cancella un elemento da una lista

    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;
    }
    
  • Re: C, Funzione che cancella un elemento da una lista

    Oook grazie mille!
Devi accedere o registrarti per scrivere nel forum
7 risposte