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.