Written by xinyiman Ottobre 18, 2011, 02:07:00 pm22532 ViewsRating: 0 (0 Rates)Print
A volte capita che si necessita di lavorare con liste, chi ha programmato in c o in c++ sa quanto queste liste possono tornare utili.
Bene in pascal è molto facile usare una lista e i puntatori.
Segue un listato di esempio, basta guardare i commenti per poter capire cosa succede.
unit ListaCaratteri; {nome della unit}
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
{ci salvo i caratteri}
Type Caratteri=^Cella; {Definisco un tipo di dato che si chiama caratteri ed è un puntatore ad un tipo cella}
Cella=Record {definisco un nuovo tipo di dati che si chiama cella ed è un record ed è così composta:}
Carattere:char; {contiene un carattere}
Next:Caratteri {contiene un puntatore ad un altra variabile di tipo Caratteri, questo permette di puntare al nodo dopo della lista}
End;
{ci salvo le liste di caratteri - è in tutto e per tutto uguale al tipo di dato Caratteri come logica}
Type ListeCar=^MiaCella;
MiaCella=Record
IdentificativoLista: string;
Lista:Caratteri; {notare che come tipo di dato ho anche una lista, una lista all'interno di una lista si può fare}
Next:ListeCar {puntatore al prossimo nodo}
End;
type
ListKeyPress = Object {creo un oggetto che contiene funzioni e procedure ma anche i miei dati di tipo lista}
private
MiaLista: ListeCar; {dati: contiene la mia lista}
procedure Cancella(NodoPartenza: ListeCar); {funzione che mi cancella un nodo della lista}
procedure CancellaCaratteri(NodoPartenza: Caratteri); {cancello la lista di tipo caratteri contenuta nella lista di tipo ListeCar}
public
constructor Create; {costruttore dell'oggetto}
destructor Destroy; {distruttore dell'oggetto}
procedure InsertChar(Car: char; Identificativo: string);
procedure Show();
procedure CancellaQuelloCheNonServe(LimiteMaxCar: integer);
procedure CancellaNodiNonInLista(LenVettore: integer; var ListaValidi: array of string);
function InVettore(LenVettore: integer; var ListaValidi: array of string; Identificativo: string): boolean;
end;
implementation
constructor ListKeyPress.Create();
begin
MiaLista:=nil; { inizializzo la mia lista padre con il nil=null del c, fondamentale per non far andare in errore il codice, perchè il null è sinonimo di fine lista }
end;
procedure ListKeyPress.InsertChar(Car: char; Identificativo: string);
var
app, ultimo: ListeCar;
ElencoCar: Caratteri;
Esci: boolean;
begin
app:=MiaLista;
Esci:=FALSE;
while ((app<>nil)and(Esci=FALSE)) do {finche'non finisce la lista}
begin
If (App^.IdentificativoLista = Identificativo) Then
begin
New(ElencoCar);
ElencoCar^.Carattere:=Car;
ElencoCar^.Next:=app^.Lista;
app^.Lista:=ElencoCar;
Esci:=TRUE;
end;
ultimo:=app;
app:=app^.next; {tramite questa instruzione si va avanti nella lista}
end;
If Esci=FALSE then { vuol dire che è il primo carattere per questo identificativo }
begin
app:=ultimo; //serve per gestire dal secondo nodo in poi altrimenti mi cera problemi
New(ultimo); //simile alla malloc del c
ultimo^.IdentificativoLista:=Identificativo; //valorizzo il campo del nodo della lista
ultimo^.Lista:=nil;
ultimo^.Next:=Nil; //valorizzo con nil perchè lo metto come ultimo carattere della lista
if MiaLista=nil then
begin
app:=ultimo; //gestisco il primo nodo della lista
end
else
begin
app^.Next:=ultimo;
end;
New(ElencoCar);
ElencoCar^.Carattere:=Car;
ElencoCar^.Next:=ultimo^.Lista;
ultimo^.Lista:=ElencoCar;
end;
if MiaLista=nil then
MiaLista:=app;
end;
procedure ListKeyPress.Show();
var
app: ListeCar;
ElencoCar: Caratteri;
begin
writeln('--- Inizio stampa ---');
app:=MiaLista;
while (app<>nil) do {finche'non finisce la lista}
begin
writeln('Identificativo della lista: ', app^.IdentificativoLista);
ElencoCar:=app^.Lista;
while (ElencoCar<>nil) do {finche'non finisce la lista}
begin
write(Elencocar^.Carattere);
ElencoCar:=ElencoCar^.Next;
end;
writeln;
app:=app^.next; {tramite questa instruzione si va avanti nella lista}
end;
writeln('--- Fine stampa ---');
end;
destructor ListKeyPress.Destroy();
begin
Cancella(MiaLista);
MiaLista:=nil;
end;
procedure ListKeyPress.Cancella(NodoPartenza: ListeCar);
var
app: ListeCar;
begin
app:=NodoPartenza;
if (app<>nil) then {finche'non finisce la lista}
begin
Cancella(app^.next); {tramite questa instruzione si va avanti nella lista}
CancellaCaratteri(app^.Lista); {cancello i caratteri del nodo della lista}
dispose(app); {cancello dalla memoria il nodo della lista, simile la free del c}
end;
end;
procedure ListKeyPress.CancellaCaratteri(NodoPartenza: Caratteri);
var
app: Caratteri;
begin
app:=NodoPartenza;
if (app<>nil) then {finche'non finisce la lista}
begin
CancellaCaratteri(app^.next); {tramite questa instruzione si va avanti nella lista}
dispose(app); {cancello dalla memoria il nodo della lista}
end;
end;
procedure ListKeyPress.CancellaQuelloCheNonServe(LimiteMaxCar: integer);
var
app: ListeCar;
ElencoCar: Caratteri;
Cont: integer;
Esci: boolean;
begin
app:=MiaLista;
while (app<>nil) do {finche'non finisce la lista}
begin
{devo scorrere tutte le variabili }
Cont:=1;
Esci:=FALSE;
ElencoCar:=app^.Lista;
while ((ElencoCar<>nil)and(Esci=FALSE)) do {finche'non finisce la lista}
begin
If (Cont >= LimiteMaxCar) Then
begin
CancellaCaratteri(ElencoCar^.Next);
ElencoCar^.Next:=nil;
Esci:=TRUE;
End
Else
begin
ElencoCar:=ElencoCar^.Next;
Inc(Cont);
end;
end;
app:=app^.next; {tramite questa instruzione si va avanti nella lista}
end;
end;
procedure ListKeyPress.CancellaNodiNonInLista(LenVettore: integer; var ListaValidi: array of string);
Var
app, app2, precedente: ListeCar;
Flag: boolean;
begin
app:=MiaLista;
app2:=MiaLista;
precedente:=nil;
while (app<>nil) do {finche'non finisce la lista}
begin
Flag:=FALSE;
{devo scorrere tutte le variabili }
If InVettore(LenVettore, ListaValidi, app^.IdentificativoLista) = False Then
begin
Flag:=TRUE;
app2:=app^.Next;
CancellaCaratteri(app^.Lista);
dispose(app);
app:=app2;
if precedente=nil then
MiaLista:=app
else
precedente^.Next:=app;
end;
if ((app<>nil)AND(Flag=FALSE)) then
begin
precedente:=app;
app:=app^.next; {tramite questa instruzione si va avanti nella lista}
end;
end;
end;
function ListKeyPress.InVettore(LenVettore: integer; var ListaValidi: array of string; Identificativo: string): boolean;
Var
ret: boolean;
i: integer;
begin
ret:=FALSE;
i:=0;
while ((i
begin
//writeln('Confronto:',ListaValidi[i],'-',Identificativo);
if (ListaValidi[i]=Identificativo) then
ret:=TRUE;
Inc(i);
end;
InVettore:=ret;
end;
end.
Potete trovare un esempio completo qui: www.lazaruspascal.it/esempi/Lista_Pascal.zip
About the author
xinyiman registered at Italian community of Lazarus and Free Pascal on Ottobre 14, 2011, 10:56:28 pm and has posted 3286 posts in the boards since then. Last visit was Oggi alle 09:13:59 am.
Questo blog non rappresenta una testata giornalistica poiché viene
aggiornato senza alcuna periodicità. Non può pertanto considerarsi un
prodotto editoriale ai sensi della legge n. 62/2001.
Questo sito utilizza cookie, anche di terze parti, per offriti servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina, cliccando su un link o proseguendo la navigazione in altra maniera, acconsenti all’uso dei cookie.