Newsgroup: it.comp.lang.pascal
Titolo: alberi

ciao a tutti :-)
avreste qualche programma già pronto sugli alberi da postare?
io ho qualche problemino ad usarli, ho capito la logica degli alberi
ma quando si tratta di fare un semplice programma nascono i casini con
i puntatori...
grazie per l'aiuto
http://www.geocities.com/SiliconValley/Sector/4934
ICQ: 25795934

i puntatori...
Sarebbe bene che dicessi che cosa non capisci, in modo che fosse piu'
facile per te imparare qualcosa, comunque di seguito ti posto un
programmino :
program PerFareUnAlberoCiVuoleIlPuntatore ;
{ Andrea Laforgia 1999 }
type PuntatoreNodo = ^TipoNodo ;
     TipoNodo = record
                  Valore : integer ;
                  PuntatoreSinistra : PuntatoreNodo ;
                  PuntatoreDestra : PuntatoreNodo ;
                end ;
var  Radice : PuntatoreNodo ;
     procedure AggiungiNodo( var NodoRadice : PuntatoreNodo ;
                                 NuovoValore : integer ) ;
     begin
       if ( NodoRadice = NIL ) then
       begin
         New( NodoRadice ) ;
         NodoRadice^.Valore := NuovoValore ;
         NodoRadice^.PuntatoreSinistra := NIL ;
         NodoRadice^.PuntatoreDestra := NIL ;
       end
       else
       if ( NuovoValore < NodoRadice^.Valore ) then
         AggiungiNodo( NodoRadice^.PuntatoreSinistra, NuovoValore )
       else
         AggiungiNodo( NodoRadice^.PuntatoreDestra, NuovoValore ) ;
     end ;
     procedure ScriviAlberoInOrdine( NodoRadice : PuntatoreNodo ) ;
     begin
       if ( NodoRadice <> NIL ) then
       begin
         ScriviAlberoInOrdine( NodoRadice^.PuntatoreSinistra ) ;
         write( NodoRadice^.Valore, ' ' ) ;
         ScriviAlberoInOrdine( NodoRadice^.PuntatoreDestra ) ;
       end ;
     end ;
     procedure DeallocaAlbero( NodoRadice : PuntatoreNodo ) ;
     begin
       if ( NodoRadice <> NIL ) then
       begin
         DeallocaAlbero( NodoRadice^.PuntatoreSinistra ) ;
         DeallocaAlbero( NodoRadice^.PuntatoreDestra ) ;
         dispose( NodoRadice ) ;
       end ;
     end ;
begin
  Radice := NIL ;
  AggiungiNodo( Radice, 5 ) ;
  AggiungiNodo( Radice, 18 ) ;
  AggiungiNodo( Radice, 9 ) ;
  AggiungiNodo( Radice, 77 ) ;
  AggiungiNodo( Radice, 11 ) ;
  AggiungiNodo( Radice, 4 ) ;
  AggiungiNodo( Radice, 10 ) ;
  writeln ;
  ScriviAlberoInOrdine( Radice ) ;
  DeallocaAlbero( Radice ) ;
end.
--
Andrea Laforgia
andrea_...@bigfoot.com

  AggiungiNodo( Radice, 18 ) ;
radice non dovrebbe puntare al primo elemento ma all'elemento che
abbiamo appena aggiunto visto che NodoRadice è passato per variabile
ovvero, quando faccio new(NodoRadice) la variabile NodoRadice assume
un nuovo valore e punta al nuovo elemento che ho messo. visto che è
stata passata per riferimento dovrebbe modificare anche la variabile
Radice che si trovava come parametro quando è stata chiamata la
procedure.
http://www.geocities.com/SiliconValley/Sector/4934
ICQ: 25795934

procedure.
No, ti stai confondendo.
Radice viene modificata solo la prima volta, tutte le altre volte la
procedura viene chiamata ricorsivamente facendo assumere a NodoRadice
il valore del nuovo nodo da creare. Radice non viene modificata tutte
le volte, solo la prima volta, cioe' quando ancora non esiste.
Andrea Laforgia (andrea_...@XXXbigfoot.com)
------------------------------------------------
Il mio indirizzo di posta elettronica č inattivo 
per il momento.