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

Ciao a tutti,
    devo fare un programma utlizzando la struttura dati albero che mi
permette di creare un elenco ordinato (per cognome) di dati di persone.
Ho provato a farlo ma non sembra funzionare la procedura che aggiunge un
nuovo elemento all'albero.
**Le procedure sono queste:
Procedure creafoglia(dato: TipoInfoAlbero; var punt:punt_albero);
  begin
    new(punt);
    with punt^ do
      begin
        info.cognome:=dato.cognome;
        info.nome:=dato.nome;
        info.eta:=dato.eta;
        sinistro:=NIL;
        destro:=NIL
      end
  end;
Procedure Inserisci (dato:TipoInfoAlbero; var alb:punt_albero);
  begin
  if dato.cognome<=alb^.info.cognome then begin
      if alb^.sinistro=nil then creafoglia(dato, alb^.sinistro)
      else inserisci (dato, alb^.sinistro)
      end
    else begin
        if alb^.destro=nil then creafoglia(dato, alb^.destro)
        else inserisci (dato, alb^.destro)
    end;
   end;
**Mentre il programma completo è questo:
Program elencoAlbero;
type
  TipoInfoAlbero=record
                   nome:string;
                   cognome:string;
                   eta:0..100;
                 end;
  TipoAlbero=^TipoRecordAlbero;
  TipoRecordAlbero= record
                      info:TipoInfoAlbero;
                      sinistro,destro: TipoAlbero
                    end;
  punt_albero=TipoAlbero;
{L'albero Š realizzato tramite due liste: una per il semialbero sinistro e
l'altra per quello destro. L'albero Š ordinato rispetto la radice, in questo
modo se il cognome, in ordine alfabetico, Š minore della radice viene posto
nel semialbero sinistro, se maggiore in quello destro. }
{Le procedure di stampa, aggiornamento, lettura di un elemento di un albero
vengono realizzate ricorsivamente}
function test_albero_vuoto(alb:punt_albero):boolean;
begin
  if alb=nil then test_albero_vuoto:=true
  else test_albero_vuoto:=false
end;
function sinistro(alb:punt_albero):punt_albero;
{sposta il puntatore nel sottoalbero sinistro}
begin
  if test_albero_vuoto(alb)
  then write('operazione non applicabile')
else sinistro:=alb^.sinistro
end;
function destro(alb:punt_albero):punt_albero;
{sposta il puntatore nel sottoalbero destro}
begin
  if test_albero_vuoto(alb)
  then write('operazione non applicabile')
else destro:=alb^.destro
end;
Procedure Visita(alb:punt_albero);
  {stampa tutti i nodi di un albero gi… memorizzato e passato tramite valore
  alb, puntatore iniziale dell'albero}
  begin
  if not(test_albero_vuoto(alb))
  then begin
    {analizza la radice}
    write(alb^.info.cognome);
    write(alb^.info.nome);
    {visita ricorsivamente il sottoalbero sinistro}
    Visita(sinistro(alb));
    {visita ricorsivamente il sottoalbero destro}
    Visita(destro(alb))
  end
end;
Procedure creafoglia(dato: TipoInfoAlbero; var punt:punt_albero);
  begin
    new(punt);
    with punt^ do
      begin
        info.cognome:=dato.cognome;
        info.nome:=dato.nome;
        info.eta:=dato.eta;
        sinistro:=NIL;
        destro:=NIL
      end
  end;
Procedure Inserisci (dato:TipoInfoAlbero; var alb:punt_albero);
  begin
  if dato.cognome<=alb^.info.cognome then begin
      if alb^.sinistro=nil then creafoglia(dato, alb^.sinistro)
      else inserisci (dato, alb^.sinistro)
      end
    else begin
        if alb^.destro=nil then creafoglia(dato, alb^.destro)
        else inserisci (dato, alb^.destro)
    end;
   end;
Procedure Aggiungi(Var alb:TipoAlbero);
  var elem: tipoInfoAlbero;
  begin
  writeln('nome?'); readln(elem.nome);
  writeln('cognome?'); readln(elem.cognome);
  writeln('et…?');readln(elem.eta);
  Inserisci (elem, alb)
end;
var scelta: integer;
alb:TipoAlbero;
BEGIN
scelta:=1;
while scelta<> 3 do begin
writeln('Cosa vuoi fare?');
writeln('1. Leggi l''archivio');
writeln('2. Aggiungi un elemento all''archivio');
writeln('3. Esci');
readln(scelta);
case scelta of
  1: Visita(alb);
  2: Aggiungi(alb)
end;
end.
Grazie a chi mi può aiutare.
Massimo.

// Procedure Inserisci (dato:TipoInfoAlbero; var alb:punt_albero);
//   begin
//   if dato.cognome<=alb^.info.cognome then begin
//       if alb^.sinistro=nil then creafoglia(dato, alb^.sinistro)
//       else inserisci (dato, alb^.sinistro)
//       end
//     else begin
//         if alb^.destro=nil then creafoglia(dato, alb^.destro)
//         else inserisci (dato, alb^.destro)
//     end;
//    end;
Procedure  Inserisci (dato:TipoInfoAlbero; var alb:punt_albero);
begin
  if alb=nil
    then
      begin
         creafoglia(dato, alb);
      end
    else
      begin
         if dato.cognome<=alb^.info.cognome
           then Inserisci (dato, alb^.sinistro)
           else Inserisci (dato, alb^.destro);
      end;
end;
In pratica se il nodo è nil crea il nodo altrimenti confronta il suo valore
con quello da inserire, se minore o uguale lo inserisce a sinitra altrimenti
a destra.
Ciao Emanuele.
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.573 / Virus Database: 363 - Release Date: 28/01/2004