Programación 3: listas enlazadas

32
PROGRAMACIÓN 3 TEMA: LISTAS ENLAZADAS Estudiante : Tania Landivar UNIVERSIDAD DE CUENCA FACULTAD DE INGENIERÍA

Transcript of Programación 3: listas enlazadas

Page 1: Programación 3: listas enlazadas

PROGRAMACIÓN 3

TEMA: LISTAS ENLAZADAS

Estudiante : Tania Landivar

UNIVERSIDAD DE CUENCAFACULTAD DE INGENIERÍA

Page 2: Programación 3: listas enlazadas

INTRODUCCIÓNLas estructuras de datos lineales (vectores ) obliga afijar por adelantado el espacio a ocupar en memoria, de modo que, cuando se desea añadir un nuevo elemento que rebase el tamaño prefijado del array, no es posible realizar la operación sin que se produzca un error en tiempo de ejecución, para evitar esto se hace uso de las listas enlazadas.Una lista enlazada es una colección o secuencia de elementos llamados nodos, dispuestos uno detrás de otro, en la que cada elemento se conecta al siguiente elemento por un “enlace” o “referencia”.

Page 3: Programación 3: listas enlazadas

NODOSSe componen de los partes:

1. Contiene Información (Dato, Tipo Elemento).2. Referencia denominada enlace, que apunta al siguiente elemento de la

lista.

Page 4: Programación 3: listas enlazadas

CLASIFICACIÓN DE LAS LISTAS ENLAZADAS Listas simplemente enlazadas: Cada

nodo(elemento) contiene un único enlace que lo conectan al nodo siguiente. La lista es más eficiente en recorridos directos (“adelante).

Listas doblemente enlazadas: Cada nodo contiene dos enlaces a su nodo predecesor y sucesor. La listas es eficiente tanto en recorrido directo hacia (“adelante”) o (“atrás”).

Lista circular simplemente enlazada: Es la que el último elemento se enlaza con el primer elemento.

Lista circular doblemente enlazada: Es la que el último elemento enlaza al primer elemento y viceversa.

Page 5: Programación 3: listas enlazadas

TIPO DE DATO ABSTRACTO (TDA)Una lista enlazada se utiliza para almacenar información, tiene un conjunto de valores (nodos ) y un conjunto de operaciones (inserciones, eliminaciones de nodos, entre otros).Estas son un tipo de dato abstracto, debido a que su espacio de almacenamiento es variable.

Page 6: Programación 3: listas enlazadas

OPERACIONES EN LAS LISTAS ENLAZADAS

Inicialización o Creación. Insertar elementos a la lista. Eliminar elementos de la lista. Buscar elementos de la lista. Recorrer la lista enlazada. Comprobar si la lista está vacía.

Page 7: Programación 3: listas enlazadas

DECLARACIÓN DE UN NODO EN JAVA

Declaramos una clase con el nombre Nodo Dato EnlaceEl constructor inicializa al objeto Nodo.

La visibilidad de los dos campos del nodo, tienen la visibilidad por defecto para que los métodos que implementan las operaciones de las listas, puedan acceder a ellos.

Page 8: Programación 3: listas enlazadas

ACCESO A LA LISTA: CABECERA Y COLANormalmente se accede al primer Nodo de la lista, aunque en ocasiones se mantiene una referencia al último Nodo de la lista enlazada.

Cuando se inicia la construcción de una lista, la referencia cabeza, normalmente se inicializa a null, para indicar que la lista está vacía.

Page 9: Programación 3: listas enlazadas

CONSTRUCCIÓN DE UNA LISTA

Para construir una lista se necesitan dos clases (Nodo y Lista) que deben estar contenidas en el mismo paquete.

En la clase Lista se implementan las operaciones de las listas enlazadas.

Page 10: Programación 3: listas enlazadas

INSERCIÓN DE UN ELEMENTO A LA LISTA A la cabeza de la lista(elemento primero)

Page 11: Programación 3: listas enlazadas

Inserción al final de la lista.Está inserción es menos eficiente, debido a que hay que ir recorriendo toda la lista, hasta llegar al nodo final.

Inserción entre dos nodos de la lista.Se crea un nuevo nodo con el dato 75.

