You are on page 1of 6

Universidad Los ngeles de Chimbote

Curso: Estructuras de datos

LISTAS CIRCULARES
Una lista circular es una lista lineal en la que el ltimo elemento apunta al primero. Entonces es posible acceder a cualquier elemento de la lista desde cualquier punto dado. Las operaciones sobre una lista circular resultan ms sencillas ya que se evitan casos especiales. Por ejemplo, el mtodo aadir de la clase ClistaLinealSE expuesta anteriormente contempla dos casos: insertar al principio de la lista e insertar a continuacin de un elemento. La siguiente figura muestra cmo se ve una lista circular simplemente enlazada.
ultimo

Cuando recorremos una lista circular, diremos que hemos llegado al final de la misma cuando nos encontremos de nuevo en el punto de partida, suponiendo, desde luego, que el punto de partida se guarda de alguna manera en la lista; por ejemplo con una referencia fija al mismo. Esta referencia puede ser al primer elemento de la lista, tambin puede ser al ltimo elemento, en cuyo caso tambin es conocida la direccin del primer elemento. Otra posible solucin sera poner un elemento especial identificable en cada lista circular como lugar de partida. Este elemento especial recibe el nombre de elemento de cabecera de la lista. Esto presenta, adems, la ventaja de que la lista circular no estar nunca vaca. Como ejemplo, vamos a construir una lista circular con una referencia fija al ltimo elemento es equivalente a una lista lineal recta con dos referencias, una al principio y otra al final. Para construir una lista circular, primero tendremos que definir la clase de objetos que van a formar parte de la misma. Por ejemplo, cada elemento de la lista puede definirse como una estructura de datos con dos miembros: una referencia al elemento siguiente y otra al rea de datos . El rea de datos puede ser de un tipo predefinido o de un tipo definido por el usuario. Segn esto, el tipo de cada elemento de la lista puede venir definido de la siguiente forma:
private class CElemento { // Atributos private Object datos; // referencia a los datos private CElemento siguiente; // siguiente elemento // Mtodos private CElemento() {} // constructor

Curso: Estructuras de datos

Docente : Ing. Hctor Fiestas Bancayn

Universidad Los ngeles de Chimbote

Curso: Estructuras de datos

private CElemento(Object d, CElemento s) // constructor { datos = d; siguiente = s; } }

Vemos que por tratarse de una lista lineal simplemente enlazada, aunque sea circular, la estructura de sus elementos no vara con respecto a lo estudiado anteriormente. Podemos automatizar el proceso de implementar una lista circular diseando una clase CListaCircularSE (Clase Lista Circular Simplemente Enlazada) que proporcione los atributos y mtodos necesarios para crear cada elemento de la lista, as como para permitir el acceso a los mismos. Esta clase nos permitir posteriormente derivar otras clases que sean ms especficas, por ejemplo, una clase para manipular pilas o una clase para manipular colas. Estas estructuras de datos las estudiaremos un poco ms adelante.

La clase CListaCircularSE
La clase CListaCircularSE que vamos a implementar incluir un atributo ltimo que valdr null cuando la lista est vaca y cuando no, referenciar siempre a su ltimo elemento; una clase interna, CELemento, que definir la estructura de los elementos; y los mtodos indicados en la tabla siguiente:
Mtodo tamao Significado Devuelve el nmero de elementos de la lista. No tiene parmetros. Aade un elemento al principio (el primer elemento es el referenciado por ultimo.siguiente). Tiene un parmetro que es una referencia de tipo Object al objeto a aadir. No devuelve ningn valor. Aade un elemento al final (el ltimo elemento siempre estar referenciado por ultimo). Tiene un parmetro que es una referencia de tipo Object al objeto a aadir. No devuelve ningn valor. Borra el primer elemento (el primer elemento es el referenciado por ultimo.siguiente). No tiene parmetros. Devuelve una referencia al objeto borrado o null si la lista est vaca. Devuelve el elemento de la posicin i o bien null si la lista est vaca o el ndice est fuera de los lmites. Tiene un

aadirAlPrincipio

aadirAlFinal

borrar

obtener

Curso: Estructuras de datos

Docente : Ing. Hctor Fiestas Bancayn

Universidad Los ngeles de Chimbote

Curso: Estructuras de datos

parmetro correspondiente a la posicin i del objeto que se desea obtener. A continuacin se presenta el cdigo correspondiente a la definicin de la clase

CListaCircularSE.

////////////////////////////////////////////////////////////////// // Lista lineal circular simplemente enlazada // public class CListaCircularSE { // ltimo: referencia el ltimo elemento. // ltimo.siguiente referencia al primer elemento de la lista. private CElemento ltimo = null; // Elemento de una lista lineal circular simplemente enlazada private class CElemento { // Atributos private Object datos; // referencia a los datos private CElemento siguiente; // siguiente elemento // Mtodos private CElemento() {} // constructor private CElemento(Object d, CElemento s) // constructor { datos = d; siguiente = s; } } public CListaCircularSE() {} // constructor public int tamao() { // Devuelve el nmero de elementos de la lista if (ltimo == null) return 0; CElemento q = ltimo.siguiente; // primer elemento int n = 1; // nmero de elementos while (q != ltimo) { n++; q = q.siguiente; } return n; } public void aadirAlPrincipio(Object obj) {

Curso: Estructuras de datos

Docente : Ing. Hctor Fiestas Bancayn

Universidad Los ngeles de Chimbote

Curso: Estructuras de datos

// Aade un elemento al principio de la lista. // Crear el nuevo elemento. CElemento q = new CElemento(obj, null); if( ltimo != null ) // existe una lista { q.siguiente = ltimo.siguiente; ltimo.siguiente = q; } else // insercin del primer elemento { ltimo = q; ltimo.siguiente = q; } } public void aadirAlFinal(Object obj) { // Aade un elemento al final de la lista. // Por lo tanto, ltimo referenciar este nuevo elemento. // Crear el nuevo elemento. CElemento q = new CElemento(obj, null); if( ltimo != null ) // existe una lista { q.siguiente = ltimo.siguiente; ltimo = ltimo.siguiente = q; } else // insercin del primer elemento { ltimo = q; ltimo.siguiente = q; } } public Object borrar() { // Devuelve una referencia a los datos del primer elemento de // la lista y borra este elemento. if( ltimo == null ) { System.err.println( "Lista vaca\n" ); return null; } CElemento q = ltimo.siguiente; Object obj = q.datos; if( q == ltimo ) ltimo = null; else ltimo.siguiente = q.siguiente; Curso: Estructuras de datos Docente : Ing. Hctor Fiestas Bancayn

Universidad Los ngeles de Chimbote

Curso: Estructuras de datos

return obj; // El elemento referenciado por q es enviado a la basura, al // quedar desreferenciado cuando finaliza este mtodo por ser // q una variable local. } public Object obtener(int i) { // Obtener el elemento de la posicin i int nmeroDeElementos = tamao(); if (i >= nmeroDeElementos || i < 0) return null; CElemento q = ltimo.siguiente; // primer elemento // Posicionarse en el elemento i for (int n = 0; n < i; n++) q = q.siguiente; // Retornar los datos return q.datos; } } //////////////////////////////////////////////////////////////////

Una vez que hemos escrito la clase CListaCircularSE, vamos a realizar una aplicacin que utilizndola cree una lista circular y ponga a prueba las distintas operaciones que sobre ella pueden realizarse. Los elementos de esta lista sern objetos de la clase CDatos utilizada en ejemplos anteriores. El cdigo de esta aplicacin puede ser el siguiente:

////////////////////////////////////////////////////////////////// // Crear una lista lineal circular simplemente enlazada // public class Test { public static void mostrarLista(CListaCircularSE lcse) { // Mostrar todos los elementos de la lista int i = 0, tam = lcse.tamao(); CDatos obj; while (i < tam) { obj = (CDatos)lcse.obtener(i); System.out.println(i + ".- " + obj.obtenerNombre() + " " + obj.obtenerNota()); i++; } if (tam == 0) System.out.println("lista vaca"); Curso: Estructuras de datos Docente : Ing. Hctor Fiestas Bancayn

Universidad Los ngeles de Chimbote }

Curso: Estructuras de datos

public static void main(String[] args) { // Crear una lista circular vaca CListaCircularSE lcse = new CListaCircularSE(); // Leer datos y aadirlos a la lista String nombre; double nota; int i = 0; System.out.println("Introducir datos. Finalizar con Ctrl+Z."); System.out.print("nombre: "); while ((nombre = Leer.dato()) != null) { System.out.print("nota: "); nota = Leer.datoDouble(); lcse.aadirAlFinal(new CDatos(nombre, nota)); System.out.print("nombre: "); } // Aadir un objeto al principio lcse.aadirAlPrincipio(new CDatos("abcd", 10)); System.out.println("\n"); // Mostrar la lista System.out.println("Lista:"); mostrarLista(lcse); // Borrar el elemento primero CDatos obj = (CDatos)lcse.borrar(); // Mostrar la lista System.out.println("Lista:"); mostrarLista(lcse); } }

**.**

Curso: Estructuras de datos

Docente : Ing. Hctor Fiestas Bancayn

You might also like