PDA

Visualizza la versione completa : [C] Perdita riferimento dopo Free( )


^EvAmPiReS^
28-09-2005, 00:01
Questa è la funzione per cancellare un nodo da un albero con una specifica chiave:


AlberoRicerca Delete (TipoElemento X, AlberoRicerca nodo) //applica solo cambiamenti temporanei alle chiavi

{

AlberoRicerca Temp;

if ( nodo == NULL)

printf("Elemento da cancellare non trovato.\n\n");

if (X < nodo->Chiave)

nodo->Left = Delete (X, nodo->Left);

if (X > nodo->Chiave)

nodo->Right = Delete (X, nodo->Right);

if (nodo->Left && nodo->Right)

{

Temp = Minimo (nodo->Right);

nodo->Chiave = Temp->Chiave;

nodo->Right = Delete (nodo->Chiave, nodo->Right);

}

{
Temp = nodo;

if (nodo->Left == NULL)

nodo = nodo->Right;

if ( nodo->Right == NULL)

nodo = nodo->Left;

free ( Temp );

}

return nodo;

}


TipoElemento Chiave (Posizione nodo)

{

return nodo->Chiave; //ritorna la chiave della cella a cui punta il puntatore albero

}


Ora se nel main richiamo le funzioni nel seguente ordine:


Insert(1,albero);

Delete(1,albero);

Svuota(albero);

non ho problemi ma se prima di cancellare svuoto l'albero mi dà un errore in esecuzione, come ovviare al fatto che dopo la chiamata della funzione Svuota, la Free () (che richiamo al suo interno) fà si che il mio puntatore (albero) vada a NULL e quindi sputi fuori il suddetto errore? Grazie per ogni suggerimento.

unomichisiada
28-09-2005, 00:11
Aspetta fammi capire bene... tu vorresti prima svuotare l'albero e poi cancellare un elemento? Non vedo che senso abbia visto che l'albero l'hai già svuotato e l'elemnto non è più presente. Comunque per tua informazione la funzione free() non imposta a NULL i puntatori su cui è chiamata ma restituisce soltanto il blocco di memoria cui essi puntano al sistema operativo.

^EvAmPiReS^
28-09-2005, 14:05
Ok a me era sufficiente un controllo tramite il quale potessi stampare a video che ne so "Albero vuoto" nel caso in cui avessi usato la Svuota è possibile? Grazie per la Free( ).

^EvAmPiReS^
28-09-2005, 20:51
Uppo sperando in una risposta di unomichisiada :smack: :ciauz:

unomichisiada
28-09-2005, 21:00
Originariamente inviato da ^EvAmPiReS^
Uppo sperando in una risposta di unomichisiada :smack: :ciauz: Ti rispondo dopo ora devo scappare

unomichisiada
28-09-2005, 23:08
postami il codice della tua funzione svuota e ti dico come la cambierei o se va già bene. In generale comunque devi visitare l'albero in posorder liberando la memoria di ogni nodo visitato e poi impostare a NULL il puntatore alla radice

^EvAmPiReS^
29-09-2005, 00:35
AlberoRicerca Svuota ( AlberoRicerca radice)

{

if ( radice != NULL )

{

Svuota ( radice->Left) ;

Svuota ( radice->Right);

free ( radice ) ;

}

radice = NULL;

return radice;

}


Scusa che significa in posorder? Va bene la soluzione ricorsiva? Ho già provato come vedi ad impostare il puntatore che torna a NULL ma non va così... :messner: :messner:

unomichisiada
29-09-2005, 01:41
Originariamente inviato da ^EvAmPiReS^

AlberoRicerca Svuota ( AlberoRicerca radice)

{

if ( radice != NULL )

{

Svuota ( radice->Left) ;

Svuota ( radice->Right);

free ( radice ) ;

}

radice = NULL;

return radice;

}


Scusa che significa in posorder? Va bene la soluzione ricorsiva? Ho già provato come vedi ad impostare il puntatore che torna a NULL ma non va così... :messner: :messner:
POSTORDER non posorder scusa la t è rimasta nella tastiera. Visita Postorder vuol dire visita in ordine posticipato cioè prima il figlio sinistro poi quello destro di ogni nodo e poi il nodo stesso. La tua funzione svuota va già bene da questo punto di vista, l'unica cosa è che radice = NULL; messo li non serve a nulla perchè il parametro AlberoRicerca radice della funzione è passato per valore non per riferimento (per passarlo per riferimeno dovresti usare i puntatori a puntatori). Per impostare effettivamente la radice a NULL devi farlo all'esterno della funzione (nella main o dovunque tu la chiami). In altre parole devi fare una coas tipo



Scuota (radice_albero);
radice_albero = NULL;

ed eliminare radice = NULL; dal codice della funzione che tanto non serve. Fammi sapere
Dimenticavo, il valore di ritorno lascialo void.

^EvAmPiReS^
29-09-2005, 20:28
Grazie mille per l'aiuto e la costanza dimostata...proverò ad implementarla con un puntatore di puntatore...vederemo che succede :zizi: Al massimo se ho proprio problemi ti mando un mess. privato, sempre se trovo tempo tra Sistemi Operativi,Metodi numerici per la grafica I,Basi di dati che ultimamente stanno risucchiando tutti il mio tempo. :dottò: :oVVoVe: :messner: :sonno:


Ciao!

Loading