====== Liste in pascal ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//06/05/2007//** Di seguito un esercizio che dimostra come utilizzare le liste in pascal. Un programma per la gestione degli interi,in cui,utilizzando la procedura di inserimento ad inizio lista si introducono da tastiera gli elementi della lista(dare 0 per fine lista) All'interno di questo programma ci sono funzioni che servono per: 1) Scrivere una funzione che ne conti gli elementi; 2) Scrivere una procedura che presa in input una lista,un indice i ed un intero x inserisca una nuova cella contenente x all'iesima posizione 3) Scrivere una procedura che presa in input una lista concatenata di interi e un indice i ,elimini l'i-esima cella. 4) Scrivere una funzione booleana che, data una lista concat. e un intero x ritorni il valore TRUE se x e'contenuto nella lista FALSE altrimenti 5) Scrivere una procedura che presa in input una lista di interi e un intero x elimini dalla lista ogni cella contenente x se x e' presente almeno una volta nella lista,e lasci la lista invariata in caso contrario. ===== Codice ===== program Liste1; Type Puntatore=^Cella; Cella=Record Info:integer; Next:Puntatore End; Var P:Puntatore; Cont,indice,elemento:integer; scelta :char; Procedure Visualizza(Head:Puntatore;Var Cont:Integer); Begin If Head=Nil Then Begin Write('Nil'); Write('-->'); End Else Begin Write(Head^.Info); Write('-->'); Cont:=Cont+1; Visualizza(Head^.Next ,Cont); End; End; procedure Crealista(Var Head:Puntatore); Var N:Integer; Begin Readln(N); If N=0 Then begin Head:=Nil; end Else Begin New(Head); Head^.Info:=N; Head^.Next:=Nil; Crealista(Head^.Next); End; End; procedure Inserisci(index:integer;a:integer;head:Puntatore;cont:integer); {il puntatore head NON si passa per valore} begin while head<>nil do {finche'non finisce la lista} begin if cont=index-1 then {index-1 perche' il primo elemento della lista e'nil (cioe'non esiste)} begin head^.info:=a; end; cont:=cont+1; head:=head^.next; {tramite questa instruzione si va avanti nella lista} end; end; procedure Elimina(index:integer;var head:puntatore;var k:integer); var t :puntatore; begin if head<>nil then begin if k=index then begin new(t); t:=head; head:=head^.next; k:=k+1; dispose(t); if head<>nil then Elimina(index, head^.next,k); {continua il controllo solo se NON e'finita la lista} end else begin k:=k+1; Elimina(index, head^.next,k); end; end; end; function Esiste(head:puntatore; a:integer):boolean; var si :boolean; begin si:=false; esiste:=si; while head<>nil do begin if head^.info=a then begin si:=true; esiste:=si; end; head:=head^.next; end; end; procedure CercaElimina(var head:puntatore; a:integer); {N.B. head per riferimento} var t:puntatore; begin if head<>nil then begin if head^.info=a then begin new(t); t:=head; head:=head^.next; dispose(t); CercaElimina(head^.next,a); end else CercaElimina(head^.next,a); end; end; Begin {principale} scelta:='0'; Cont:=0; New(P); P:=Nil; while scelta <> 'q' do begin writeln(''); writeln(' ---- Menu del programma ----'); writeln(''); writeln(' ---- 1 per creare la lista ----'); writeln(' ---- 2 per visualizzare la lista ----'); writeln(' ---- 3 inserisce elemento nella i-esima posizione ----'); writeln(' ---- 4 elimina i-esimo elemento ----'); writeln(' ---- 5 esistenza di un elemento ----'); writeln(' ---- 6 elimina elemento ----'); writeln(''); writeln(' ---- q per uscire ----'); readln(scelta); if scelta='1' then begin Writeln ('**** Inserisci gli elementi e invia zero per uscire *****'); Crealista(P); end; if scelta='2' then begin cont:=0; Visualizza(P,Cont); end; if scelta='3' then begin cont:=0; write('Inserisci indice (i) --> '); readln(indice); write('Inserisci elemento da inserire --> '); readln(elemento); Inserisci(indice,elemento,P,cont); end; if scelta='4' then begin cont:=1; write('Inserisci l''indice della cella da eliminare --> '); readln(indice); elimina(indice,P,cont); end; if scelta='5' then begin write('Inserire elemento per il quale bisogna controllare l''esistenza --> '); readln(elemento); if esiste(P,elemento)=true then begin writeln('L''elemento e'' contenuto nella lista'); end else begin writeln('L''elemento NON e'' contenuto nella lista'); end; end; if scelta = '6' then begin write('inserisci l''elemento da eliminare --> '); readln(elemento); cercaElimina(p,elemento); end; end; writeln('Programma terminato. '); End.