fabioser (Normal User)
Rookie
Messaggi: 59
Iscritto: 12/05/2012
|
Salve a tutti, utenti e moderatori del forum. Ho il seguente problema da sottoporre alla vostra attenzione. Si tratta di ordinare e stampare una lista nell'ordine inverso rispetto a quello fornito in ingresso. Ho elaborato il seguente programma come soluzione, che fa uso, per la rappresentazione della lista di due campi puntatore back e next, e di due funzioni una per acquisire la lista, l'altra per invertirla. Il codice è il seguente ( e fa uso di suggerimenti precedenti dei membri del forum):
Codice sorgente - presumibilmente Delphi |
program InvertiLista(input,output); type verso=(vNext,vBack); punt=^elem; elem=record val : real; back : punt; next : punt; end; var p,lista: punt; n,risposta : integer; Function LeggiLista( p,q: punt; k : integer): punt; begin if k=0 then p:=nil else begin new(p); read(p^.val); new(q); read(q^.val); p^.next:=q; p^.back:=LeggiLista(p,q,k-1) end; end;{ fine function LeggiLista } Function GiraLista( setverso : verso; r : punt ): punt; begin p:=r; case setverso of vBack : begin while p^.back<>nil do p:=p^.back; end; vNext : begin while p^.next<>nil do p:=p^.next; end; end; end;{ fine function GiraLista } { corpo del programma } begin repeat writeln('--------------------- Dati di ingresso ------------------------'); writeln; writeln; write('Fornire la lunghezza della lista: '); readln(n); writeln; writeln('Fornire le lista in ingresso:'); writeln; p:=LeggiLista(p,nil,n); writeln; writeln; writeln('La lista risultante e'':'); writeln; p:=GiraLista(vNext,p); writeln; lista:=p; repeat write(lista^.val:2:2,' '); lista:=lista^.back; until lista=nil; write(lista^.val:2:2,' '); writeln; writeln; writeln('Finito?'); writeln; write('Scrivere ''1'' per finire ''2'' per continuare'); readln(risposta); until(risposta=1); readln; end.
|
Tuttavia il programma non mi fornisce il risultato finale alla pressione del tasto <INVIO>. Qualcuno tra voi è in grado di spiegarmi perchè? Certo dell'attenzione che vorrete porre al mio problema vi saluto e vi ringrazio in anticipo per la disponibilità. Ciao!!!
|
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
Quale dovrebbe essere il risultato finale
If ok Then GOTO Avanza else GOTO Inizia
|
|
fabioser (Normal User)
Rookie
Messaggi: 59
Iscritto: 12/05/2012
|
La lista di partenza con gli elementi disposti in senso inverso, ossia dall'ultimo al primo.
|
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
Dopo che hai immesso il numero di elementi (n), non hai modo di sapere
passo passo il punto della lista che stai inserendo, se per esempio inserisci
n = 100, ti voglio vedere a tenere a mente 100 inserimenti
If ok Then GOTO Avanza else GOTO Inizia
|
|
fabioser (Normal User)
Rookie
Messaggi: 59
Iscritto: 12/05/2012
|
Non capisco...si può inserire un'istruzione di controllo che imponga che n non superi un dato valore, ma questo è sufficiente per far funzionare il programma?
|
|
fabioser (Normal User)
Rookie
Messaggi: 59
Iscritto: 12/05/2012
|
...se per cortesia puoi postare un esempio con del codice forse riuscirei meglio a capire l'errore e l'eventuale correzione da applicare...
|
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
Codice sorgente - presumibilmente Delphi |
Function LeggiLista( p,q: punt; k : integer): punt; begin writeln('Elementi da inserire nella Lista = ',K); if k=0 then p:=nil else begin writeln('Inserisci elemento nella Lista:'); new(p); read(p^.val); new(q); read(q^.val); p^.next:=q; p^.back:=LeggiLista(p,q,k-1) end; end;{ fine function LeggiLista } In questo modo dovresti avere un controllo migliore
|
If ok Then GOTO Avanza else GOTO Inizia
|
|
Goblin (Member)
Expert
Messaggi: 375
Iscritto: 02/02/2011
|
Secondo me non puoi prendere pezzi di codice, incollarli e sperare che tutto funzioni.
la funzione di lettura vediamo di metterla dritta una volta x tutte:
Codice sorgente - presumibilmente Delphi |
Function LeggiLista(pNext: punt; k: integer): Punt; begin if k=0 then Result := nil else begin new(Result); read(Result.val); Result.back:=pNext; Result.next := LeggiLista(Result, k-1); end; end;
|
In next ci va il prossimo numero in back quello vecchio e la chiamata è:
Codice sorgente - presumibilmente Plain Text |
Poi la funzione giraliste vediamo di farla un po' più furba in modo che capisca "da sola" il verso da cambiare e per far questo c'e' bisogno di un ulteriore funzione che ricava il verso
Codice sorgente - presumibilmente Delphi |
Function GetVerso(oLista: Punt):Verso; begin if oLista.next = Nil then Result := vNext else Result := vBack; end; Function GiraListe(oPunt: Punt): punt; var oVerso: verso; begin Result := oPunt; oVerso := GetVerso(Result); case oVerso of vBack: begin while Result.next<>nil do Result := Result.next; end; vNext: begin while Result.back<>nil do Result := Result.back; end; end; end;
|
Ok adesso abbiamo tutto e per non farci mancare niente facciamo anche una funzioncina di stampa, ovviamente anche questa sfrutta il verso di stampa
Codice sorgente - presumibilmente Delphi |
Procedure StampaLista(oLista: punt); Var oVerso: verso; begin oVerso := GetVerso(oLista); while not(oLista = nil) do begin write(oLista^.val:2:2,' '); case oVerso of vNext : oLista := oLista^.Back; vBack : oLista := oLista^.next; end; end; end;
|
bene adesso che abbiamo tutto facciamo mente locale, uso delphi per compilare, ma il succo è lo stesso, l'ho provata solo qualche min non sono stato tanto a fargli le pulci,
Codice sorgente - presumibilmente Delphi |
program Project24; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type verso=(vNext,vBack); punt=^elem; elem=record val : real; back : punt; next : punt; end; var p,lista, lista1: punt; n,risposta : integer; Function LeggiLista(pNext: punt; k: integer): Punt; begin if k=0 then Result := nil else begin new(Result); read(Result.val); Result.back:=pNext; Result.next := LeggiLista(Result, k-1); end; end;{ Fine procedura LeggiEScriviLista } Function GetVerso(oLista: Punt):Verso; begin if oLista.next = Nil then Result := vNext else Result := vBack; end; Function GiraListe(oPunt: Punt): punt; var oVerso: verso; begin Result := oPunt; oVerso := GetVerso(Result); case oVerso of vBack: begin while Result.next<>nil do Result := Result.next; end; vNext: begin while Result.back<>nil do Result := Result.back; end; end; end; Procedure StampaLista(oLista: punt); Var oVerso: verso; begin oVerso := GetVerso(oLista); while not(oLista = nil) do begin write(oLista^.val:2:2,' '); case oVerso of vNext : oLista := oLista^.Back; vBack : oLista := oLista^.next; end; end; end; begin try { corpo del programma } repeat writeln('--------------------- Dati di ingresso ------------------------'); writeln; writeln; write('Fornire la lunghezza della lista: '); readln(n); writeln; writeln('Fornire le lista in ingresso:'); writeln; p:=LeggiLista(Nil, n); writeln; writeln; writeln('La lista risultante e'':'); writeln; lista := GiraListe(p); lista1 := GiraListe(lista); writeln; writeln; writeln('Lista originale'); StampaLista(p); writeln; writeln; writeln('Lista Girata'); StampaLista(lista); writeln; writeln; writeln('Lista RI-Girata'); StampaLista(lista1); writeln; writeln; writeln('Finito?'); writeln; write('Scrivere ''1'' per finire ''2'' per continuare'); readln(risposta); until(risposta=1); readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
|
Ibis redibis non morieris in bello |
|
fabioser (Normal User)
Rookie
Messaggi: 59
Iscritto: 12/05/2012
|
Grazie Goblin!!!
|
|