Eliminare primo elemento della lista

di il
5 risposte

Eliminare primo elemento della lista

Ciao tutti,
ho un problema nell'eliminare il primo elemento di una lista(problema nella funzione Elimina).
Di seguito riporto il codice semplificato.
Mi fareste un grande piacere se poteste anche dare anche una breve spiegazione
Grazie a tutti per l'aiuto e una buona domenica!

#include <stdio.h>
#include <stdlib.h>

typedef struct _Elem
{
	int dato;
	struct _Elem* next;
} Elem;

Elem* elem_new(int dato){
	Elem* e=malloc(sizeof(Elem));
	e->dato=dato;
	
	return e;
}

Elem* popolazione(){
	Elem* e;
	Elem* first=NULL;
	Elem* last=NULL;
	
	int i;
	for(i=0; i<3; i++){
		e=elem_new(i*2+1);
		if (last!=NULL)
			last->next=e;
		else
			first=e;	
		last=e;
		
		printf("%d \n", e->dato);
	}
	Elimina(first);
}

void Elimina(Elem* first){
	Elem* e=first;
	Elem* f=NULL;
	
	
	first=e->next;
	free(e);
	Elem* h;
	for(h=first; h!=NULL; h=h->next ){
		printf("%d \n", h->dato);
	}
	
}

int main(void){
	popolazione();
	return (0);
}

5 Risposte

  • Re: Eliminare primo elemento della lista

    Ma perché non spieghi *in dettaglio* qual è il problema che hai nella tua funzione?
  • Re: Eliminare primo elemento della lista

    Il probema e' nella funzione popolazione()

    cosi inserisce correttamente gli elementi
    for(i=0; i<3; i++)
        {
            e=elem_new(i+1);
    
            if (first==NULL){
                first=e;
                last=e;
                last->next=NULL;
            }
            else{
                last->next=e;
                last=last->next;
                last->next=NULL;
            }
        }
  • Re: Eliminare primo elemento della lista

    oregon ha scritto:


    Ma perché non spieghi *in dettaglio* qual è il problema che hai nella tua funzione?
    Il problema è che mentre per gli elementi successivi al primo la seguente funzione va bene
    
    void deleteElem(Elem* first) {     
    	Elem* e=first;
    	Elem* f=NULL;
    	
    			
    	for (; e != NULL ; e = e->next)
    	    {
    	    	
    			if (e->dato==3){  //per esempio
    	    		if (f == NULL)  {  
    	    			first = e->next; 
    	    				    			
    	    		}else 	
    					f->next=e->next;  
    				free(e);
    			} 
    			else {
    				f=e; 
    			} 
    		   
    	    }
    
    per eliminare il primo sto avendo problemi. Sono ancora un novellino

    ale99, poi il codice per rimuovere gli elementi, primo e non, come dovrebbe essere?
    Grazie mille per le risposte!
  • Re: Eliminare primo elemento della lista

    while(first!=NULL && first->dato==value){
            f=first;
            first=first->next;
            free(f);
        }
    
        e=first->next;
        f=first;
    
        while(e!=NULL){
            if(e->dato==value){
                f->next=e->next;
                free(e);
                e=f->next;
    
                continue;
            }
    
            e=e->next;
            f=f->next;
        }
        f->next=NULL;
    Così non hai problemi.
    Io personalmente odio i cicli for() con le liste...


    Nella tua funzione: se chiami la
    free(e);
    e poi esegui
    e = e->next
    , dove andrà mai a posizionarsi e?
  • Re: Eliminare primo elemento della lista

    Grazie mille, appena ho 2 minuti liberi provo e ti faccio sapere
Devi accedere o registrarti per scrivere nel forum
5 risposte