2_-_Sesion2_EDD_lineales.pdf

33
José Vargas, Sidney Osorio Laboratorio de Estructuras de Datos ‘A’

Transcript of 2_-_Sesion2_EDD_lineales.pdf

Page 1: 2_-_Sesion2_EDD_lineales.pdf

José Vargas, Sidney Osorio

Laboratorio de Estructuras de Datos ‘A’

Page 2: 2_-_Sesion2_EDD_lineales.pdf

Envío de entregables

o Crear una cuenta en dropbox.

o Crear una carpeta y nombrarla = [S2]<#carnet>

o Ejemplo: [S2]201100000

o Compartir carpeta con [email protected] mediante dropbox.

* Para evitar que les reboten los correos por mandar rar, zip, exe, etc. Toda tarea, hoja de trabajo, practica y proyecto “que les solicite me envíen” hacerlo de la siguiente manera:

o Subir entregables a dicha carpeta antes del día y hora límite de entrega.

o No cambiar nombre luego de subirlo (el sistema altera la fecha y hora de subida).

o No hacer cambios dentro del archivo (el sistema altera la fecha y hora de subida).

Page 3: 2_-_Sesion2_EDD_lineales.pdf

Nombre para entregables:

A menos que se indique lo contrario, los tipos de archivos a aceptar (.ext) son:

.pdf

.rar

Tipo Formato Ejemplo

Tarea [S2]Tarea#_<#carnet>.ext [S2]Tarea1_201100000.pdf

Hoja de trabajo [S2]HT#_<#carnet>.ext [S2]HT1_201100000.pdf

Práctica [S2]Practica#_<#carnet>.ext [S2]Practica1_201100000.rar

Proyecto [S2]Proyecto#_<#carnet>.ext [S2]Proyecto1_201100000.rar

Page 4: 2_-_Sesion2_EDD_lineales.pdf

Las EDD simples se pueden combinar de varias maneras para formar estructuras mas complejas. Las clases principales de dichas estructuras mas complejas son lineales y no lineales, dependiendo de la complejidad de las relaciones lógicas que representan.

Las EDD lineales presentan el principio de adyacencia, es decir, estar almacenadas contiguamente. Entre las EDD lineales vamos a estudiar:

Listas

Pilas

Colas

Page 5: 2_-_Sesion2_EDD_lineales.pdf

Una lista enlazada es una EDD formada por un conjunto de elementos ordenados; el número de elementos en la lista puede variar (“dinamismo”). Denotemos la lista enlazada llamada A, formada por T elementos como: 𝐴 = [𝐴1, 𝐴2, … , 𝐴𝑇]

Si 𝑇 = 0, se dice que la lista lineal esta vacía.

Se puede agregar o borrar un elemento en cualquier tiempo de la ejecución del programa.

Page 6: 2_-_Sesion2_EDD_lineales.pdf

Listas simples enlazadas Cada nodo contiene un único enlace que lo conecta 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 otro a su nodo sucesor. La

lista es eficiente en recorrido directo (“adelante”) como en recorrido inverso (“atrás”).

Lista circular simplemente enlazada El ultimo elemento (cola) se enlaza al primer elemento (cabeza) de tal modo que la lista

puede recorrerse de modo circular (“en anillo”) en dirección directa (“adelante”).

Lista circular doblemente enlazada Cada nodo contiene dos enlaces, uno a su nodo predecesor y otro a su nodo sucesor,

además, el ultimo elemento se enlaza al primer elemento y viceversa. Esta lista se puede recorrer en modo circular (“en anillo”) tanto en dirección directa (“adelante”) como inversa (“atrás”).

Page 7: 2_-_Sesion2_EDD_lineales.pdf

Implementación de una lista enlazada: Crear un elemento (“nodo”) que en lenguaje C es representado por un ‘Struct’.

El elemento esta formado en su interior por dos partes importantes: Parte de dato: acá se declara la cantidad y tipo de atributos para el elemento

Parte de enlace: acá se declara la cantidad de enlaces que tendrá dicho elemento, dicha cantidad depende también del tipo de lista a implementar.

Instanciar dicho elemento poniendo un nombre descriptivo, por ejemplo: cabeza, primero, inicio, etc.

Dentro de la implementación se debe definir ciertas operaciones que dependen del propósito de la EDD. Insertar nuevo elemento

Eliminar elemento

Buscar elemento

Recorrer la lista enlazada

Comprobar si la lista esta vacía

Page 8: 2_-_Sesion2_EDD_lineales.pdf

No hay una regla que defina cual es la mejor manera de implementar una lista enlazada, de hecho, se trata de realizar la EDD de tal manera que sea adecuada a la aplicación en la cual se va a utilizar.

Dicho lo anterior, normalmente se accede a partir del primer elemento (“nodo”), en ocasiones también se mantiene una referencia al último elemento (“nodo”) de la lista enlazada.

