Estructuras de Datos Dinámicas Contenido del Tema TT EE M M A A 11 1.1. Introducción a las estructuras de datos dinámicas. 1.2. Tipo Puntero 1.3. Aplicación: Listas enlazadas. Elementos de Programación Introducción a las Estructuras de Datos Dinámicas Problema ¿Qué sucede si a priori no conocemos la cantidad de espacio de almacenamiento que vamos a precisar? Solución Hacer una previsión?? Ejemplo: Tipos TipoPersona TipoPoblacion[1..50] Variables TipoPoblacion poblacion Programación Modular 2 Necesidad de Memoria Dinámicas Ag[1] Nombre1,... Ag[2] Nombre2,... Ag[3] Nombre3,... * Nombre2,... * Nombre1,... Ag[4] Nombre4,... Ag[5] Ag ... Ag[50] Variable estática: Ag [1..50] * Nombre4,... * Nombre3,... * Variable sin nombre (Anónimas) Definición de Puntero ¿Que Es un Puntero? Variable Estática Un puntero es una variable que almacena una dirección de memoria Programación Modular 4 Declaración de Punteros Tipos Tipo *TPtrATipo Variables TPtrATipo ptr Variables Tipo *ptr 1ª FORMA 2ª FORMA Programación Modular 5 Variables Anónimas Variables Z *ptr Dirección de memoria MEMORIA ptr Contenido de la memoria 23423 23419 234343 23420 324237 23421 28 23422 100 23423 Variable Anónima Programación Modular 6 Representació n Gráfica de las Variables Puntero Dirección ptr 23419 23423 Dirección 23423 Variable Anónima 100 1ª Forma (Como aparece en memoria) ptr 100 2ª Forma (Representación Gráfica) Programación Modular 7 Operaciones con Punteros Operación Desreferenciación Comparación Código Significado *ptr Permite acceder a la variable anónima asociada al puntero ptr. ptr1==ptr2 Esta comparación será verdadera cuando ptr1 y ptr2 apunten a la misma dirección de memoria ptr1=ptr2 Asignación ptr=NIL ptr1 pasa a apuntar a la misma variable anónima que ptr2. NIL indica que no apunta a ninguna dir. de memoria Programación Modular 8 Punteros y Creación de Variables Dinámicas Operación Código Creación de una Variable Anónima Destrucción de Variable Anónima una Representación Gráfica ptr Asigna (ptr) ??? ptr Libera (ptr) NIL Programación Modular 9 Operaciones con Punteros Tipos Z* TPtrAZ Variables TPtrAZ ptr1, ptr2, ptr4 Inicio Asigna (ptr1) Asigna (ptr2) ptr3=ptr1 *ptr1=3 *ptr2=3 Libera(ptr3) ptr1=NIL ptr3 ptr2 ??? 3 ptr3, ptr1 ??? 3 ptr1==ptr2 ptr1==ptr2 ptr1==ptr2 ptr1==ptr2 False False False False *ptr1==*ptr2 *ptr1==*ptr2False False True *ptr1==*ptr2 True ptr1==ptr3 ptr1==ptr3 ptr1==ptr3 ptr1==ptr3 True True True True Programación Modular 10 Introducción a las Listas Enlazadas Tipos TNodo *TPuntANodo REGISTRO TNodo TPersona info TPuntANodo sig FIN Variables TPuntANodo Ag Nombre2,... Nombre1,... Ag Nombre4,... Para acceder a los componentes de un registro desde una variable puntero se utiliza 'à' Nombre3,... agàinfo ≡ (*ag).info Ag Nombre1,... Nombre2,... Nombre3,... Nombre4,... Operaciones de Listas Enlazadas q q q q q q Insertar un nodo al principio Eliminar el primer nodo Insertar un nodo en una lista enlazada ordenada Eliminar un nodo en una lista enlazada Eliminar todos los nodos de luna lista enlazada Visualizar una lista Programación Modular 12 Insertar un Nodo al Principio Asigna (ptr) ptr->dato= 5 ptr->sig= lista lista= ptr ptr 5 lista 4 3 8 Programación Modular 13 Eliminar el Primer Nodo ptr = lista lista = lista->sig Libera(ptr) ptr lista 4 3 8 Programación Modular 14 Insertar un Nodo en una Lista Enlazada Ordenada Asigna(nuevo) nuevo->dato = 10 nuevo->sig = NIL BuscarPosicion nuevo->sig =ptr->sig ptr->sig = nuevo nuevo ptr ptr 10 lista 3 6 12 Programación Modular 15 Insertar un Nodo en una Lista Enlazada Ordenada Algoritmo InsertaNuevoNodo( ES TPtrAReg lista;E Z dato) Variables TPtrAReg nuevo,ptr Inicio Asigna(nuevo) nuevo->dato= dato nuevo->sig = NIL SI lista == NIL ENTONCES // Si la lista está vacía lista = nuevo ENOTROCASO SI(nuevo->dato<=lista->dato) ENTONCES //Insert. Princip nuevo->sig= lista lista = nuevo ENOTROCASO ptr = lista // Se busca la posicion MIENTRAS ((ptr->sig != NIL) AND (nuevo->dato >= ptr->sig->dato))HACER ptr = ptr->sig FINMIENTRAS // Insert. Medio o final nuevo->sig = ptr->sig ptr->sig = nuevo; FINSI FINSI Fin Programación Modular 16 Eliminar un Nodo en una Lista Enlazada act = lista ant = NIL MIENTRAS (act->dato != dato) HACER ant = act act = act->sig FINMIENTRAS SI ant = NIL ENTONCES lista = lista->sig dato=6 ENOTROCASO ant->sig = act->sig FINSI Liberar (actual) lista act act 3 6 12 ant Programación Modular 17 Eliminar Todos los Nodos de una Lista Enlazada Algoritmo BorrarLista(ES TPtrAReg lista) Variables TPtrAReg nodoABorrar Inicio MIENTRAS lista != NIL HACER nodoABorrar = lista; lista = lista->sig Libera (nodoABorrar) FINMIENTRAS Fin Programación Modular 18 Visualizar una Lista Algoritmo visualizaLista(E TPtrAReg lista) Variables TPtrAReg recorrer Inicio recorrer = lista MIENTRAS recorrer != NIL HACER Escribir(recorrer->dato); recorrer = recorrer->sig FINMIENTRAS Fin Programación Modular 19 Listas enlazadas circulares q q El campo de enlace del último nodo apunta al primer nodo de la lista, en lugar de tener el valor NIL No existe ni primer ni último nodo. Tenemos un anillo de elementos enlazados unos con otros Programación Modular 20 Listas enlazadas circulares q q Es conveniente, aunque no necesario, tener un enlace (puntero o índice) al último nodo lógico de la lista. Así podemos acceder facilmente a ambos extremos de la misma Una lista circular vacía vendrá representada por un valor NIL o Nulo en p pp Programación Modular 21 Listas enlazadas circulares Algoritmo Imprimir(E TipoLista lista) Variables TipoPuntero ptr Inicio ptr = lista SI (ptr != NIL) ENTONCES REPETIR Escribir(ptr->elemento) ptr = ptr->sig HASTA QUE ptr == lista FINSI Fin Programación Modular 22 Listas doblemente enlazadas q Es una lista enlazada en la que cada nodo tiene al menos tres campos: Ø Ø Ø q q Elemento. El dato de la lista. Enlace al nodo anterior. Enlace al nodo siguiente. Los algoritmos para las operaciones sobre listas doblemente enlazadas son normalmente más complicados. Pueden ser recorridas fácilmente en ambos sentidos. lista Programación Modular 23 Listas doblemente enlazadas q Una lista doblemente enlazada puede modificarse para obtener una estructura circular de la misma lista Programación Modular 24 BIBLIOGRAFIA q q q q Dale, N. y Weems, C. Pascal. Ed. McGraw Hill, 2ª edición, 1989 Helman, P., Veroff, R. y Carrano, F. Intermediate Problem Solving and Data Structures. Walls & Mirrors. Ed. The Benjamin/Cummings Publishing, 2ª edición, 1991. Joyanes Aguilar, L. Fundamentos de Programación. Algoritmos y Estructuras de Datos. Ed. McGraw Hill, 2ª edición, 1996. Tanenbaum, A.M., Augenstein, M.J. Data Structures Using Pascal. Ed. Prentice Hall, 2ª edición, 1986. Programación Modular 25