Listas Circulares Definición. Una lista circular es una lista lineal en la que el último nodo a punta al primero. Las listas circulares evitan excepciones en la operaciones que se realicen sobre ellas.Cada nodo siempre tiene uno anterior y uno siguiente. ¿Por qué utilizar una estructura Circular? En una lista simplemente enlazada, el movimiento siempre fluirá desde la cabeza en dirección hacia el final de la lista, pero ¿qué ocurre cuando desde el último nodo se necesita operar con el primero?, este es el punto diferencial de una estructura abierta y una cerrada. En una lista circular: - No existe algún elemento que apunte a NULL Se integra una estructura tipo anillo Solo hay una cabeza La cabeza siempre será el siguiente enlace para algún nodo Se pueden llegar a crear recorridos en bucles infinitos Declaraciones de tipos para manejar listas circulares Los tipos que definiremos normalmente para manejar listas cerradas son los mismos que para para manejar listas abiertas: typedef struct _nodo \{ int dato; struct _nodo *siguiente; } tipoNodo; typedef tipoNodo *pNodo; typedef tipoNodo *Lista; tipoNodo es el tipo para declarar nodos, evidentemente. pNodo es el tipo para declarar punteros a un nodo. Lista es el tipo para declarar listas, tanto abiertas como circulares. En el caso de las circulares, apuntará a un nodo cualquiera de la lista. Pueden existir Listas Circulares Simplemente Enlazadas y Doblemente Enlazadas. Gráficamente se tendría: Simplemente Enlazadas Doblemente enlazadas - Nótese que con simple o doble referencia, siempre se tendrá solo una cabeza Operaciones básicas con listas circulares A todos los efectos, las listas circulares son como las listas abiertas en cuanto a las operaciones que se pueden realizar sobre ellas: Añadir o insertar elementos. Borrar elementos. Moverse a través de la lista, siguiente. Añadir elemento en una lista circular. Partiremos de un nodo a insertar. El proceso es muy sencillo: 1. Hacemos que nodo->siguiente apunte a lista->siguiente. 2. Después que lista->siguiente apunte a nodo. Eliminar un nodo en una lista circular con más de un elemento Lista con más de un elemento 1. El primer paso es conseguir que lista apunte al nodo anterior al que queremos eliminar. Esto se consigue haciendo que lista valga lista->siguiente mientras lista>siguiente sea distinto de nodo. 2. Hacemos que lista->siguiente apunte a nodo->siguiente. 3. Eliminamos el nodo. Lista enlazadas doble circulares ¿Qué son listas enlazadas doble circulares? En una lista enlazada doblemente circular, cada nodo tiene dos enlaces, similares a los de la lista doblemente enlazada, excepto que el enlace anterior del primer nodo apunta al último y el enlace siguiente del último nodo, apunta al primero. Como en una lista doblemente enlazada, las inserciones y eliminaciones pueden ser hechas desde cualquier punto con acceso a algún nodo cercano. Aunque estructuralmente una lista circular doblemente enlazada no tiene ni principio ni fin, un puntero de acceso externo puede establecer el nodo apuntado que está en la cabeza o al nodo cola, y así mantener el orden tan bien como en una lista doblemente enlazada. Una lista doble circular es una estructura donde el último elemento tiene como referencia siguiente al primer elemento y la referencia al anterior del primer elemento de la lista también es el último. Cada elemento esta doblemente enlazado. A través del uso de listas dobles podemos acceder a los datos recorriendo los hacia delante hasta el final o hacia atrás hasta el inicio. Operaciones básicas Las operaciones básicas de una lista circular doble son: Insertar un nodo con dato X en la lista realizando una inserción al principio o al final de la lista. Eliminar un nodo de la lista, puede ser según la posición o por el dato Buscar un elemento en la lista Obtener la posición del nodo en la lista Imprimir los elementos de la lista Ejemplo de lista enlazada doble circular Un ejemplo donde se almacenan números y vemos como la estructura donde el último elemento tiene referencia siguiente al primer elemento y la referencia al anterior al primer elemento de la lista también es el último. Y con esto podemos ver que podemos acceder a los dato recorriendo los hacia delante hasta el final o hacia atrás hasta el inicio. Ejemplo Real Un formulario electrónico al finalizar cada pagina te da la opción , atrás y siguiente que te permite rectificar cualquier error regresando atrás y adelante y al finalizar comienza nuevamente el formulario para el siguiente usuario Algoritmo para inserción de una lista circular doble enlazada (Lenguaje de programación C) Pasos para la inserción de una lista circular doble enlazada vacía: 1. El primer paso es crear un nodo para el dato que vamos a insertar. 2. Si Lista está vacía, o el valor del primer elemento de la lista es mayor que el del nuevo, insertaremos el nuevo nodo en la primera posición de la lista. 3. En caso contrario, buscaremos el lugar adecuado para la inserción, tenemos un puntero "anterior". Lo iniciamos con el valor de Lista, y avanzaremos mientras anterior->siguiente no sea NULL y el dato que contiene anterior->siguiente sea menor o igual que el dato que queremos insertar. 4. Ahora ya tenemos anterior señalando al nodo adecuado, así que insertamos el nuevo nodo a continuación de él. Lista enlazada circular