clase 2 estructura de datos - 456
DESCRIPTION
programacionTRANSCRIPT
UNIVERSIDAD MARIANO GALVEZ DE GUATEMALA
FACULTAD DE INGENIERIA EN SISTEMAS DE INFORMACION
INGENIERIA EN SISTEMAS DE INFORMACION
ESTRUCTURAS DE DATOS
Ing. Otto Ortíz
Agenda
● Examen corto clase anterior
● Listas: ● Componentes de una lista
● Operaciones de una lista
● Tipos de listas
UNIVERSIDAD MARIANO GALVEZ DE GUATEMALA
FACULTAD DE INGENIERIA EN SISTEMAS DE INFORMACION
INGENIERIA EN SISTEMAS DE INFORMACION
Examen corto clase anterior
Preguntas
¿Qué es un tipo de dato?
¿Cuáles son los tipos de datos más comunes?
¿Qué es una estructura de datos?
¿Cuál es la diferencia entre una estructura de datos
estática y una dinámica?
¿Cuáles son las etapas necesarias para seleccionar un
tipo de estructura de datos?
UNIVERSIDAD MARIANO GALVEZ DE GUATEMALA
FACULTAD DE INGENIERIA EN SISTEMAS DE INFORMACION
INGENIERIA EN SISTEMAS DE INFORMACION
Listas
Listas
● Una lista es un contenedor secuencial en el que se
pueden insertar y borrar elementos
independientemente del tamaño del contenedor.
● Para insertar un elemento cualquiera debemos ir
recorriendo la lista.
● Una inserción en medio de la lista no requiere mover
todos los elementos que se encuentran después del
punto de inserción
Clasificación de las listas enlazadas
Los diferentes tipos de listas dependen de la forma de enlazar los nodos, son:
• Listas simplemente enlazadas. Cada nodo (elemento) contiene un único
enlace que conecta ese nodo al nodo siguiente o nodo sucesor. La lista es
eficiente en recorridos directos (“adelante”).
• Listas doblemente enlazadas. Cada nodo contiene dos enlaces, uno a su
nodo predecesor y el otro a su nodo sucesor. La lista es eficiente tanto en
recorrido directo (“adelante”) como en recorrido inverso (“atrás”).
• Lista circular simplemente enlazada. Una lista enlazada simplemente en
la que el último elemento (cola) se enlaza al primer elemento (cabeza) de tal
modo que la lista puede ser recorrida de modo circular (“en anillo”).
• Lista circular doblemente enlazada. Una lista doblemente enlazada en la
que el último elemento se enlaza al primer elemento y viceversa. Esta lista
se puede recorrer de modo circular (en anillo) tanto en dirección directa
(“adelante”) como inversa (“atrás”).
La implementación de cada uno de los cuatro tipos de estructuras de listas se
puede desarrollar utilizando referencias.
Operaciones
● Las operaciones básicas de los diferentes tipos de
listas son las mismas sólo que se realizan de formas
diferentes dependiendo de la naturaleza de cada una
de ellas.
● Estas operaciones básicas son:
● Insertar
● Eliminar
● Editar
● Consultar
Eliminar un elemento de una lista
La operación de eliminar un dato de una lista supone
enlazar el nodo anterior con el nodo siguiente al que se
desea eliminar y liberar la memoria que ocupa. El algoritmo
para eliminar un elemento sigue estos pasos:
1. Búsqueda del nodo que contiene el dato. Se ha de obtener la
dirección del nodo a eliminar y la dirección del anterior.
2. El enlace del nodo anterior que apunte al nodo siguiente del que
se elimina.
3. Si el nodo a eliminar es el cabeza de la lista (primero), se modifica
primero para que tenga la dirección del siguiente nodo.
4. Por último, la memoria ocupada por el nodo se libera. Es el propio
sistema el que libera el nodo, al dejar de estar referenciado.
Inserción de un elemento en una
lista Doble y/o Lista Circular Doble Quitar un nodo de una lista supone realizar el enlace de dos nodos, el
nodo anterior con el nodo siguiente al que se desea eliminar. La
referencia adelante del nodo anterior debe apuntar al nodo siguiente, y
la referencia atrás del nodo siguiente debe apuntar al nodo anterior.
El algoritmo es similar al del borrado para una lista simple. Ahora, la
dirección del nodo anterior se encuentra en la referencia atrás del nodo
a borrar. Los pasos a seguir son:
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 atrás del nodo siguiente a borrar tiene que apuntar a
la referencia atrás 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.
Editar un elemento en una lista
La operación editar un elemento en una lista recorre la lista
hasta encontrar la posición del nodo al que se desea
modificar la información del elemento y actualiza la
información del nodo por el nuevo elemento.
El algoritmo, una vez modificada la información del nodo,
devuelve la referencia a ese nodo (en caso negativo,
devuelve null).
Otro planteamiento es que el método devuelva true si se
pudo modificar la información del nodo con el elemento, y
false si no se pudo realizar la operación.
Consulta de un elemento en una
lista
La operación búsqueda de un elemento en una lista
enlazada recorre la lista hasta encontrar el nodo con el
elemento.
El algoritmo, una vez encontrado el nodo, devuelve la
referencia a ese nodo (en caso negativo, devuelve null).
Otro planteamiento es que el método devuelva true si
encuentra el nodo con el elemento, y false si no está en la
lista.
Nodo
Para comprender de una mejor manera el
concepto de Listas Simples es necesario,
primeramente, conocer la estructura básica de
un nodo. En general un nodo consta de dos
partes:
• Un campo Información que será del tipo de
datos que se quiera almacenar en la lista
• Un puntero sig, que se utiliza para establecer
el enlace con otro nodo de la lista. que será
del tipo de datos que se quiera almacenar en
la lista. Si el nodo fuera el último de la lista,
este campo tendrá como valor: NULL (vacío).
Al emplearse el campo puntero sig para
relacionar dos nodos, no será necesario
almacenar físicamente a los nodos en
espacios contiguos.
LISTA SIMPLE ENLAZADA • Estructura conformada por un elemento fundamental denominado
Nodo. El Nodo es un elemento que contiene la información y la
dirección del siguiente elemento, el primer elemento creado se le
denomina cabeza y es la referencia para el desarrollo de las
diversas acciones en la Lista.
• Una lista enlazada, en su forma mas simple, es una colección de
nodos que juntos forman un orden lineal. El ordenamiento esta
determinado de tal forma que cada nodo es un objeto que guarda
una referencia a un elemento y una referencia, llamado siguiente, a
otro nodo. La idea principal es que se cree un nuevo nodo, se pone
su enlace siguiente para que se referencie al mismo objeto que la
cabeza, y entonces se pone que la cabeza apunte al nuevo nodo.
LISTA SIMPLE ENLAZADA • Podría parecer extraño tener un nodo que referencia a otro nodo,
pero tal esquema trabaja fácilmente. La referencia siguiente dentro
de un nodo puede ser vista como un enlace o apuntador a otro
nodo. De igual nodo, moverse de un nodo a otro siguiendo una
referencia al siguiente es conocida como salto de enlace o salto de
apuntador.
• Como en un arreglo, una lista simple enlazada guarda sus
elementos en un cierto orden. Este orden está determinado por la
cadenas de enlaces siguientes yendo desde cada nodo a su
sucesor en la lista. A diferencia de un arreglo, una lista simple
enlazada no tiene un tamaño fijo predeterminado, y usa espacio
proporcional al número de sus elementos. Asimismo, no se emplean
números índices para los nodos en una lista enlazada. Por lo tanto,
no se puede decir sólo por examinar un nodo si este es el segundo,
quinto u otro nodo en la lista.
LISTA SIMPLE ENLAZADA
Ejemplo de Inserción
LISTA SIMPLE ENLAZADA
Ejemplo de Eliminar
Implementación de lista simple
Creando la Clase para el manejo de la lista
Métodos para determinar si la lista
Está vacía y para obtener el tamaño
De la misma
Implementación de lista simple Inserción
Implementación de lista simple Borrado
Implementación de lista simple Borrado
Implementación de lista simple Búsqueda
Implementación de lista simple Impresión
LISTA DOBLE ENLAZADA • En una lista doblemente enlazada cada nodo tiene una referencia al
nodo siguiente, el cual apunta al siguiente nodo en la lista, y al nodo anterior el cual apunta al nodo previo en la lista. Al igual que en las implementaciones de otras estructuras, en la lista doblemente enlazada los nodos cabecera y final tienen referencias a null. Una buena analogía de una lista doble enlazada sería un tren, donde cada vagón esta conectado con el que le precede y el que le sigue.
• Tipo de lista enlazada que permite ir en ambas direcciones hacia
adelante y hacia atrás en una lista enlazada. Tal lista permite una
gran variedad de operaciones rápidas de actualización, al estar
doblemente ligada facilita la implementación de la búsqueda y
recorridos en ambos sentidos incluyendo la inserción y el borrado
en ambos extremos, y en el centro.
LISTA DOBLE ENLAZADA
Ejemplo de Inserción
LISTA DOBLE ENLAZADA
Ejemplo de Eliminar
LISTA CIRCULAR • En las listas lineales simples o dobles siempre hay un primer nodo y
un último nodo que tiene el campo de enlace a nulo. Esto, porque se delimita el comienzo y el término de la misma. Una lista circular, por su naturaleza cíclica, no tiene ni principio ni fin. No obstante, es útil y recomendable establecer un nodo de referencia a partir del cual se acceda a la lista y así poder conocer la posición inicial y acceder a sus operaciones insertar, borrar etc.
• Una lista circularmente enlazada tiene el mismo tipo de nodos que una lista simple enlazada. Esto es, cada nodo en una lista circularmente enlazada tiene un apuntador siguiente y una referencia a un elemento. Pero no hay una cabeza o cola en la lista circularmente enlazada. En vez de tener que el apuntador del último nodo sea null, en una lista circularmente enlazada, este apunta de regreso al primer nodo. Por lo tanto, no hay primer nodo o último. Si se recorren los nodos de una lista circularmente enlazada desde cualquier nodo usando los apuntadores sig, se ciclará a través de los nodos.
LISTA CIRCULAR • Aún cuando una lista circularmente enlazada no tiene inicio o
terminación, no obstante se necesita que algún nodo esté marcado
como especial, el cual será llamado el cursor. El nodo cursor
permite tener un lugar para iniciar si se requiere recorrer una lista
circularmente inversa. Y si se recuerda esta posición inicial,
entonces también se puede saber cuando se haya terminado con
un recorrido en la lista circularmente enlazada, que es cuando se
regresa al nodo que fue el nodo cursor cuando se inicio.
LISTA CIRCULAR
Ejemplo de Inserción
LISTA CIRCULAR
Ejemplo de Eliminar
LISTA CIRCULAR DOBLE • En una lista circular doblemente enlazada, cada nodo tiene dos
enlaces, análogamente a la lista doblemente enlazada lineal, el cambio radica en 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 contiguo. Aunque estructuralmente una lista circular
doblemente enlazada no tiene ni principio ni fin, un puntero de
acceso externo (centinela) puede establecer el nodo apuntado que
está en la cabeza o al nodo final, y así mantener el orden como en
una lista doblemente enlazada.
LISTA CIRCULAR DOBLE • La búsqueda y los algoritmos de ordenación se simplifican si se
usan los llamados Nodos Centinelas o cabecera, donde cada
elemento apunta a otro elemento y nunca a nulo. El Nodo Centinela
o Puntero Cabeza contiene, como otro, un puntero siguiente que
apunta al que se considera como primer elemento de la lista
También contiene un puntero previo que hace lo mismo con el
último elemento.
• El Nodo Centinela es definido como otro nodo en una lista
doblemente enlazada. Si los punteros anterior y siguiente apuntan
al Nodo Centinela la lista se considera vacía. En otro caso, si a la
lista se le añaden elementos ambos puntero apuntarán a otros
nodos. Estos Nodos Centinelas simplifican muchos las operaciones
pero hay que asegurarse de que los punteros anterior y siguiente
existen en cada momento.
LISTA CIRCULAR DOBLE
Ejemplo de Inserción
LISTA CIRCULAR DOBLE
Ejemplo de Eliminar