Estructuras Dinámicas Cambian de tamaño durante la ejecución del programa Es imposible reservar una cantidad fija de espacio de almacenamiento La reservación de memoria y asignación de direcciones se lleva a cabo mediante la asignación dinámica de almacenamiento Uso de apuntadores Estructuras Dinámicas Están compuestas de pequeñas estructuras llamadas nodos o elementos, enlazadas mediante uno o más apuntadores a objetos del mismo tipo nodo DATO DATO DATO DATO DATO Dependiendo del número de apuntadores y de las relaciones entre nodos podemos distinguir varios tipos de estructuras dinámicas 1 Estructuras Dinámicas LISTAS GRAFOS Estructuras Dinámicas ÁRBOLES TABLAS DE HASH . . . . . . 2 Estructuras Dinámicas LISTAS Listas simplemente enlazadas Listas simplemente enlazadas con nodo cabecera Listas circulares doblemente enlazadas con nodo cabecera Listas doblemente enlazadas con nodo cabecera Listas circulares simplemente enlazadas Listas circulares simplemente enlazadas con nodo cabecera Listas circulares doblemente enlazadas Estructuras Dinámicas OPERACIONES SOBRE LISTAS • Insertar o añadir un elemento • Eliminar un elemento • Localizar un elemento 3 Estructuras Dinámicas Listas Simplemente Enlazadas La estructura más simple Conjunto de registros o nodos (no necesariamente adyacentes en memoria) Cada registro contiene un elemento y un apuntador a un registro que contiene su sucesor El apuntador del último registro de la lista contiene el valor nil Se requiere de un apuntador que referencie o apunte al primer elemento de la misma (¡nunca debe perderse!) Estructuras Dinámicas Listas Simplemente Enlazadas L a1 a2 a3 a4 a5 L 458 458 a1 500 500 a2 850 850 a3 350 350 a4 993 933 a5 nil 4 Estructuras Dinámicas Listas Simplemente Enlazadas Lista Vacía L L nil Estructuras Dinámicas Listas Simplemente Enlazadas Declaración Formal Tipo ptr_Nodo = pointer_to_Nodo; Nodo = Tuple elemento: Tipo_info; prox: ptr_Nodo; end; Lista = ptr_Nodo; 5 Estructuras Dinámicas Listas Simplemente Enlazadas Inserción Parámetros: Lista (L) , elemento (e), posición (p) La posición debe ser válida (1 <= p <= (Long(L) + 1) Considerar: Inserción en primera posición, al final de la lista, en lista vacía Procedimiento: Crear el nodo con el elemento Localizar la posición Actualizar los apuntadores involucrados Estructuras Dinámicas Listas Simplemente Enlazadas Inserción L a1 a2 a3 a4 a5 a4 a5 Q ax L a1 Ant Act a2 a3 Q ax 6 Estructuras Dinámicas Listas Simplemente Enlazadas Inserción Proc Insertar(in-out L: Lista; in pos: integer; in e: Tipo_Info) Var Act, Ant, Q: ptr_Nodo; i: integer; begin Act L; i 1; Crear(Q); Q↑.elemento e; while (i < pos) do Ant Act; Act Act↑.prox; i i + 1; end if Act = L then L Q; else Ant↑.prox Q; end Q↑.prox Act; end Estructuras Dinámicas Listas Simplemente Enlazadas Eliminación Parámetros: Lista (L) , elemento (e), posición (p) La posición debe ser válida (1 <= p <= (Long(L)) Considerar: Eliminación en primera posición, al final de la lista Procedimiento: Localizar la posición Actualizar los apuntadores involucrados Liberar el espacio ocupado por el nodo 7 Estructuras Dinámicas Listas Simplemente Enlazadas Eliminación Ant Act L a1 a2 Ant a3 a4 a5 a4 a5 Act L a1 a2 a3 Estructuras Dinámicas Listas Simplemente Enlazadas Eliminación Proc Eliminar (in-out L: Lista; in pos: integer) Var Act, Ant: ptr_Nodo; i: integer; begin Act L; i 1; while (i < pos) do Ant Act; Act Act↑.prox; i i + 1; end if Act = L then L Act↑.prox; else Ant↑.prox Act↑.prox; end Liberar(Act); end 8 Estructuras Dinámicas Listas Simplemente Enlazadas con nodo cabecera El primer nodo de la lista no contiene ningún elemento. La lista está referenciada por el apuntador contenido en el nodo cabecera Por lo general el nodo cabecera es del mismo tipo de los nodos restantes de la lista a pesar de que este no contiene ningún elemento de la misma Estructuras Dinámicas Listas Simplemente Enlazadas con nodo cabecera L nodo cabecera a1 a2 a3 a4 Lista Vacía L nodo cabecera 9 Estructuras Dinámicas Listas Simplemente Enlazadas con nodo cabecera Declaración Formal Type ptr_Nodo = pointer_to Nodo; Nodo = tuple elemento: Tipo_info; prox: ptr_Nodo; end; Lista = ptr_Nodo; Estructuras Dinámicas Listas Simplemente Enlazadas con nodo cabecera Inserción Parámetros: Lista (L) , elemento (e), posición (p) La posición debe ser válida (1 <= p <= (Long(L) + 1) No es necesario considerar a parte la inserción en la primera posición ni en una lista vacía Procedimiento: Crear el nodo con el elemento Localizar la posición Actualizar los apuntadores involucrados 10 Estructuras Dinámicas Listas Simplemente Enlazadas con nodo cabecera Inserción L a1 a2 a5 a6 a3 a4 Q ax L Ant Act a1 a2 Q ax Estructuras Dinámicas Listas Simplemente Enlazadas con nodo cabecera Inserción Proc Insertar (in-out L: Lista; in pos: integer; in e: Tipo_Info) Var Act, Ant, Q: ptr_Nodo; i: integer; begin Act L; i 1; Crear(Q); Q↑.elemento e; while (i < pos) do Ant Act; Act Act↑.prox; i i + 1; end Ant↑.prox Q; Q↑.prox Act; end 11 Estructuras Dinámicas Listas Simplemente Enlazadas con nodo cabecera Eliminación Parámetros: Lista (L) , elemento (e), posición (p) La posición debe ser válida (1 <= p <= (Long(L)) No es necesario considerar a parte la eliminación del primer elemento de la lista Procedimiento: Localizar la posición Actualizar los apuntadores involucrados Liberar el espacio ocupado por el nodo Estructuras Dinámicas Listas Simplemente Enlazadas con nodo cabecera Eliminación Ant Act L a1 Ant a2 a3 a4 a3 a4 Act L a1 a2 12 Estructuras Dinámicas Listas Simplemente Enlazadas con nodo cabecera Eliminación Proc Eliminar (in-out L: Lista; in pos: integer) Var Act, Ant: ptr_Nodo; i: integer; Begin Act L; i 1; while (i < pos) do Ant Act; Act Act↑.prox; i i + 1; end Ant↑.prox Act↑.prox; Liberar(Act); end Estructuras Dinámicas Listas Simplemente Enlazadas con nodo cabecera Localizar Func Localizar(L: Lista; e: Tipo_Info): integer Var Act: ptr_Nodo; i, res: integer; begin Act L↑.prox; i 1; while (Act ≠ nil ∧ Act↑.info ≠ e) do Act Act↑.prox; i i + 1; end if Act = nil then res -1; else res i; end return (res); end 13