Eliminare primo elemento della lista

di Anonimizzato13836 il
5 risposte
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

  • Ma perché non spieghi *in dettaglio* qual è il problema che hai nella tua funzione?
  • 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;
            }
        }
  • 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!
  • 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?
  • Grazie mille, appena ho 2 minuti liberi provo e ti faccio sapere
Devi accedere o registrarti per scrivere nel forum
5 risposte