Tema 3: La estructura de datos Lista Estructuras de Datos Ingeniería en Informática Universidad Carlos III de Madrid Laboratorio DEI Curso 2003/04
Listas: descripción lógica LISTA = colección de elementos homogéneos entre los que existe una relación lineal Cada elemento de la lista, a excepción del primero, tiene un único predecesor Cada elemento de la lista, a excepción del último, tiene un único sucesor Nodos y enlaces Laboratorio DEI 2003/04 Estructura de Datos
Listas: descripción lógica Orden de nodos afecta a la función de acceso Según orden de inserción Según clave Ejemplo Lista de calificaciones ::= <Alumno> + {<Alumno>} <Alumno>::= <<DNI>> + <<NIA>> + <Apellido1> + <Apellido2> + <Nombre> + <Calificación> Laboratorio DEI 2003/04 Estructura de Datos
Listas: descripción lógica Listas Arrays Listas son flexibles y permiten cambio de implementación Operaciones Insertar, Borrar, Modificar, etc. Tipos de listas Simples Ordenadas Pilas Colas Doblemente enlazadas (LDE) Circulares Laboratorio DEI 2003/04 Estructura de Datos
TAD Lista: Posibles implementaciones Estática Dinámica Enlazada Secuencial Laboratorio DEI 2003/04 Estructura de Datos
Listas Simples Lista Simple = colección de elementos homogéneos cuya relación lineal es determinada por la posición del elemento en la lista Comienzo + Enlace al siguiente ( puntero) Definición: <listaSimple> ::= <comienzo> + {<nodo>} <nodo> ::= <informacion> + <enlace> <informacion> ::= <<dato>>{<<dato>>} <enlace> ::= (<<ReferenciaNodo>> | NULL) <comienzo> :: =<enlace> Laboratorio DEI 2003/04 Estructura de Datos
TAD Lista Simple: operaciones Creación de una lista crearLista (nombreLista) Comprobación del estado listaVacia(nombreLista) Booleano listaVacia(referenciaNodo) Booleano listaLlena(nombreLista) Booleano insertar(nombreLista, valorInfo, posicion) insertar(nombreLista, valorInfo) Inserción de nodos Borrado de nodos borrar(nombreLista, valorInfo) buscar(nombreLista, dato) informacion buscar(nombreLista, dato) referenciaNodo pertenece(nombreLista,informacion) Booleano Búsqueda de un nodo Recorrido de la lista recorrer(nombreLista info(referenciaNodo) Informacion siguiente(referenciaNodo) enlace Acceso a los nodos Modificación de los nodos asignarInfo(referenciaNodo, valorInformacion) asignarEnlace(referenciaNodo, valorEnlace) Laboratorio DEI 2003/04 Estructura de Datos
Listas Simples Aclaraciones a las operaciones: Ejemplo y pseudocódigo listaLlena sólo tiene sentido si lista es acotada acceso y modificación serán métodos get y put Ejemplo y pseudocódigo insertar (nombreLista, valorInfo, posición) insertar (nombreLista, valorInfo) borrar (nombreLista, valorInfo) buscar (nombreLista, dato) información recorrer (nombreLista) Laboratorio DEI 2003/04 Estructura de Datos
Laboratorio DEI 2003/04 Estructura de Datos
Laboratorio DEI 2003/04 Estructura de Datos
Listas Ordenadas La posición de cada nodo viene determinada por el valor de uno o más campos obligatorios de información del nodo denominados clave No se permite tener dos nodos con la misma clave Definición <listaOrdenada> ::= <comienzo> + {<nodo>} <comienzo> ::= <enlace> <enlace> ::= (<<ReferenciaNodo>> | NULL) <nodo> ::= <clave> + <informacion> + <enlace> <clave> ::= <<dato>>{<<dato>>} <informacion> ::= {<<dato>>} Laboratorio DEI 2003/04 Estructura de Datos
TAD Lista Ordenada: operaciones Creación de una lista crearLista (nombreLista) Comprobación del estado listaVacia(nombreLista) Booleano listaVacia(referenciaNodo) Booleano listaLlena(nombreLista) Booleano Inserción de nodos insertar(nombreLista, valorClave, valorInfo) Borrado de nodos borrar(nombreLista, valorClave) buscar(nombreLista, valorClave) Informacion buscar(nombreLista, valorClave)ReferenciaNodo pertenece(nombreLista,valorClave) Booleano Búsqueda de un nodo Recorrido de la lista recorrer(nombreLista Acceso a los nodos clave(referenciaNodo) Clave info(referenciaNodo) Informacion siguiente(referenciaNodo) enlace Modificación de los nodos asignarClave(referenciaNodo, valorClave) asignarInfo(referenciaNodo, valorInformacion) asignarEnlace(referenciaNodo, valorEnlace) Laboratorio DEI 2003/04 Estructura de Datos
Pilas Pila = colección ordenada de elementos homogéneos en la que sólo se pueden añadir y eliminar elementos por el principio de la misma (cabecera) filosofía LIFO Definición <pila> ::= <cabecera> + {<nodo>} <cabecera> ::= <enlace> <enlace> ::= (<<ReferenciaNodo>> | NULL) <nodo> ::= <informacion> + <enlace> <informacion> ::= <<dato>>{<<dato>>} Laboratorio DEI 2003/04 Estructura de Datos
TAD Pila: operaciones Creación de pila Comprobación del estado crearPila (nombrePila) Comprobación del estado pilaVacia(nombrePila) Booleano pilaLlena(nombrePila) Booleano Inserción de nodos push(nombrePila, valorInfo) Extracción de nodos pop(nombrePila) informacion Acceso a la cabecera* cabecera(nombrePila) informacion * Opcional: Accede a la cabecera sin eliminarla Acceso a los nodos info(referenciaNodo) Informacion siguiente(referenciaNodo) Enlace Modificación de los nodos asignarInfo(referenciaNodo, valorInformacion) asignarEnlace(referenciaNodo, valorEnlace) Laboratorio DEI 2003/04 Estructura de Datos
TAD Pila: ejemplos de aplicación Vuelta atrás en un navegador web Comando “undo” en un editor Secuencia de métodos activos en la Java Virtual Machine: bar PC = 1 m = 6 Cuando se invoca un método, se inserta en la pila una nueva entrada Por cada método se guardan: variables locales valor devuelto contador de programa Cuando el método finaliza se saca ese elemento de la pila y se devuelve el control al método que esté en la cabecera main() { int i = 5; foo(i); } foo(int j) { int k; k = j+1; bar(k); } bar(int m) { … } foo PC = 3 j = 5 k = 6 main PC = 2 i = 5 Laboratorio DEI 2003/04 Estructura de Datos
Colas Cola = colección ordenada de elementos homogéneos en la que sólo se pueden añadir elementos por el final y se eliminan por el principio (frente) filosofía FIFO Definición <cola> ::= <frente> + <final> + {<nodo>} <frente> ::= <enlace> <enlace> ::= (<<ReferenciaNodo>> | NULL) <final> ::= <enlace> <nodo> ::= <informacion> + <enlace> < informacion > ::= <<dato>>{<<dato>>} Laboratorio DEI 2003/04 Estructura de Datos
TAD Cola: operaciones Creación de cola Comprobación del estado crearCola (nombreCola) Comprobación del estado colaVacia(nombreCola) Booleano colaLlena(nombreCola) Booleano Inserción de nodos encolar(nombreCola, valorInfo) Extracción de nodos desencolar(nombreCola) informacion Acceso a la cabecera* cabecera(nombreCola) informacion * Opcional: Accede a la cabecera sin eliminarla Acceso a los nodos info(referenciaNodo) Informacion siguiente(referenciaNodo) Enlace Modificación de los nodos asignarInfo(referenciaNodo, valorInformacion) asignarEnlace(referenciaNodo, valorEnlace) Laboratorio DEI 2003/04 Estructura de Datos
TAD Cola: casos particulares Colas circulares Implementación estática como array Referencia al primero y al último Aritmética módulo C (Capacidad de la cola) Llevar la cuenta del número de elementos Laboratorio DEI 2003/04 Estructura de Datos
TAD Cola: casos particulares Colas de prioridad Laboratorio DEI 2003/04 Estructura de Datos
TAD Cola: ejemplos de aplicación Listas de espera Acceso a recursos compartidos dedicados (v.g., impresoras) Multiprogramación de la CPU Laboratorio DEI 2003/04 Estructura de Datos
Listas Doblemente Enlazadas (LDE) Relación lineal en ambos sentidos Enlace a predecesor y antecesor en cada nodo Recorrido puede ser en ambos sentidos Pueden ser simples u ordenadas Definición: <lde> ::= <comienzo> + {<nodo>} <comienzo> :: = <enlace> <enlace> ::= (<<ReferenciaNodo>> | NULL) <nodo> ::= <informacion> + <predecesor> + <sucesor> <predecesor> ::= <enlace> <sucesor> ::= <enlace> <informacion> ::= <<dato>>{<<dato>>} Laboratorio DEI 2003/04 Estructura de Datos
LDE: operaciones Creación de una lista Comprobación del estado crearLista(nombreLista) Comprobación del estado listaVacia(nombreLista) Booleano listaVacia(referenciaNodo) Booleano listaLlena(nombreLista) Booleano Inserción de nodos insertar(nombreLista, valorInfo, posicion) insertar(nombreLista, valorInfo) Borrado de nodos borrar(nombreLista, valorInfo) Búsqueda de un nodo buscar(nombreLista, dato) informacion buscar(nombreLista, dato) referenciaNodo pertenece(nombreLista,informacion) Booleano Recorrido de la lista recorrer(nombreLista, sentido) Acceso a los nodos info(referenciaNodo) Informacion anterior(referenciaNodo) enlace siguiente(referenciaNodo) enlace Modificación de los nodos asignarInfo(referenciaNodo, valorInformacion) asignarAnterior(referenciaNodo, valorEnlace) asignarSiguiente(referenciaNodo, valorEnlace) Laboratorio DEI 2003/04 Estructura de Datos
Técnicas de Simplificación A B C D Algunos elementos (principio y final) se tratan como casos especiales al implementar las operaciones Rediseño de estructuras para que los elementos terminales se traten igual que el resto Estructuras auxiliares Centinelas Cabeceras Laboratorio DEI 2003/04 Estructura de Datos
Técnica de Simplificación (i) Búsqueda en lista ordenada: evaluar dos condiciones buscar(nombreLista, valorClave) informacion INICIO posicion nombreLista.comienzo continuar CIERTO MIENTRAS NO(listaVacia(posicion)) Y continuar) SI (clave(posicion) < valorClave) ENTONCES posicion siguiente(posicion) SI NO continuar FALSO SI(clave(posicion) = valorClave) ENTONCES DEVOLVER informacion(posicion) SI NO DEVOLVER error ese nodo no está en la lista FIN-SI FIN-SI FIN-MIENTRAS FIN Laboratorio DEI 2003/04 Estructura de Datos
Centinela en listas ordenadas Centinela = nodo auxiliar al final de la lista Para buscar un elemento: Colocar en el centinela el valor buscado Condición de terminación: se encuentra el valor buscado o uno mayor Si se llega al centinela, el elemento no está en la lista Ejemplo e Implementación Laboratorio DEI 2003/04 Estructura de Datos
Centinelas: ejemplos Buscar(comienzo, 15, centinela, posición) Laboratorio DEI 2003/04 Estructura de Datos
Técnica de simplificación (ii) Inserción en lista ordenada: caso especial insertarPosicion (nombreLista, valorClave, valorInfo, anterior, posterior) // Coloca el nodo entre anterior y posterior. Si anterior es vacío, entonces nodo será el primer elemento de la lista, si posterior es vacío será el último INICIO nodo nuevoNodo(valorClave, valorInfo) asignarEnlace(nodo, posterior) SI listaVacia(anterior) ENTONCES nombreLista.comienzo nodo SI NO asignarEnlace(anterior, nodo) FIN SI FIN Laboratorio DEI 2003/04 Estructura de Datos
Cabecera en listas ordenadas Cabecera = nodo auxiliar situado al principio de la lista, cuyos contenidos (clave e info) no pertenecen a la lista Consecuencias: No hace falta marcar comienzo No hace falta caso especial cuando lista es vacía Laboratorio DEI 2003/04 Estructura de Datos
Cabeceras: ejemplos insertarElemento (cabecera, 7) Laboratorio DEI 2003/04 Estructura de Datos
Cabecera + centinela Usar el mismo nodo auxiliar como cabecera y centinela Convertir la lista en circular Laboratorio DEI 2003/04 Estructura de Datos
Otras técnicas de simplificación Inserción ordenada sin puntero al anterior Buscar posición del primer elemento mayor que la clave a insertar, colocar un nodo nuevo detrás e intercambiar Borrado sin puntero al anterior Buscar posición del elemento a borrar Copiar información del siguiente a esa posición Borrar el siguiente (no funciona para borrar el último elemento hay que usar centinela) Laboratorio DEI 2003/04 Estructura de Datos
Estructuras Intrusivas Información de interés vs. Datos de control Cómo se almacenan: Las estructuras intrusivas incluyen la información de interés entre sus elementos Las estructuras no intrusivas almacenan la información de interés en un área separada, incluyendo punteros a la misma Ejemplo: mantener 2 listas (v.g., alumnos) ordenadas por distintos campos clave k1, k2, etc. (v.g., NIA y NIF) Listas intrusivas independientes Listas intrusivas con información compartida Listas no intrusivas Laboratorio DEI 2003/04 Estructura de Datos
Listas intrusivas independientes Información duplicada Pueden producirse inconsistencias y se ocupa más espacio Laboratorio DEI 2003/04 Estructura de Datos
Listas intrusivas con info compartida Incorporar un puntero por cada clave de ordenación Hay que modificar la estructura para dar acceso a través de un nuevo campo Laboratorio DEI 2003/04 Estructura de Datos
Listas no intrusivas Separar info de datos de control La incorporación de nuevas listas no afecta a la definición de las previas Laboratorio DEI 2003/04 Estructura de Datos