{ File: listeman.pas }

{ Scopo: creazione "a mano" e stampa di una lista collegata semplice }

program ListeCollegate;

type
  TipoElemLista   = integer;
  TipoLista       = ^TipoRecordLista;
  TipoRecordLista = record
                      info : TipoElemLista;
                      next : TipoLista
                    end;   


  procedure StampaLista (lis: TipoLista);
  { Stampa la lista lis.  Versione iterativa. }
  begin
    while lis <> NIL do
    begin
      writeln(lis^.info);
      lis := lis^.next
    end
  end; { StampaLista }
  
  
  procedure StampaListaRicorsiva (lis: TipoLista);
  { Stampa la lista lis.  Versione ricorsiva. }
  begin
    if lis <> NIL then
    begin
      writeln(lis^.info);
      StampaListaRicorsiva(lis^.next)
    end
  end; { StampaListaRicorsiva }
  

  procedure StampaListaInvertita (lis: TipoLista);
  { Stampa la lista lis in ordine invertito.  Versione ricorsiva. }
  begin
    if lis <> NIL then
    begin
      StampaListaRicorsiva(lis^.next);
      writeln(lis^.info)
    end
  end; { StampaListaInvertita }
  

var
  lista : TipoLista;

begin { ListeCollegate }
  new(lista);
  write('Inserisci un intero: ');
  readln(lista^.info);
  new(lista^.next);
  write('Inserisci un intero: ');
  readln(lista^.next^.info);
  lista^.next^.next := NIL;
  writeln('Ecco i numeri che hai scritto');
  StampaLista(lista);
  writeln('Ecco i numeri che hai scritto (stampa ricorsiva)');
  StampaListaRicorsiva(lista);
  writeln('Ecco i numeri che hai scritto (in ordine inverso)');
  StampaListaInvertita(lista);
end. { ListeCollegate }