TAD Lista Ordenada
Ejemplo de uso - Lista de enteros
El siguiente programa mantiene una lista ordenada de enteros y permite al usuario realizar operaciones de inserción, borrado, búsqueda, desplazamiento y reordenación. Se definen dos funciones de comparación, una representa una ordenación ascendente y la otra una ordenación descendente.
Es importante tener en cuenta lo siguiente:
Puede descargar una copia del programa pulsando aquí.
{$F+}
program ejemplo1(input,output);
{ Se puede elegir entre cualquiera de las dos implementaciones,
lista1 o lista2, el resultado debería ser el mismo. }
uses lista1;
type
PEntero = ^integer;
{ Funciones de comparación }
function OrdenAscendente(Elem1,Elem2: pointer) : boolean;
begin
OrdenAscendente := PEntero(Elem1)^ <= PEntero(Elem2)^
end;
function OrdenDescendente(Elem1,Elem2: pointer) : boolean;
begin
OrdenDescendente := PEntero(Elem1)^ >= PEntero(Elem2)^
end;
procedure EscribeLista(L: TListaOrd);
{ Escribe los enteros almacenados en la lista, resaltando el elemento actual }
var
Elem,ElemAct : pointer;
begin
ElemAct := ElemActual(L);
{ Recorre los elementos, escribiendo cada uno de ellos }
write(output,'Lista: ');
IrAInicio(L);
Elem := ElemActual(L);
while Elem <> nil do
begin
if Elem = ElemAct then
{ El que era el elemento actual se escribe entre corchetes. }
write(output,' [',PEntero(Elem)^,']')
else
write(output,' ',PEntero(Elem)^);
IrASiguiente(L);
Elem := ElemActual(L)
end;
writeln(output);
{ Al recorrer la lista, el elemento actual ha cambiado. Con este bucle,
se restaura el elemento actual }
IrAInicio(L);
while ElemActual(L) <> ElemAct do IrASiguiente(L)
end;
var
Elem : PEntero;
Lista : TListaOrd;
Opcion : char;
OrdenActual : (oAscendente,oDescendente);
begin
OrdenActual := oAscendente;
Inicializar(Lista,OrdenAscendente);
repeat
EscribeLista(Lista);
writeln(output,'[Q]:Salir [+]:Ins. [-]:Borrar [B]:Buscar [I]:Inicio [S]:Sig. [R]: Reordenar');
write(output,'Elija opcion: ');
readln(input,Opcion);
case Opcion of
'+': if ListaLlena(Lista) then
writeln(output,'Error al insertar: Lista llena!')
else
begin
write(output,'Valor a insertar: ');
{ Se crea la variable dinámica que almacenará el valor }
new(Elem);
{ Se lee el valor directamente en la variable dinámica }
readln(input,Elem^);
Insertar(Lista,Elem)
end;
'-': if ElemActual(Lista) = nil then
writeln(output,'Error al borrar: No existe elemento actual!')
else
begin
Elem := ElemActual(Lista);
Borrar(Lista);
{ Atencion: Borrar un elemento de la lista NO destruye la variable dinámica en que
se almacena el elemento. Esa operación es responsabilidad del programa. }
dispose(Elem)
end;
'B': begin
write(output,'Valor a buscar: ');
{ Es necesario crear una variable dinámica almacenar el valor que se va a
buscar en la lista. Tras la búsqueda se destruye la variable. }
new(Elem);
readln(input,Elem^);
Buscar(Lista,Elem);
dispose(Elem)
end;
'I': IrAInicio(Lista);
'S': IrASiguiente(Lista);
'R': if OrdenActual = oAscendente then
begin
OrdenActual := oDescendente;
Reordenar(Lista,OrdenDescendente)
end else begin
OrdenActual := oAscendente;
Reordenar(Lista,OrdenAscendente)
end;
end; { case }
until Opcion = 'Q';
{ Se destruyen los elementos de la lista. No se debe olvidar que estos
elementos son variables dinámicas. }
IrAInicio(Lista);
Elem := ElemActual(Lista);
while Elem <> nil do
begin
dispose(Elem);
IrASiguiente(Lista);
Elem := ElemActual(Lista)
end;
{ Se libera la memoria interna ocupada por la lista }
Destruir(Lista)
end.