Newsgroup: it.comp.lang.pascal
Titolo: Urgente aiuto

Salve a tutti,
questo lunedì un mio amico ha l'esame di informatica all'università: ha
bisogno del vostro aiuto per poter risolvere questo suo problema.
Il listato che vedete è di un programma che crea una lista di record
inserendo il titolo e l'autore di un libro e dà la possibilità di effettuare
una ricerca per titolo stampanda a video i record che hanno il titolo
ricercato.
Il mio amico dice che ottiene strani risultati tipo: la visualizzazione non
è quella che ci si aspetta, quando ho testato il programma, oltre ad avere
risultati diversi da quelli inseriti, il programma stampava dei record in
più mai inseriti.
Spero di avervi descritto tutto quanto mi è stato riferito.
Spero non vi costi niente testare il programma nonostante sia sabato e, di
solito,  è meglio uscire per divertirsi e conoscere un sacco di gente
(specie se femminile !).
Spero di poter riferire al mio amico qualche utile vostro consiglio.
Grazie in anticipo da entrambi (più da lui, però, che deve passare l'esame),
Mkè
Program Biblioteca (input,output);
type
    tipoelem=record
               titolo, autore:string;
             end;
    posizione=^cella;
    cella=record
             libro:tipoelem;
             successivo:posizione;
          end;
    lista=posizione;
    puntelem = ^tipoelem;
var
    l,l1:lista;p,p1:posizione;
FUNCTION listavuota (var l:lista):boolean;
begin
    listavuota:=(l=nil);
end;
FUNCTION finelista (p:posizione; var l:lista):boolean;
begin
    if p=nil then
        finelista:=(l=nil)
    else
        finelista:=(p^.successivo=nil);
    end;
FUNCTION primolista (var l:lista):posizione;
begin
     primolista:=nil
end;
FUNCTION succlista (p:posizione; var l:lista):posizione;
begin
    if not finelista(p,l) then
       if p=nil then succlista:=l
          else succlista:=p^.successivo
    else writeln('ERRORE:La lista è finita');
end;
FUNCTION predlista (p:posizione; var l:lista):posizione;
var q:posizione;
begin
    if p<>nil then
        if p=l then writeln('ERRORE:Stai cercando il precedente del primo
elemento.')
        else
            begin
                q:=l;
                while q^.successivo<>p do q:=q^.successivo;
                predlista:=q;
            end;
end;
FUNCTION leggilista (p:posizione; var l:lista):puntelem;
var
  tempo : puntelem;
begin
     if not finelista(p,l) then
       begin
         if (p=nil) then
           begin
             tempo^.titolo := l^.libro.titolo;
             tempo^.autore := l^.libro.autore;
           end
         else
           begin
             tempo^.titolo := p^.successivo^.libro.titolo;
             tempo^.autore := p^.successivo^.libro.autore;
           end;
       end;
end;
PROCEDURE scrivilista (a:tipoelem; p:posizione; var l:lista);
begin
     if not finelista(p,l) then
        if (p=nil) then
          begin
            l^.libro.titolo:=a.titolo;
            l^.libro.autore:=a.autore;
          end
        else
          begin
            p^.successivo^.libro.titolo:=a.titolo;
            p^.successivo^.libro.autore:=a.autore;
          end;
end;
PROCEDURE inslista (a:tipoelem; p:posizione; var l:lista);
var temp:posizione;
begin
     if p=nil then
        begin
             temp:=l;
             new(l);
             l^.successivo:=temp;
             l^.libro.titolo:=a.titolo;
             l^.libro.autore:=a.autore;
        end
     else
        begin
             temp:=p^.successivo;
             new(p^.successivo);
             p^.successivo^.successivo:=temp;
             p^.successivo^.libro.titolo:=a.titolo;
             p^.successivo^.libro.autore:=a.autore;
        end
end;
PROCEDURE canclista (p:posizione; var l:lista);
begin
     if not finelista(p,l) then
        if p=nil then l:=l^.successivo
        else p^.successivo:=p^.successivo^.successivo;
end;
PROCEDURE crealista (var l:lista);
begin
     l:=nil;
     new(l);
end;
PROCEDURE costruisci(var l:lista);
var p:posizione;
    a:tipoelem;
    c:char;
    i,n:integer;
begin
crealista(l);
p:=primolista(l);
c := 'z';
repeat
write('Inserisci il titolo: '); readln(a.titolo);
write('Inserisci l''autore: '); readln(a.autore);
inslista(a,p,l);
p:=succlista(p,l);
write('Vuoi inserirne un altro?(s/n)');
readln(c)
until c = 'n'
end;
PROCEDURE trova (var l:lista);
var a,b: puntelem;
  c : tipoelem;
begin
     crealista(l1);
     p:=primolista(l);
     p1:=primolista(l1);
     write ('Inserisci il titolo da cercare :'); readln(a^.titolo);
     while not finelista(p,l) do
     begin
          b:=leggilista(p,l);
          if a^.titolo = b^.titolo then
          begin
               c.titolo := b^.titolo;
               c.autore := b^.autore;
               inslista(c,p1,l1);
               p1:=succlista(p1,l1);
          end;
          p:=succlista(p,l);
     end;
end;
PROCEDURE visualizza (var l1:lista);
var a :puntelem;
begin
     p1:=primolista(l1);
     if listavuota(l1) then
        writeln('La lista e'' vuota')
     else
         begin
         writeln;
         while not finelista(p1,l1) do
         begin
              a:=leggilista(p1,l1);
              writeln('Il titolo è : ',a^.titolo);
              p1:=succlista(p1,l1);
         end;
         end;
end;
PROCEDURE menu;
var scelta:integer;
    p:posizione;
    a:tipoelem;
    i,n:integer;
begin
  repeat
    writeln;
    writeln(' LISTA');
    writeln('   1. crea la lista');
    writeln('   2. trova e visualizza');
    writeln('   3. esci');
    writeln(' COSA VUOI FARE? ');
    readln(scelta);
    case scelta of
    1: begin
        costruisci(l);
       end;
    2: begin
       trova(l);
       visualizza(l1);
       end;
    3: writeln;
    end;
  until scelta=3;
end;
begin  (*main*)
    writeln;
    menu;
    writeln('ARRIVEDERCI')
end.

Di al tuo amico di ripassare un po' la gestione delle liste dinamiche.
Scherzi a parte l'ho riscritto (in maniera molto semplice) daglielo e faglielo studiare
e/o modificare
Ciao,
David 
www.utilityweb.net
--
Program Biblioteca(Input, Output);
Type
  PLista   = ^Lista;
  Lista    = Record
               Titolo : String;
               Autore : String;
               Prossimo : PLista;
             End;
Var
  Primo : PLista;
  Function Lista_Vuota : Boolean;
  Begin
    Lista_Vuota := (Primo = Nil);
  End;
  Procedure Svuota_Lista;
  Var
    P, P1 : PLista;
  Begin
    P := Primo;
    While (P <> Nil) Do
          Begin
            P1 := P;
            P  := P^.Prossimo;
            Dispose(P1);
          End;
    Primo := Nil;
  End;
  Procedure Aggiunge_Elemento(Titolo, Autore : String);
  Var
    P, P1 : PLista;
  Begin
    New(P);
    P^.Titolo   := Titolo;
    P^.Autore   := Autore;
    P^.Prossimo := Nil;
    If Not Lista_Vuota Then
       Begin
         P1 := Primo;
         While (P1^.Prossimo <> Nil) Do P1 := P1^.Prossimo;
         P1^.Prossimo := P;
       End
         Else
           Primo := P;
  End;
  Procedure Riempi_Lista;
  Var
    Titolo : String;
    Autore : String;
    Ch     : Char;
  Begin
    Repeat
      Write('Inserisci il titolo : ');ReadLn(Titolo);
      Write('Inserisci l''autore  : ');ReadLn(Autore);
      Aggiunge_Elemento(Titolo, Autore);
      Write('Vuoi inserirne un altro? (s/n)');
      Readln(Ch)
    until ch = 'n'
  End;
  Procedure Trova_E_Visualizza;
  Var
    P       : PLista;
    Trovato : Boolean;
    Titolo  : String;
  Begin
    Write('Titolo da ricercare : ');ReadLn(Titolo);
    P       := Primo;
    Trovato := False;
    While (P <> Nil) Do
          Begin
            If P^.Titolo = Titolo Then
               Begin
                 WriteLn('Autore : ', P^.Autore);
                 Trovato := True;
               End;
            P := P^.Prossimo;
          End;
    If Not Trovato Then Writeln('Nessun autore trovato...!');
  End;
Procedure Menu;
Var
  Scelta : Integer;
begin
  repeat
    writeln;
    writeln(' LISTA');
    writeln('   1. crea la lista');
    writeln('   2. trova e visualizza');
    writeln('   3. esci');
    writeln(' COSA VUOI FARE? ');
    readln(scelta);
    case scelta of
    1: begin
         Svuota_Lista;
         Riempi_Lista;
       end;
    2: begin
         Trova_E_Visualizza;
       end;
    3: writeln;
    end;
  until scelta=3;
  Svuota_Lista;
end;

Ciao David,
grazie per il tuo aiuto... scusami per questa mia risposta un pň tardiva, ma
abbiamo avuto un gran da fare. Oggi sapremo i risultati dell'esame e vedremo
per la prossima volta... comqune grazie ancora, stamperň il tuo listato e
glielo porterň quanto prima.
Ciao e grazie,
Mkč