Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] Perdita riferimento dopo Free( )

    Questa è la funzione per cancellare un nodo da un albero con una specifica chiave:

    codice:
    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.

  2. #2
    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.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    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( ).

  4. #4
    Uppo sperando in una risposta di unomichisiada

  5. #5
    Originariamente inviato da ^EvAmPiReS^
    Uppo sperando in una risposta di unomichisiada
    Ti rispondo dopo ora devo scappare
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    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
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7
    codice:
    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ì...

  8. #8
    Originariamente inviato da ^EvAmPiReS^
    codice:
    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ì...
    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

    codice:
    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.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  9. #9
    Grazie mille per l'aiuto e la costanza dimostata...proverò ad implementarla con un puntatore di puntatore...vederemo che succede 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. VVoVe:


    Ciao!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.