Esempio lista in pascal

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


SMF 2.0.8 | SMF © 2011, Simple Machines
Privacy Policy
SMFAds for Free Forums
TinyPortal © 2005-2012

Go back to article