Estructuras Dinámicas de datos. Las estructuras dinámicas de datos son estructuras que crecen a medida que ejecuta un programa. Una estructura dinámica de datos es una colección de elementos – llamadas nodos - que son normalmente registros. Al contrario de un arreglo que contiene espacio para almacenar un número fijo de elementos, una estructura dinámica de datos se amplía y contrae durante la ejecución del programa, basada en los registros de almacenamiento de datos del programa. Las estructuras dinámicas de datos se pueden dividir en dos grandes grupos: Lineales No lineales • Pilas. • Árboles. • Colas. • Grafos. • Listas enlazadas. Las estructuras dinámicas de datos se utilizan para almacenamiento de datos del mundo real, que están cambiando constantemente. Un ejemplo típico, es la lista de pasajeros de una línea aérea. Si esta lista se mantuviera en orden alfabético en un arreglo, sería necesario hacer espacio para insertar un nuevo pasajero por orden alfabético. Esto requiere utilizar un ciclo para copiar los datos del registro de cada pasajero al siguiente elemento del arreglo. Si en su lugar se utilizará una estructura dinámica de datos, los nuevos datos del pasajero se pueden insertar simplemente entre dos registros existentes con un mínimo de esfuerzo. Listas. Una lista lineal es un conjunto de elementos de un tipo dado que se encuentran ordenados y pueden variar en número. Los elementos de una lista lineal se almacenan normalmente contiguos en posiciones consecutivas de la memoria. Las sucesivas entradas en una guía o directorio telefónico, por ejemplo, están en líneas sucesivas, excepto en las partes superior e inferior de cada columna. Una lista lineal se almacena en la memoria principal de una computadora en posiciones sucesivas de memoria; cuando se almacenan en cinta magnética, los elementos sucesivos se presentan en sucesión en la cinta. Esta sucesión se denomina almacenamiento secuencial. Las líneas así definidas se denominan contiguas. Las operaciones que se pueden realizar con listas lineales contiguas son: 1. Insertar, eliminar o localizar un elemento. 2. Determinar el tamaño de la lista (número de elementos). 3. Recorrer la lista para localizar un determinado elemento. 4. Clasificar los elementos de la lista en orden ascendente o descendente. 5. Unir dos o más listas en una sola. 6. Dividir una lista en varias sublistas. 7. Copiar una lista. 8. Borrar una lista. Una lista lineal se almacena en la memoria de la computadora en posiciones sucesivas o adyacentes y se procesa como un arreglo unidimensional. En este caso, el acceso a cualquier elemento de la lista y la adición de nuevos elementos es fácil; Sin embargo la inserción o borrado requiere un desplazamiento de lugar de los elementos que le siguen y, en consecuencia un diseño de algoritmo especifico. Listas encadenadas. Gilbert y Sullivan, Ruddigore. Una lista enlazada o encadenada es un conjunto de elementos en los que cada elemento contiene la posición o dirección del siguiente elemento de la lista. Cada elemento de la lista encadenada debe tener al menos dos campos: Un campo que tiene el valor del elemento y un campo (enlace o link) que contiene la posición del siguiente elemento, es decir, su conexión, enlace o encadenamiento. Los elementos de una lista son enlazados por medio de los campos enlaces. Las listas encadenadas tienen una terminología propia que se suele utilizar normalmente. Primero, los valores se almacenan en un nodo. Dato Enlace (Valor Elemento) LISTA 5 4 1 8 9 7 4 Los componentes de un nodo se llaman campos. Un nodo tienen al menos un campo de dato o valor y un enlace (indicador o puntero) con el siguiente campo. El campo enlace apunta (proporciona la dirección de) al siguiente nodo de la lista. El ultimo nodo de la lista encadenada, por convenio, se suele representar por un enlace con la palabra nil (nulo), una barra inclinada, y en ocasiones, el símbolo eléctrico de tierra o masa. 4 4 nil 4 Una lista enlazada o encadenada es una lista que se construye empleando apuntadores. Además, no tiene un tamaño fijo, sino que puede crecer y decrecer durante la ejecución del programa. Se constituyen como variables dinámicas. En las listas enlazadas no es necesario que los elementos en la lista sean almacenados en posiciones físicas adyacentes, ya que el apuntador indica dónde se encuentra el siguiente elemento de la lista. Por consiguiente, la inserción y borrado no exigen desplazamiento como en el caso de las listas contiguas. PRIMERO INFO SIG INFO INFO SIG INFO SIG SIG NULO Para eliminar un elemento de una lista enlazada, solo es necesario cambiar el puntero del elemento anterior al elemento siguiente del que deseamos eliminar. Para insertar un elemento en determinada posición, solo necesitamos cambiar el apuntador de la posición anterior a donde queremos insertar a nuestro nuevo elemento y este elemento deberá direccionar el elemento al que anteriormente apuntaba el elemento que quedo antes del nuevo elemento. Una lista enlazada sin ningún elemento se llama lista vacía. Su puntero inicial o de cabecera tiene el valor nulo (nil). Una lista enlazada se puede definir por: • El tipo de sus elementos: campo de información (datos) y campo enlace (puntero). • Un puntero de cabecera que permite acceder al primer elemento de la lista. • Un medio para detectar el ultimo elemento de la lista: puntero nulo (nil). Las operaciones que hay que realizar con una lista enlazada son: 1. Definir y crear los nodos. 2. Definir la cabecera (o inicio) de la lista. 3. Recorrer los nodos de una lista enlazada. 4. Agregar un nodo a la lista. a. Al final. b. Al Principio. c. En el centro. 5. Eliminar un nodo de la lista. a. Al final. b. Al Principio. c. En el centro. Pilas Es una estructura de datos especial en donde la insercion y el borrado de los nuevos elementos se realiza sólo por un extremo que se denomina cima o tope. Esta estructura posee numerosas analogias en la vida real, por ejemplo imagine una pila de platos. Dado que las operaciones de insertar y eliminar se realizan por un solo extremo (el superior), los elementos solo pueden eliminarse en orden inverso al que se insertan en la pila. El último elemento qe se pone en la pila es el primero en sacar; dado a esto a estas estrucrutas se les conoce con el nombre de LIFO. Las operaciones que se pueden realizar con una pila son: PUSH (pila, elemento): Introduce un elemento en la pila. Tambien se le conoce como poner o meter. POP (pila): Elimina un elemento de la pila. Tambien se le conoce como sacar o quitar. VACIA(pila): Función booleana que indica si la pila esta vacia o no. Las pilas se pueden implementar por arreglos o bien por punteros siempre y cuando se respete el concepto antes mencionado. Idealmente, una pila puede contener un número ilimitado de elementos y no producir nunca desbordamiento. En la práctica, sin embargo, el espacio de almacenamiento disponible es finito. La codificación de una pila requiere un cierto equilibrio, ya que si la longitud máxima es demasiado grande, se gasta mucha memoria, mientras que un valor pequeño de longitud maxima producira despordamientos frecuentes. Colas (filas) Las colas o filas son otro tipo de estructura lineal de datos, similares a las pilas, diferenciándose de ellas en el modo de insertar ó eliminar elementos. Una cola es una estructura lineal de datos en la que las eliminaciones se realizan al principio de la lista, y las inserciones se realizan por el fina de la misma. En las colas el elemento que entró primero también sale primero, por ello se conocen como estructuras FIFO. Así pues la diferencia con las pilas es solamente el modo de entrada y salida de datos. En la vida real se tienen ejemplos numerosos de colas: la cola de un autobús, la cola de un cine, etc. En todas ellas el primer elemento que llega es el primero que sale. En informática existen también numerosas aplicaciones de colas. Por ejemplo, en un sistema de tiempo compartido suele haber un procesador central y una serie de periféricos compartidos: discos, impresoras, etc. Los recursos se comparten por los diferentes usuarios y se utiliza una cola para almacenar los programas o peticiones de los usuarios que esperan su turno de ejecución. Las colas se pueden representar como estructuras dinámicas de datos o como arreglos. Las operaciones que se pueden realizar con una cola son: 1. Acceder al primer elemento de la cola. 2. Añadir un elemento al final de la cola. 3. Eliminar el primer elemento de la cola. 4. Vaciar la cola. 5. Verificar el estado de la cola.