Ciao a tutti, mi hanno assegnato qualche esercizio sulle liste.
Il primo consite nel costruire una lista ed inserire vari valori.Poi l'utente inserisce un valore da ricercare nella lista ed eventualmente lo cancella.Ho qualche problema nella funzione eliminazione.Mi potreste aiutare
codice:
program lista2;
{$APPTYPE CONSOLE}
uses SysUtils;
type
puntatore= ^elemento;
//Struttura degli elementi della lista
elemento=record
inf:integer;
pun:puntatore;
end;
(*La funzione crea_lista2 restituisce al programma principale il riferimento
al primo elem. della lista, che è di tipo puntatore al record elemento*)
Function crea_lista2: puntatore;
var
p,paus: puntatore; (*p=punt. alla testa e paus=punt. ausiliario che*)
(*permette la creazione deglie elem. succ. della lista
senza perdere il punt. iniziale*)
x: integer; //Lo stesso tipo del campo inf (cioè integer)
begin
writeln;
write('Inserisci un''informazione(0 per finire): ');
readln(x);
if x=0 then p:=NIL //se x=0 la lista è vuota(si chiude)
else begin
//Creazione del primo elemento
new(p); //Allocazione di spazio necessario a contenere un record di
//tipo elemento
p^.inf:=x; (*Si copia il valore nella parte informazione di p*)
paus:=p; //Sia p che paus puntano al primo elem. della lista
{Ora che abbiamo creato il rpimo elemento, si va avanti così finchè non viene
inserito zero(questo è gestito dal ciclo while qui sotto}
while x<>0 do begin
writeln;
write('Inserisci un''informazione(0 per finire): ');
readln(x);
if x<>0 then begin
//Creazione dell'elemento successivo
new(paus^.pun); (*Viene creato un nuovo elemento della lista, collegato al
precedente.Il puntatore all'elem. creato da new viene
assegnato al campo pun del record puntato da paus*)
paus:=paus^.pun; //Viene aggiornato paus, in modo da puntare all'elem. succ.
paus^.inf:=x; //La nuova informazione viene inserita nel campo corrispond.
end
else
paus^.pun:=NIL; //Marca di fine lista
end;
end;
crea_lista2:=p; //Viene passato al chiamante il valore di p, punt.alla testa
end;
Function eliminazione(p:puntatore;var ele:integer):puntatore;
var
paus:puntatore; //puntatore ausiliario
begin
write('Inserisci l''elemento da eliminare: ');
readln(ele);
begin
paus:=p;
while paus<>NIL do begin
if paus^.inf<>ele then paus:=paus^.pun
else dispose(paus);
end;
end;
eliminazione:=p;
end;
(*Procedura ricorsiva per la visualizzazione della lista*)
Procedure vis2_lista(p:puntatore);
begin
if p<>NIL then begin
write(p^.inf);
write('---> ');
vis2_lista(p^.pun);
end
else write('NIL');
end;
(*MAIN*)
var punt_lista: puntatore; //puntatore alla testa della lista
valore:integer;
begin
punt_lista:=crea_lista2;
punt_lista:=eliminazione(punt_lista,valore);
vis2_lista(punt_lista);
readln;
end.