almacenar datos de una forma organizada, al igual que los vectores pero, a diferencia de estos, esta estructura es dinámica, por lo que no tenemos que saber "a priori" los elementos que puede contener. 🞇 En una lista enlazada, cada elemento apunta al siguiente excepto el último que no tiene sucesor y el valor del enlace es null. Por ello los elementos son registros que contienen el dato a almacenar y un enlace al siguiente elemento. Los elementos de una lista, suelen recibir también el nombre de nodos de la lista. Figura 1. Esquema de un nodo y una lista enlazada. Ejemplo
epresenta el dato a almacenar.
Puede ser de cualquier tipo; en este ejemplo se trata de una lista de enteros. Es un puntero al siguiente elemento de la lista; con este puntero enlazamos con el sucesor, de forma que podamos construir la lista. Los operadores básicos de una enlazada son: lista
Insertar: inserta un nodo con dato x en la lista,
pudiendo realizarse esta inserción al principio o final de la lista o bien en orden. Eliminar: elimina un nodo de la lista, puede ser según la posición o por el dato. Buscar: busca un elemento en la lista. Localizar: obtiene la posición del nodo en la lista. Vaciar: borra todos los elementos de la lista GSList
La definición de la estructura GSList o, lo
que es lo mismo, un nodo de la lista, está definido de la siguiente manera: struct GSList { gpointer data; GSList *next; }; Pila s Las pilas son estructuras de datos que tienes dos operaciones básicas: push (para insertar un elemento) y pop (para extraer un elemento). Su característica fundamental es que al extraer se obtiene siempre el último elemento que acaba de insertarse. Por esta razón también se conocen como estructuras de datos LIFO (del inglés Last In First Out. Por ejemplo: Una posible implementación mediante listas enlazadas sería insertando y extrayendo siempre por el principio de la lista. Gracias a las pilas es posible el uso de la recursividad. La variable que llama al mismo procedimiento en el que está, habrá que guardarla así como el resto de variables de la nueva llamada, para a la vuelta de la recursividad ir sacandolas, esto es posible a la implementación de pilas. Las pilas se utilizan en muchas aplicaciones que utilizamos con frecuencia. Por ejemplo, la gestión de ventanas en Windows (cuando cerramos una ventana siempre recuperamos la que teníamos detrás). Otro ejemplo es la evaluación general de cualquier expresión matemática para evitar tener que calcular el número de variables temporales que hacen falta. Colas Las colas también son llamadas FIFO (First In First Out), que quiere decir “el primero que entra es el primero que sale”. Colas simples:
Se inserta por un sitio y se saca por otro,
en el caso de la cola simple se inserta por el final y se saca por el principio. Para gestionar este tipo de cola hay que recordar siempre cual es el siguiente elemento que se va a leer y cual es el último elemento que se ha introducido. Ejemplo Colas circulares:
En las colas circulares se considera que
después del último elemento se accede de nuevo al primero. De esta forma se reutilizan las posiciones extraídas, el final de la cola es a su vez el principio, creándose un circuito cerrado. Ejemplo Colas con prioridad Las colas con prioridad se implementan mediante listas o arrays ordenados. No nos interesa en este caso que salgan en el orden de entrada sino con una prioridad que le asignemos. Puede darse el caso que existan varios elementos con la misma prioridad, en este caso saldrá primero aquel que primero llego (FIFO). Paquete Pila Finalmente implementamos el paquete pila tanto para un array como para listas. Esta implementación será realmente útil para el tema siguiente,recursividad. Array: ADS generic type TDato is private; package Pila_generica is
type TPila (Maximo : Positive)
is private;
Llena, Vacia, FueraDeRango : exception;
procedure Push ( Pila : in out TPila; Dato : in TDato
); procedure Pop ( Pila : in out TPila; Dato: out TDato ); function PilaVacia (Pila : in TPila) return Boolean; function PilaLlena (Pila : in TPila) return Boolean; function Valor ( Pila : in TPila; Index : Positive ) return TDato;
private
type TVector is array (Positive range <>) of
TDato; type TPila (Maximo : Positive) is record Contenido : TVector (1 .. Maximo); Cima : Natural := 0; end record; end;