Subido por ??????????

Listas Circulares

Anuncio
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
Descargar