listas circulares
concepto: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. No existen casos especiales, cada nodo siempre tiene uno anterior y uno siguiente.
En algunas listas circulares se añade un nodo especial de cabecera, de ese modo se evita la única excepción posible, la de que la lista esté vacía.
concepto:
En una lista enlazada circular, el primer y el último nodo estánunidos juntos. Esto se puede hacer tanto para listas enlazadas simplescomo para las doblemente enlazadas. Para recorrer un lista enlazadacircular podemos empezar por cualquier nodo y seguir la lista encualquier dirección hasta que se regrese hasta el nodo original. Desdeotro punto de vista, las listas enlazadas circulares pueden ser vistascomo listas sin comienzo ni fin. Este tipo de listas es el más usadopara dirigir buffers para “ingerir” datos, y para visitar todos losnodos de una lista a partir de uno dado.
TIPOS DE LISTAS CIRCULARES:
Listas enlazadas circulares simples
Cada nodo tiene un enlace, similar al de las listas enlazadas simples,excepto que el siguiente nodo del último apunta al primero. Como en unalista enlazada simple, los nuevos nodos pueden ser solo eficientementeinsertados después de uno que ya tengamos referenciado. Por esta razón,es usual quedarse con una referencia solamente al último elemento enuna lista enlazada circular simple, esto nos permite rápidasinserciones al principio, y también permite accesos al primer nododesde el puntero del último nodo.Lista Enlazada Doblemente Circular
En una lista enlazada doblemente circular, cada nodo tienedos enlaces, similares a los de la lista doblemente enlazada, exceptoque el enlace anterior del primer nodo apunta al último y el enlacesiguiente del último nodo, apunta al primero. Como en una listadoblemente enlazada, las inserciones y eliminaciones pueden ser hechasdesde cualquier punto con acceso a algún nodo cercano. Aunqueestructuralmente una lista circular doblemente enlazada no tiene niprincipio ni fin, un puntero de acceso externo puede establecer el nodoapuntado que está en la cabeza o al nodo cola, y así mantener el ordentan bien como en una lista doblemente enlazada.BUSCAR O LOCALIZAR UN ELEMENTO DE UNA LISTA CIRCULAR: A la hora de buscar elementos en una lista circularsólo hay que tener una precaución, es necesario almacenar el puntero del nodoen que se empezó la búsqueda, para poder detectar el caso en que no exista elvalor que se busca. Por lo demás, la búsqueda es igual que en el caso de laslistas abiertas, salvo que podemos empezar en cualquier punto de la lista.
ELIMINAR UN NODO EN UNA LISTA CIRCULAR CON MÁS DE UN ELEMENTO:
Es el caso más simple. Partiremos de una lista con uno o más nodos, y usaremos un puntero auxiliar, nodo:
- Hacemos que nodo apunte al primer elemento de la lista, es decir a Lista.
- Asignamos a Lista la dirección del segundo nodo de la lista: Lista->siguiente.
- Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
Si la lista sólo tiene un nodo, el proceso es también válido, ya que el valor de Lista->siguiente es NULL, y después de eliminar el primer nodo la lista quedará vacía, y el valor de Lista será NULL.
De hecho, el proceso que se suele usar para borrar listas completas es eliminar el primer nodo hasta que la lista esté vacía.
Eliminar un nodo cualquiera de una lista abierta:
En todos los demás casos, eliminar un nodo se puede hacer siempre del mismo modo. Supongamos que tenemos una lista con al menos dos elementos, y un puntero al nodo anterior al que queremos eliminar. Y un puntero auxiliar nodo.El proceso es parecido al del caso anterior:
- Hacemos que nodo apunte al nodo que queremos borrar.
- Ahora, asignamos como nodo siguiente del nodo anterior, el siguiente al que queremos eliminar: anterior->siguiente = nodo->siguiente.
- Eliminamos la memoria asociada al nodo que queremos eli minar.
Aplicacion
La lista circular, así como en el ejemplo donde guardamos nombre, DNI, edad y sueldo, podemos guardar mas datos y generar una lista que se valla expandiendo, lo podemos usar en un programa de Matriculas de una Institucion Educativa, Control de personal de una Empresa, y asi como muchas otras aplicaciones.
una parte del codigo del programa descrito arriba
package clistacircularse;
import javax.swing.*;
public class Formulario {
public static void main (String[] args)
{
Lista lcse = new Lista();
String nombre,lmenu,ldni,lnom,led,lsue;
double suel;
int vmenu,vdni,vedad;
vmenu=0;
while (vmenu!=8){
if (vmenu == 0){
/////////////
lmenu = JOptionPane.showInputDialog("Menu:\n"+"1: Añadir final\n"+"2: Añadir Principio\n"+"3: Mostrar lista\n"+"4: Borrar elemento primero\n"+"5: Borrar Todo\n"+"6: Mostrar uno\n"+"7: modificar\n"+"8: salir\n");
vmenu=Integer.parseInt(lmenu);
//////////////
}
if (vmenu == 1){
//ingresar los datos del trabajador
JOptionPane.showMessageDialog(null,"INGRESAR DATOS DEL trabajador");
vdni=1;
while (vdni!= 0){
lnom = JOptionPane.showInputDialog("nombre");
while ((nombre = lnom)!= null){
ldni=JOptionPane.showInputDialog("DNI");
vdni = Integer.parseInt(ldni);
led = JOptionPane.showInputDialog("edad");
vedad = Integer.parseInt(led);
lsue = JOptionPane.showInputDialog("sueldo");
suel = Double.parseDouble(lsue);
if (vdni != 0)
{
lcse.añadirfinal(vdni,lnom,vedad,suel);
lnom=JOptionPane.showInputDialog("nombre");
}
else
{
lnom = null;
}
}
}
/////////////
lmenu = JOptionPane.showInputDialog("Menu:\n"+"1: Añadir final\n"+"2: Añadir Principio\n"+"3: Mostrar lista\n"+"4: Borrar elemento primero\n"+"5: Borrar Todo\n"+"6: Mostrar uno\n"+"7: modificar\n"+"8: salir\n");
vmenu=Integer.parseInt(lmenu);
//////////////
}
if (vmenu == 2){
//ingresar los datos de un trabajador al principio
JOptionPane.showMessageDialog(null,"INGRESAR DATOS DEL trabajador al principio");
lnom = JOptionPane.showInputDialog("nombre");
ldni=JOptionPane.showInputDialog("DNI");
vdni = Integer.parseInt(ldni);
led = JOptionPane.showInputDialog("edad");
vedad = Integer.parseInt(led);
lsue = JOptionPane.showInputDialog("sueldo");
suel = Double.parseDouble(lsue);
lcse.añadirprincipio(vdni,lnom,vedad,suel);
/////////////
lmenu = JOptionPane.showInputDialog("Menu:\n"+"1: Añadir final\n"+"2: Añadir Principio\n"+"3: Mostrar lista\n"+"4: Borrar elemento primero\n"+"5: Borrar Todo\n"+"6: Mostrar uno\n"+"7: modificar\n"+"8: salir\n");
vmenu=Integer.parseInt(lmenu);
//////////////
}
if (vmenu == 3){
//muestra los datos del trabajador
JOptionPane.showMessageDialog(null,"lista");
lcse.mostrar(lcse);
/////////////
lmenu = JOptionPane.showInputDialog("Menu:\n"+"1: Añadir final\n"+"2: Añadir Principio\n"+"3: Mostrar lista\n"+"4: Borrar elemento primero\n"+"5: Borrar Todo\n"+"6: Mostrar uno\n"+"7: modificar\n"+"8: salir\n");
vmenu=Integer.parseInt(lmenu);
//////////////
}
if (vmenu == 4){
//borra el trabajador del principo
lcse.borrar();
/////////////
lmenu = JOptionPane.showInputDialog("Menu:\n"+"1: Añadir final\n"+"2: Añadir Principio\n"+"3: Mostrar lista\n"+"4: Borrar elemento primero\n"+"5: Borrar Todo\n"+"6: Mostrar uno\n"+"7: modificar\n"+"8: salir\n");
vmenu=Integer.parseInt(lmenu);
//////////////
}
if (vmenu == 5){
//borra todo
lcse.borrartodo(lcse);
/////////////
lmenu = JOptionPane.showInputDialog("Menu:\n"+"1: Añadir final\n"+"2: Añadir Principio\n"+"3: Mostrar lista\n"+"4: Borrar elemento primero\n"+"5: Borrar Todo\n"+"6: Mostrar uno\n"+"7: modificar\n"+"8: salir\n");
vmenu=Integer.parseInt(lmenu);
//////////////
}
if (vmenu == 6){
//busca un trabajador buscado por su dni
String ldn;
int vdn;
ldn = JOptionPane.showInputDialog("Ingresar DNI:");
vdn=Integer.parseInt(ldn);
lcse.mostraruno(lcse,vdn);
/////////////
lmenu = JOptionPane.showInputDialog("Menu:\n"+"1: Añadir final\n"+"2: Añadir Principio\n"+"3: Mostrar lista\n"+"4: Borrar elemento primero\n"+"5: Borrar Todo\n"+"6: Mostrar uno\n"+"7: modificar\n"+"8: salir\n");
vmenu=Integer.parseInt(lmenu);
//////////////
}
if (vmenu == 7){
//modifica los datos de un trabjador buscado por su dni
String ldn;
int vdn;
ldn = JOptionPane.showInputDialog("Ingresar DNI:");
vdn=Integer.parseInt(ldn);
lnom = JOptionPane.showInputDialog("nombre");
led = JOptionPane.showInputDialog("edad");
vedad = Integer.parseInt(led);
lsue = JOptionPane.showInputDialog("sueldo");
suel = Double.parseDouble(lsue);
lcse.modificar(lcse,vdn,lnom,vedad,suel);
/////////////
lmenu = JOptionPane.showInputDialog("Menu:\n"+"1: Añadir final\n"+"2: Añadir Principio\n"+"3: Mostrar lista\n"+"4: Borrar elemento primero\n"+"5: Borrar Todo\n"+"6: Mostrar uno\n"+"7: modificar\n"+"8: salir\n");
vmenu=Integer.parseInt(lmenu);
//////////////
}
}
}
}
bibliografia: listas circulares




