30/07/12 10:53
fabioser
Salve a tutti, utenti e moderatori del Forum. Chiedo aiuto nella soluzione di un semplice problema. Si tratta di stampare in uscita una lista di interi ordinata in senso crescente, a partire da una lista data in ingresso, costituita da numeri interi tutti diversi tra loro. La soluzione che ho elaborato, per quel che riguarda la procedura di calcolo della lista ordinata di cui sopra, fa uso di due cicli while, l'uno annidato nell'altro, con il più interno che confronta via, via, i singoli elementi della lista con gli n,n-1,...,1 elementi successivi, per determinare i massimi che verranno inseriti in testa alla lista ordinata dal più grande al più piccolo.Tuttavia tale soluzione, quando vado ad eseguire il programma risolutivo da me elaborato, mi dà errore 216. Credo che ciò sia dovuto al fatto che nel ciclo più interno di questa procedura il ciclo while tenta l'accesso a valori di p=nil. Qualcuno tra voi è in grado di indicarmi la soluzione esatta, e segnalarmi eventuali errori? Riporto di seguito il codice del programma che ho compilato:
Ringraziando da ora chiunque saprà fornirmi la soluzione corretta vi saluto tutti. Ciao!!!
program ListaOrdinataInSensoCrescente(input,output); const bell=07; type punt=^elem; elem= record val : integer; next : punt; end; var p,lista : punt; n,max,risposta : integer; procedure LeggiLista( var p : punt; k : integer); begin if k=0 then p:=nil else begin new(p); read(p^.val); LeggiLista(p^.next,k-1); end; end;{fine procedura LeggiLista} procedure OrdinamentoLista( var p,lista : punt); begin {creo la lista degli elementi ordinati} new(lista); {il primo elemento di tale lista lo pongo uguale al primo della lista p ed eventualmente se non è il più grande di p lo aggiornerò} lista^.val:=p^.val; while p<>nil do begin {inizializzazione del valore del massimo della lista in ingresso} p^.val:=max; p:=p^.next; {confronto via via degli elementi di p con tutti i loro successivi e aggiornamento della variabile max} while p<>nil do begin if p^.val>max then max:=p^.val; p:=p^.next; end; {inserimento dell'elemento max ( che è il più grande via via tra gli n,n-1,..,1 elementi di p ) in testa alla lista ordinata così in senso crescente} lista^.val:=max; {aggionamento dell'elemento lista} lista:=lista^.next; {aggiornamento di p} p:=p^.next; end; end;{fine procedura OrdinamentoLista} {corpo del programma} begin repeat writeln('--------------------------- Dati di ingresso --------------------------------'); writeln; writeln; write('Fornire la dimensione della lista: '); readln(n); if n>20 then begin writeln(chr(bell),'Errore nei dati di ingresso! - STOP -'); exit; end else begin writeln; writeln; writeln('Fornire la lista in ingresso:'); writeln; writeln; LeggiLista(p,n); writeln; writeln; OrdinamentoLista(p,lista); writeln; writeln; while(lista<>nil) do begin write(lista^.val:3,' '); lista:=lista^.next; end; end; writeln; writeln('Finito?'); writeln; writeln; writeln('Scrivere 1 per terminare 2 per continuare'); writeln; writeln; readln(risposta); until(risposta=1); readln; end.
Ringraziando da ora chiunque saprà fornirmi la soluzione corretta vi saluto tutti. Ciao!!!
aaa