Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Salve a tutti. Ho il seguente semplice problema da sottoporre all'attenzione degli amici del forum. Il programma riportato di seguito, che dovrebbe stampare una lista memorizzata in ingresso in forma non ricorsiva, non mi accetta la formulazione in maniera dinamica, ovvero mi stampa solo la prima lista ma non le successive, se io rispondendo 'n' alla domanda 'Finito?' chiedo al programma medesimo di continuarea 'girare'. Vorrei sapere dov'è che sbaglio; forse nella formulazione della procedura di stampa? Riporto di seguito il codice, ove
Codice sorgente - presumibilmente Plain Text
p
costituisce il puntatore della lista e
Codice sorgente - presumibilmente Plain Text
piniz
il puntatore iniziale:
Codice sorgente - presumibilmente Delphi
program LeggiEStampaNonRicorsivamente(input,output);
type punt=^elem;
elem=record
val:integer;
next : punt;
end;
var p,piniz: punt;
k,n :integer;
risposta :char;
finito :boolean;
procedure LeggiEMemorizza(var p,piniz : punt );
begin
for k:=1 to n
dobegin
if piniz=nil
thenbegin
new(piniz);
p:=piniz;
end
elsebegin
new(p^.next);
p:=p^.next;
end;
read(p^.val);
p^.next:=nil;
end;
end;{fine procedura LeggiEMemorizza}
Procedure StampaLista(var p,piniz : punt);
begin
new(p);
p:=piniz;
repeatwrite(piniz^.val:2,' ');
piniz:=piniz^.next;
until piniz^.next=nil;
write(piniz^.val:2,' ');
readln;
end;{ fine procedura StampaLista }
{ corpo del programma }
begin
repeat
writeln('------------------------- Dati di ingresso -------------------------');
writeln;
writeln;
write('Fornire la lunghezza della lista: ');
readln(n);
writeln;
writeln('Fornire la lista in ingresso:');
writeln;
LeggiEMemorizza(p,piniz);
writeln;
writeln('La stampa della lista e'':');
writeln;
StampaLista(p,piniz);
writeln;
writeln;
writeln('Finito?');
writeln;
writeln('Scrivere ''s'' per finire ''n'' per continuare');
writeln;
readln(risposta);
finito:=(risposta='s');
readln;
until finito;
end.
Scusandomi in anticipo per la banalità della questione e per gli eventuali errori commessi, rimango in attesa di una risposta.Ciao!!!
innanzitutto dovresti inizializzare esplicitamente le variabili p e piniz al valore nil, onde evitare errori imprevedibili...
anche l'utilizzo di k e n come variabili globali per la procedura LeggiEMemorizza andrebbe evitato, sarebbe prferibile dargli n come parametro e dichiarare k all'interno.
Poi e' sempre preferibile non agire direttamente sui puntatori passati come parametri di i/op^.next e piniz;
la procedura LeggiEMemorizza andrebbe modificata cosi':