Estrazione testa lista

di il
7 risposte

Estrazione testa lista

Perchè mi da tutti questo errore nella funzione EstrazioneTestaLista?
Errore:
incompatible type for argument 1 of `free'

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

struct EL{
       char info;
       struct EL *prox;
       };
       
typedef struct EL Elemlista;
typedef Elemlista *Listadinomi;
typedef enum{TRUE,FALSE}   boolean;

void Inizializza(Listadinomi *Lista);// funzione che inizializza lista
void InserisciInTesta(Listadinomi *Lista, int x);
boolean ListaVuota(Listadinomi Lista);
void InserisciInCoda(Listadinomi *Lista,char y);
void EstrazioneTestaLista(Listadinomi Lista);

int main(int argc, char *argv[])
{
  Listadinomi lista1;
  int x;
  x=10;
  char y='t';
  
  Inizializza(&lista1); //inizializzazione lista
  
  InserisciInTesta(&lista1,x);
  InserisciInCoda(&lista1,y);
  
[color=#FF0080] EstrazioneTestaLista(Listadinomi lista1);[/color]
  
  if((ListaVuota(lista1))==TRUE){
                 printf("la lista e' vuota\n");
  //}else{
       // printf("la lista contiene: %d , %c\n",x,y);}
  

 
  system("PAUSE");	
  return 0;
}

void Inizializza(Listadinomi *Lista){
            *Lista=NULL;
}

boolean ListaVuota(Listadinomi Lista){
        if(Lista==NULL) return TRUE; 
        else return FALSE;
        }
        
void InserisciInTesta(Listadinomi *Lista, int x){
     Elemlista *punt;
     punt=malloc(sizeof(Elemlista));
     
     punt->info=x;
     punt->prox=*Lista;
     *Lista=punt;
}
     
void InserisciInCoda(Listadinomi *Lista,char y){
     if((ListaVuota(*Lista))==TRUE){
                   Elemlista *punt;
                   punt=malloc(sizeof(Elemlista));
                   punt->info=y;
                   punt->prox=NULL;
                   *Lista=punt;
                   } else {InserisciInCoda(&((*Lista)->prox),y);
                   } 
                   }


[color=#FF0080]void EstrazioneTestaLista(Listadinomi Lista){
     Elemlista s;
    *Lista=s;
    *Lista=*Lista->prox;
     free(s); }[/color] 

7 Risposte

  • Re: Estrazione testa lista

    Ma dobbiamo farti da debugger e risolverti i problemi del compilatore? Devi avere chiaro cos'è un puntatore e cos'è una variabile.
    Se Elemlista non è un puntatore (ma una struttura) non puoi usare free che funziona solo sui puntatori.
    Poi la funzione EstrazioneTestaLista non è corretta.
  • Re: Estrazione testa lista

    Modifica:
    
    void EstrazioneTestaLista(Listadinomi Lista){
         Listadinomi ptr;
        ptr = Lista;
        Lista=Lista->prox;
         free(ptr); }
    
  • Re: Estrazione testa lista

    Io l'avevo modificato così ma effettivamente non funzionava
    void EstrazioneTestaLista(Listadinomi Lista){
         Elemlista *s;
         s=malloc(sizeof(Elemlista));
         Lista=s;
         Lista=Lista->prox;
         free(s);
    }
    Pero nemmeno il codice che mi hai suggerito non funziona, infatti se dopo aver chiamato la funzione stampo la lista stampa infiniti elementi...
  • Re: Estrazione testa lista

    Tu devi eliminare un elemento nella lista. Perche mi fai un malloc e poi di cosa? L'unica cosa che ti serve è un puntatore all'elemento da eliminare. Una volta avuto il puntatore, sposti la testa all'elemento successivo ed elimini il contenuto del puntatore. Il fatto che ti stampi infiniti elementi è da cercare altrove e non nella funzione Elimina in quanto lì non ci sono errori concettuali.
  • Re: Estrazione testa lista

    Mi spieghi cosa succede quà se la lista non è vuota?
    
    void InserisciInCoda(Listadinomi *Lista,char y)
    {
    	if((ListaVuota(*Lista))==TRUE)
    	{
    		Elemlista *punt;
    		punt=malloc(sizeof(Elemlista));
    		punt->info=y;
    		punt->prox=NULL;
    		*Lista=punt;
    	} 
    	else 
    	{
    		InserisciInCoda(&((*Lista)->prox),y);
    	}
    }
    
    Anzi te lo dico io che succede. Stai inserendo infiniti elementi finchè non esaurisci la memoria.
  • Re: Estrazione testa lista

    Avevo usato malloc per creare una variabile di tipo Elemlista per poi salvarci l'indirizzo della struttura da cancellare... però non ha senso..

    Si effettivamente non ha un limite la funzione Inserisci in coda.. ma perchè allora prima di chiamare la funzione Estrai testa non mi stampava infiniti elementi??
  • Re: Estrazione testa lista

    Perche non metti a posto il codice di inserimento in coda e poi vedi se ti da errori. Poi una cosa molto importante: Impara ad usare il debugger del tuo compilatore. Conoscere tutte le parti di un IDE è molto importante e 90% delle tue domande si risolvono da sole se uno sa usare bene i propri strumenti.
Devi accedere o registrarti per scrivere nel forum
7 risposte