Page 12: Programación 3: listas enlazadas
Page 13: Programación 3: listas enlazadas

BÚSQUEDA EN LISTAS ENLAZADASPara la operación búsqueda de un elemento, se recorre la lista hasta

encontrar el nodo con el elemento, dicha operación devuelve una referencia a ese nodo, si no lo encuentra devuelve null.

Hay que tener en cuenta que (==) se utiliza para datos simples, en cambio si los datos de los nodos son objetos entonces utilizamos el método equals(), que compara dos objetos.

Page 14: Programación 3: listas enlazadas

ELIMINACIÓN DE UN NODO DE LA LISTAEstá operación consiste en enlazar el nodo anterior con el

nodo siguiente al que se desea eliminar y liberar la memoria que ocupa.

1. Obtener la dirección del nodo a eliminar y la del nodo anterior.2. El enlace del nodo anterior que apunte al siguiente nodo del cual se elimina.3. Si el nodo a eliminar es la cabeza, se modifica la cabeza para que tenga la

dirección del siguiente nodo.4. Finalmente, la memoria ocupada se libera. Es el propio sistema que libera el nodo,

al dejar de estar referenciado.

Page 15: Programación 3: listas enlazadas

Código en Java

Page 16: Programación 3: listas enlazadas

LISTA ORDENADAUna lista normalmente está ordenada de forma lineal según las posiciones que ocupen en la misma. Pero también es posible tener una lista ordena según el dato asociado a cado nodo. Con frecuencia para obtener una lista enlazada ordenada se inicia con una lista vacía.

Los datos de una lista ordenada han de ser de tipo ordinal (tipo al que pueda aplicar los operadores ==, <,>); o bien objetos de clases que tengan definidos métodos de comparación (equals(), compareTo(),…).

Page 17: Programación 3: listas enlazadas

CLASE ListaOrdenada

Es recomendable declarar una clase ListaOrdenada, como extensión de la clase Lista, por consiguiente hereda las propiedades de está clase, los métodos eliminar() y buscarLista() se redefine para que la búsqueda del elemento aproveche el hecho de que estos están ordenados.

Page 18: Programación 3: listas enlazadas

LISTA DOBLEMENTE ENLAZADAEn una lista doblemente enlazada , cada elemento contiene dos referencias,

además del valor almacenado.Una referencia apunta al siguiente elemento de la lista y la otra referencia apunta al elemento anterior.

Operaciones: Insertar, Eliminar, Recorrer, Buscar.Al momento de insertar entre dos nodos, llega a ser más complicado debido ha que se asignan cuatro enlaces.

En cambio en la operación eliminar, el nodo de la lista doble necesita enlazar, mutuamente el nodo anterior y el nodo siguiente del que se borra.

Page 19: Programación 3: listas enlazadas

NODO DE UNA LISTA DOBLEMENTE ENLAZADA

Page 20: Programación 3: listas enlazadas

INSERTAR UN ELEMENTO EN UNA LISTA DOBLEMENTE ENLAZADA

La clase listaDoble que encapsula las operaciones básicas de las listas doblemente enlazadas.La clase dispone de la variable cabeza que referencia al primer nodo de la lista, permite acceder a cualquier otro nodo.El constructor de la clase inicializa la lista vacía (null).La posición de inserción del nuevo nodo puede ser:• En la cabeza de la lista• Al final de la lista• Antes de un elemento especificado• Después de un elemento especificado.

Page 21: Programación 3: listas enlazadas

INSERTAR EN LA CABEZA DE LA LISTA

• Crea un nodo con un nuevo elemento y asignar su referencia a la variable nuevo.

• Hacer que el campo enlace adelante del nuevo nodo apunte a la cabeza, y el campo enlace atras nodo cabeza apunte al nuevo nodo.

• Hacer que la cabeza apunte al nuevo nodo que se ha creado.

Page 22: Programación 3: listas enlazadas

INSERTAR DESPUÉS DE UN NODO

• Crear un nuevo nodo con el nuevo elemento, y asignar su referencia a la variable nuevo.

• Hacer que el enlace adelante del nuevo nodo apunte al nodo siguiente de n(o bien a null si n es el último nodo). El enlace atras del nodo siguiente a n (si n no es el último nodo) tiene que apuntar a nuevo.