Page 9: 2_-_Sesion2_EDD_lineales.pdf

El nuevo elemento que se desea incorporar a una lista se puede insertar de distintas formas, según la posición o punto deseado de inserción.

En la cabeza de la lista (elemento primero).

En el final de la lista (elemento ultimo).

Antes de un elemento especificado.

Después de un elemento especificado.

Page 10: 2_-_Sesion2_EDD_lineales.pdf

La posición mas fácil, y a la vez, mas eficiente en donde insertar un nuevo elemento de una lista es en la cabeza, es decir, por el primer elemento de la lista. El proceso de inserción se resume:

Crear un nodo e inicializar el campo dato al nuevo elemento. La referencia del nodo se asigna a nuevo, variable local del método.

Hacer que el campo enlace del nuevo nodo apunte a la cabeza (“primero”) de la lista original.

Hacer que primero apunte al nodo creado.

Page 11: 2_-_Sesion2_EDD_lineales.pdf

Una lista enlazada contiene tres elementos: 10, 25 y 40.

Insertar en la cabeza de la lista un nuevo elemento: 4

Paso 1:

Page 12: 2_-_Sesion2_EDD_lineales.pdf

Paso 2:

Paso 3:

Page 13: 2_-_Sesion2_EDD_lineales.pdf

La inserción al final de la lista es menos eficiente debido a que, normalmente, no se tienen un puntero al último nodo y, entonces, se ha de seguir toda la lista desde el inicio hasta el último para, a continuación, realizar la inserción.

Se debe, entonces, crear un nodo, inicializando su dato a la entrada. El campo enlace del ultimo nodo queda apuntado al nodo creado y asi se enlaza, como nodo final a la lista.

Page 14: 2_-_Sesion2_EDD_lineales.pdf

El algoritmo para insertar entre dos nodos n1 y n2 es el siguiente:

Crear un nodo inicializando su dato a la entrada y el campo enlace a null. La referencia al nodo se asigna a nuevo.

Hacer que el campo enlace del nuevo nodo apunte al nodo n2, ya que el nodo creado se ubicara justo antes de n2.

La variable referencia anterior tiene la dirección del nodo n1, y esto exige hacer que el anterior.enlace apunte al nodo creado.

Page 15: 2_-_Sesion2_EDD_lineales.pdf

Insertar el nodo con dato 75 entre los nodos n1 con dato 25 y n2 con dato 40

Paso 1:

Page 16: 2_-_Sesion2_EDD_lineales.pdf

Paso 2:

Paso 3:

Page 17: 2_-_Sesion2_EDD_lineales.pdf

La operación búsqueda de un dato en una lista enlazada recorre la lista hasta encontrar el nodo con el dato. El algoritmo que se utiliza para localizar un elemento en una lista enlazada:

Crear un nodo auxiliar

Posicionar ese auxiliar a la cabeza de la lista

Verificar si el dato que buscamos esta en ese nodo auxiliar

Si esta devolverlo y terminar con el método

De lo contrario continuar recorriendo hasta encontrar el dato o llegar al final de la lista y no encontrarlo

Una vez encontrado el nodo, devuelve la referencia a ese nodo. Otro planteamiento es que el método devuelva true si encuentra el nodo con el elemento y false si no esta en la lista.

Page 18: 2_-_Sesion2_EDD_lineales.pdf

La operación eliminar un nodo 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 nodo que contiene un dato es el siguiente:

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.

Se coloca el enlace del nodo anterior apuntando al siguiente del nodo a eliminar.

Si el nodo a eliminar es la cabeza de la lista, se modifica primero para que tenga la dirección del siguiente nodo.

Por último, la memoria ocupada por el nodo se libera.

Page 19: 2_-_Sesion2_EDD_lineales.pdf

La lista ordenada es una lista enlazada a la que se añade la propiedad de ordenación de sus datos. Por esto, se puede decir que esta es una implementación de herencia sobre una lista enlazada. El método de insertar es el método que se modifica, para que luego sea aprovechado ese orden en las otras operaciones.

Page 20: 2_-_Sesion2_EDD_lineales.pdf

En esta lista, cada elemento contiene dos apuntadores (referencias), además del dato almacenado. Una referencia apunta al siguiente elemento de la lista y la otra referencia apunta al elemento anterior.

Page 21: 2_-_Sesion2_EDD_lineales.pdf

Insertar un elemento a la cabeza

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

Hacer que el campo enlace adelante del nuevo nodo apunte a la cabeza (primer nodo) de la lista original, y que el campo enlace atrás del nodo cabeza apunte al nuevo nodo.

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

Page 22: 2_-_Sesion2_EDD_lineales.pdf

Insertar después de un nodo

Crear un nodo con el nuevo dato y asignar su referencia a la variable nuevo.

Hacer que el enlace adelante del nuevo nodo apunte al nodo siguiente de n.

Si el siguiente de n no es null hacer que el enlace atrás apunte a nuevo.

