La Página de DriverOp

Implementación de lista dinámica doblemente enlazada.

En esta ocación voy a implementar una lista dinámica doblemente enlazada. Para ello crearé una biblioteca (unit) con las funciones básicas necesarias para administrar la lista.

La información almacenada por la lista puede ser modificada apropiadamente para cada caso simplemente reformando la declaración TDato según se necesite. No está implementada la inserción de nodos al medio de la lista pero confio en que el lector sabrá escribir ese procedimiento:

El código es:

unit Lista;

interface
type

 TDato=Integer;

 TPuntero=^TNodo;

 TNodo=record
   Dato:TDato;
   Sig:TPuntero;
   Ant:TPuntero;
 end;


var
primero,ultimo:tpuntero; { Punteros al primer y último nodo de la lista }

procedure Crear_Lista(var p,u:tpuntero);
function Poner_en_lista(var p,u:tpuntero; d:tdato):tpuntero;
function Buscar_en_Lista(p:tpuntero;d:tdato):tpuntero;
function Siguiente(p:tpuntero):tpuntero;
function Anterior(p:tpuntero):tpuntero;
procedure Destruir_Lista(var p,u:tpuntero);

implementation

{ Crea la lista vacia }
procedure crear_lista(var p,u:tpuntero);
begin
p:=nil;
u:=nil;
end;

{Pone un nuevo nodo al final de la lista
Parámetros:
  p=Apunta al Primero de la Lista
  u=Apunta al último de la Lista
  d=Dato a almacenar en el nuevo nodo de la lista
  devuelve un puntero al nodo creado}
function poner_en_lista(var p,u:tpuntero; d:tdato):tpuntero;
var
 aux:tpuntero;
begin
new(aux);       { Se crea el nuevo nodo }
aux^.dato:=d;
aux^.sig:=nil;  { El enlace al siguente nodo debe apuntar a nada }
aux^.ant:=nil;
if p = nil then    { Si la Lista está Vacía... }
   begin
      p:=aux;      { El puntero al primer nodo y al último nodo... }
      u:=aux;      { ...apuntan al único nodo en la lista }
   end
   else
   begin
      u^.sig:=aux; { el último nodo debe apuntar al nuevo nodo y... }
      aux^.ant:=u;
      u:=aux;      { ...el puntero al último nodo debe
                    apuntar al nuevo último }
   end;
poner_en_lista:=aux; { Devuelvo el nuevo nodo }
end;

{ Devuelve un puntero al siguiente nodo apuntado por p }
function siguiente(p:tpuntero):tpuntero;
begin
siguiente:=p^.sig;
end;

{ Devuelve un puntero al nodo anterior apuntado por p }
function anterior(p:tpuntero):tpuntero;
begin
anterior:=p^.ant;
end;

{Busca un elemento que contenga el dato buscado
Parametros:
     p=puntero al primero de la lista.
     d=dato buscado.
Nota: devuelve un puntero al nodo que contiene el mismo dato que
      se busca o nil si no lo encuentra.
      No usado, puesto a modo de ejemplo. }
function Buscar_en_Lista(p:tpuntero;d:TDato):tpuntero;
begin
while (p<> nil) and (p^.dato <> d) do {Mientras haya mas nodos y
                                       no se encuentra el dato buscado...}
     begin
        p:=p^.sig; {...sigo buscando}
     end;
Buscar_en_Lista:=p; {Devuelvo el nodo encontrado (o nil)}
end;

procedure Destruir_Lista(var p,u:tpuntero);
var
  Aux: tpuntero;
begin
  u:=nil;
  while p <> nil do
    begin
      Aux:=P^.Sig;
      Dispose(P);
      P:=Aux;
    end;
end;

end.

Enjoy :)

Ir a lista simplemente enlazada.

Por Diego Romero,