• Hacer que el enlace adelante del nodo n apunte al nuevo nodo. A su vez el enlace atras del nuevo nodo debe apuntar a n.

Page 23: Programación 3: listas enlazadas

ELIMINAR UN ELEMENTO DE UNA LISTA DOBLEMENTE ENLAZADA

1. Búsqueda del nodo que contiene el dato.2. La referencia adelante del nodo anterior

tiene que apuntar a la referencia adelante del nodo a eliminar (si no es el nodo cabecera).

3. La referencia atras del nodo siguiente a borrar tiene que apuntar a la referencia atras del nodo a eliminar(si no es el último nodo).

4. Si el nodo que se elimina es el primero, cabeza, se modifica cabeza para que tenga la dirección del nodo siguiente.

5. La memoria ocupada por el nodo es liberada automáticamente.

Page 24: Programación 3: listas enlazadas

LISTAS CIRCULARES

Una lista circular por su propia naturaleza no tiene principio, ni fin.Sin embargo resulta útil establecer un nodo a partir del cuál se acceda a la lista y así poder acceder a sus nodos.

Operaciones de las listas circulares:

• Inicialización o creación.• Inserción de elementos.• Eliminación de elementos.• Búsqueda de elementos.• Recorrido de cada uno de los nodos.• Verificación de la lista vacía.

Page 25: Programación 3: listas enlazadas

NODO DE UNA LISTA CIRCULARHay que tener en cuenta que en el constructor, el campo referencia enlace, en vez de quedar en null, se inicializa que apunte al mismo nodo, de tal forma que queda como una lista circular de un solo nodo.

Page 26: Programación 3: listas enlazadas

INSERTAR UN ELEMENTO EN UNA LISTA CIRCULAR

La posición de inserción puede variar. Consideramos que se hace como nodo anterior al del nodo de acceso a la lista lc, y que lc tiene la dirección del último nodo insertado.

Page 27: Programación 3: listas enlazadas

ELIMINAR UN ELEMENTO DE UNA LISTA CIRCULAREl algoritmo para eliminar un nodo es:1. Búsqueda del nodo que contiene al dato.2. Se enlaza el nodo anterior con el

siguiente.3. En el caso de que el nodo a eliminar sea

por el que se accede a la lista, lc, se modifica lc, para que tenga la dirección del nodo anterior.

4. Por último el sistema libera la memora ocupada por el nodo al anular la referencia.

Page 28: Programación 3: listas enlazadas

RECORRER UNA LISTA CIRCULAREste método se va a escribir de la siguiente manera:

Inicia su recorrido en el nodo siguiente al del acceso a la lista, lc, termina cuando alcance el nodo lc.

Page 29: Programación 3: listas enlazadas

LISTAS ENLAZADAS GENÉRICASUna lista esta ligada al tipo de datos de sus elementos como int, double, String.

Declarando el campo dato de tipo Object se consigue una lista genérica, válida para cualquier tipo de dato, aunque exigirá muchas conversiones de datos cuando se concrete para un tipo de dato particular.La clase Object es un clase base de cualquier clase no derivada, cualquier referencia a un objeto se puede asignar a una variable de tipo Object.Entonces, si se define el campo dato de tipo Object, la conversión automática permite crear listas enlazadas de cualquier tipo de objetos.

Ejemplo: Se definen las referencias a objetos String, Integer y se asigna a una referencia Object.Integer t: new Integer(5);Object q;q = t; //asignación correctat = q; //error no se puede asignar a una subclase una clase base.

Page 30: Programación 3: listas enlazadas

DECLARACIÓN DE UNA LISTA GENÉRICA

Page 31: Programación 3: listas enlazadas

ITERADOR DE LA LISTA

Un iterador de una lista enlazada accede a cada uno de los nodos, hasta alcanzar el último elemento.El constructor del objeto iterador inicializa el puntero actual al primer elemento de la estructura; el método siguiente() devuelve el elemento actual y hace que quede referenciado al siguiente elemento, si no existe devuelve null.

Page 32: Programación 3: listas enlazadas

BIBLIOGRAFÍA

• Joyanes Aguilar, L., & Zohonero Martínez, I. (2008). Estructura de datos en Java. McGraw-Hill España.