Hacer que el enlace siguiente de n apunte a nuevo.

Hacer que el enlace atrás de nuevo apunte a n.

Page 23: 2_-_Sesion2_EDD_lineales.pdf

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:

Búsqueda del nodo que contiene el dato

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

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 ultimo nodo)

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

La memoria ocupada por el nodo se libera.

Page 24: 2_-_Sesion2_EDD_lineales.pdf
Page 25: 2_-_Sesion2_EDD_lineales.pdf

En las listas simples o en las dobles siempre hay un primer nodo (cabeza) y un ultimo nodo (cola). Una lista circular, por propia naturaleza, no tiene principio ni fin. Sin embargo, resulta útil establecer un nodo a partir del cual se accede a la lista y así poder acceder a sus nodos.

El apuntador de acceso a una lista circular (Lc), normalmente apunta al ultimo nodo añadido a la estructura. Esta convención puede cambiar, ya que en la estructura circular no hay primero ni ultimo.

Page 26: 2_-_Sesion2_EDD_lineales.pdf

Una pila es un caso especial de lista lineal en el cual, la inserción y supreción son operaciones que solo pueden ocurrir en un extremo de la pila, el cual se denomina como tope de pila. Denotemos TOPE(P) como el elemento tope de la pila P. Para la pila P donde:

𝑃 = [𝑃1, 𝑃2, … , 𝑃𝑇]

El TOPE(P) es 𝑃𝑇

Una pila tiene un numero entero de elementos, por ejemplo para la pila P de arriba, el numero de elementos es T.

LIFO: Last In First Out, el último en entrar es el primero en salir.

Page 27: 2_-_Sesion2_EDD_lineales.pdf

La representación gráfica que elija no importa en tanto que haya consistencia para cualquier pila en particular. Generalmente usamos de tener el tope en la dirección superior.

Page 28: 2_-_Sesion2_EDD_lineales.pdf

Operación Descripción

crear_pila(nombre,capacidad) Inicia la pila con nombre y asigna capacidad

aplilar(P, dato) Pone un dato en la pila P

desapilar(P) Retira un dato de la pila P

pila_vacia(P) Comprueba si la pila P no tiene elementos

pila_llena(P) Comprueba si la pila P esta llena de elementos

limpiar_pila(P) Quita todos los elementos de la pila P

cima_pila(P) Obtiene el elemento cima de la pila P

tamanio_pila(P) Numero de elementos máximo que puede

contener la pila P

Page 29: 2_-_Sesion2_EDD_lineales.pdf

Una cola es un caso especial de la EDD definida como lista lineal. En una cola la inserción se hace estrictamente por un extremo al cual llamamos fondo, la supresión sólo puede hacerse por el otro extremo de la cola, al cual llamamos frente:

𝐶 = 𝐶1, 𝐶2, … , 𝐶𝑇

El frente de 𝐶 es 𝐶1

El fondo de 𝐶 es 𝐶𝑇

SI T=0 la se dice que cola esta vacía

FIFO: First In First Out, el primero en entrar es el primero en salir.

Page 30: 2_-_Sesion2_EDD_lineales.pdf

En la realidad no es importante si trazamos una cola cuyo crecimiento vaya de derecha a izquierda:

o de izquierda a derecha:

o, bien, en forma vertical, en tanto seamos consistentes con respecto a cuales son el frente y el fondo de la cola.

Page 31: 2_-_Sesion2_EDD_lineales.pdf

Operación Descripción

crear_cola(nombre, capacidad) Inicia la cola con nombre y asigna capacidad

encolar(Q, dato) Inserta un dato en la cola Q

desencolar(Q) Retira el elemento frente de la cola Q

cola_vacia(Q) Comprueba si la cola Q no tiene elementos

cola_llena(Q) Comprueba si la cola Q esta llena de elementos

frente(Q) Obtiene el elemento frente de la cola Q

tamanio_cola(Q) Numero de elementos máximo que puede

contener la cola Q

Page 32: 2_-_Sesion2_EDD_lineales.pdf

1. Dibuje la secuencia de resultados de aplicar las operaciones siguientes sobre una pila vacía p:

apilar(p,5); apilar(p,10); desapilar(p); apilar(p,33); apilar(p,33); desapilar(p); apilar(p,71); apilar(p,101).

2. Dibuje la secuencia de resultados de aplicar las operaciones siguientes sobre una cola vacía q:

encolar(q,5); encolar(q,10); desencolar(q); encolar(q,33); encolar(q,33); desencolar(q); encolar(q,71); encolar(q,101);

Todo en un documento PDF utilizando alguna herramienta de diagramación.

Nombre: [S2]Tarea1_<carnet>.pdf

Ejemplo: [S2]Tarea1_201100000.pdf

Entrega: Viernes 31/07/2015 23:59

Page 33: 2_-_Sesion2_EDD_lineales.pdf