PDA

Visualizza la versione completa : [C] Allocazione/deallocazione memoria per elementi di una lista


diantha
02-02-2012, 11:54
Ciao ragazzi,mi sto trovando in difficoltà con le allocazioni di memoria.
Non sono molto pratica di c,sto iniziando a studiarlo da poco, e ho notato che bisogna allocare la memoria quando si inizializzano le liste e deallocarla quando si eliminano gli elementi della lista.
Di solito in java,per svuotare una lista per esempio assegnavo a
testa= NULL e automaticamente mi svuotava la lista. Con c tutto questo è possibile???

Ho implementato dei codici per deallocare lo spazio relativo ad un nodo della lista,ma poi il puntatore non mi punta più alla lista ancora piena ma a null e non capisco perchè...


//mi estrae la testa,e mi restituisce l'attuale testa della lista
struct nodo_lista_adiacenti *estrai_testa(struct nodo_lista_adiacenti *testa)
{
struct nodo_lista_adiacenti *corrente;
corrente= testa;

if(corrente != NULL)
{
testa= testa->next;
free(corrente);

}
return testa;
}

oppure

struct nodo_lista_adiacenti *elimina_elemento_lista(int n,struct nodo_lista_adiacenti *testa)
{
struct nodo_lista_adiacenti *corrente, *precedente;

for ( corrente = testa , precedente = NULL ;
corrente != NULL && corrente -> info != n;
precedente = corrente , corrente = corrente -> next );

//caso in cui non si trova n e arriviamo alla fine
if ( corrente == NULL ) return testa ;
if ( precedente == NULL ) testa = testa -> next ;//n si trova nel primo nodo
else precedente -> next = corrente -> next ;
free ( corrente );

return testa ;

}

I codici mi sembrano giusti,senza la deallocazione funziona tutto bene,appena aggiungo la deallocazione ho problemi...

In particolare dovrei usare una di queste funzioni per esempio nella visita bfs di un grafo:


struct nodo_lista_adiacenti *bfs(struct vertice *grafo, int i, int dim)
{
int confronto;
//inizializzo la coda vuota
struct nodo_lista_adiacenti *lista=NULL, *testa, *adiacenti=NULL, *da_restituire=NULL;
//coloro tutti i vertici di bianco
vertici_bianchi(grafo, dim);
// i è l'indice del vertice da cui parte l'esplorazione
strcpy(grafo[i].colore, "grigio");
grafo[i].distanza_precedente= 0;
grafo[i].predecessore= 0;
//inserisco in coda alla lista i che è un indice
lista= inserisci_valore_in_coda(i, lista);
while(lista != NULL)
{
testa= visualizza_testa(lista);
lista=estrai_testa(lista);
adiacenti= cerca_adiacenti(testa->info, grafo);

while(adiacenti != NULL)
{
if( (confronto= (strcmp(grafo[adiacenti->info].colore, "bianco"))) == 0)
{
strcpy(grafo[adiacenti->info].colore, "grigio");
grafo[adiacenti->info].distanza_precedente= grafo[testa->info].distanza_precedente +1;
grafo[adiacenti->info].predecessore= testa->info; //attenzione si tratta dell'indice
lista= inserisci_valore_in_coda(adiacenti->info, lista);
//in questa lista tengo in memoria gl'indici dei nodi raggiungibili dall'indice i
da_restituire= inserisci_valore_in_coda(adiacenti->info, da_restituire);
}
adiacenti= adiacenti->next;
}
strcpy(grafo[testa->info].colore, "nero");

}
return da_restituire;
}

mi serve il puntatore alla lista per poter usare la lista successivamente...
Perchè non funziona???
Grazie....

oregon
02-02-2012, 13:31
Originariamente inviato da diantha
... Di solito in java ...

Non fare nessun paragone con altri linguaggi se stai imparando il C. Soprattutto, dimentica Java-


Ho implementato dei codici per deallocare lo spazio relativo ad un nodo della lista,ma poi il puntatore non mi punta più alla lista ancora piena ma a null e non capisco perchè...

Di quale linea/funzione parli?

P.S. Usa i tag CODE sul forum altrimenti il codice non si capisce ...

diantha
02-02-2012, 13:45
Questa è la funzione che mi da problemi:


//mi estrae la testa,e mi restituisce l'attuale testa della lista
struct nodo_lista_adiacenti *estrai_testa(struct nodo_lista_adiacenti *testa)
{
struct nodo_lista_adiacenti *corrente;

corrente= testa;
if(corrente != NULL)
{
testa= testa->next;
free(corrente);
} return testa;
}


//chiamata da quest'altra funzione:



struct nodo_lista_adiacenti *bfs(struct vertice *grafo, int i, int dim)
{
int confronto; //inizializzo la coda vuota
struct nodo_lista_adiacenti *lista=NULL,
*testa, *adiacenti=NULL, *da_restituire=NULL;

//coloro tutti i vertici di bianco
vertici_bianchi(grafo, dim);
// i è l'indice del vertice da cui parte l'esplorazione
strcpy(grafo[i].colore, "grigio");
grafo[i].distanza_precedente= 0;
grafo[i].predecessore= 0;
//inserisco in coda alla lista i che è un indice
lista= inserisci_valore_in_coda(i, lista);

while(lista != NULL)
{
testa= visualizza_testa(lista);
lista=estrai_testa(lista);
adiacenti= cerca_adiacenti(testa->info, grafo);

while(adiacenti != NULL)
{
if( (confronto= (strcmp(grafo[adiacenti->info].colore, "bianco"))) == 0)
{
strcpy(grafo[adiacenti->info].colore, "grigio");
grafo[adiacenti->info].distanza_precedente= grafo[testa-
>info].distanza_precedente +1; grafo[adiacenti->info].predecessore= testa->info;
lista= inserisci_valore_in_coda(adiacenti->info, lista);
da_restituire= inserisci_valore_in_coda(adiacenti->info, da_restituire);
}
adiacenti= adiacenti->next;
}
strcpy(grafo[testa->info].colore, "nero");
}
return da_restituire;
}

diantha
02-02-2012, 14:30
Penso di aver risolto,dovevo modificare la funzione bsf,perchè il valore testa->info,quando estraggo la testa non sarà più quello di prima,quindi ho inizializzato un'altra variabile intera
qui:






while(lista != NULL)
{
testa= visualizza_testa(lista);
//qui e successivamente dove trovo testa->info
val_testa= testa->info;

lista=estrai_testa(lista);
adiacenti= cerca_adiacenti(testa->info, grafo);
while(adiacenti != NULL)
{
.........




grazie cmq, spero di non aver più bisogno anche perchè sto facendo un progetto universitario e devo consegnarlo a breve...
ciao...

Loading