Strumenti Utente

Strumenti Sito


Barra laterale

programmazione:pascal:liste

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.

programmazione/pascal/liste.txt · Ultima modifica: 18/04/2018 - 15:48 (modifica esterna)