Gestión Dinámica de Memoria. El Tipo Puntero Contenido del Tema T E M A 4.1. Introducción 4.2. El tipo puntero 4.3. Operaciones con punteros. 4.4. Concepto de lista enlazada. 4.5. Operaciones básicas sobre listas enlazadas. 4.6. Otras clases de listas enlazadas. 4 Metodología de Programación Introducción: Estructuras de Datos Dinámicas • Variables estáticas: – Se conoce su nombre. – Se conoce cuando empieza/acaba su existencia. – Se conoce el espacio que ocupan en memoria. Metodología de Programación 1 Introducción: 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 TipoPoblacion = ARRAY [1..50] DE TipoPersona VARIABLES poblacion : TipoPoblacion Metodología de Programación Introducción: Estructuras de Datos Dinámicas • Variables anónimas: – No se conoce su nombre. – No se conoce el momento en que empieza/acaba su existencia. – El espacio que van a ocupar en memoria es variable. Metodología de Programación 2 El Tipo Puntero ¿Que Es un Puntero? Variable Estática Un puntero es una variable que almacena una dirección de memoria Metodología de Programación Declaración de Punteros TIPOS PtrATipo =PUNTERO A Tipo VARIABLES ptr: PtrATipo VARIABLES ptr: PUNTERO A Tipo Metodología de Programación 3 Variables Anónimas VARIABLES ptr : PUNTERO A ENTERO de MEMORIA 23423 23419 ptr 234343 23420 " # $ % ! $ & ! ' ( 324237 23421 28 23422 # 100 23423 Variable Anónima Metodología de Programación Representación Gráfica de las Variables Puntero Dirección 23419 Dirección ptr 23423 23423 Variable Anónima 100 1ª Forma ptr 100 2ª Forma Metodología de Programación 4 Punteros y Creación de Variables Dinámicas Inicialización de Punteros: ptr ← NULO ptr Creación de una Variable Anónima: ptr ← NUEVO(Tipo) ptr ?? Destrucción de una Variable Anónima: ptr ELIMINAR(ptr) Metodología de Programación Operaciones con Punteros Dereferenciación: ptr^ Comparación: ptr1 = ptr2 Asignación: ptr1 ← ptr2 Ejemplo: Ptr1 ← NUEVO(ENTERO) Escribir(ptr1^) ?? ptr1^ ← 3 Escribir(ptr2^) ?? ptr2 ← ptr1 ptr2^ ← 1000 Metodología de Programación 5 Ejemplo: Cadena de Caracteres Dinámica TIPOS Tlista INFO VARIABLES = PUNTERO A INFO = REGISTRO dato : CARÁCTER sig : Tlista FINREGISTRO Primero: Tlista Gráficamente: Primero “H” “o” “l” “a” Metodología de Programación Ejemplo: Cadena de Caracteres Dinámica FUNC CrearLista():Tlista CONSTANTES RETORNO = CHR(13) VARIABLES car : CARÁCTER primero, ptr : Tlista INICIO Leer(car) SI (car = RETORNO) ENTONCES primero ← NULO ENOTROCASO primero ← NUEVO(INFO) primero^.dato ← car ptr ← primero Leer(car) MIENTRAS (car ≠ RETORNO) HACER ptr^.sig ← NUEVO(INFO) ptr ← ptr^.sig ptr^.dato ← car Leer(car) FINMIENTRAS ptr^.sig ← NULO FINSI RESULTADO ← primero FIN Metodología de Programación 6 Operaciones sobre Listas Enlazadas INICIALIZACION ) * + + , - . * lista lista ← NULO / 0 0 1 2 3 4 lista lista ← NUEVO(INFO) ?? lista ← NULO lista ?? Metodología de Programación Visualizar una Lista PROC visualizaLista(↓lista: Tlista) VARIABLES recorrer : Tlista INICIO recorrer ← lista MIENTRAS (recorrer ≠ NULO) HACER Escribir(recorrer^.dato) recorrer ← recorrer^.sig FINMIENTRAS FIN Metodología de Programación 7 Insertar un Nodo al Principio Suponiendo: lista 3 2 9 1.- ptr ← NUEVO(INFO) ptr ?? ?? Metodología de Programación Insertar un Nodo al Principio 2.- ptr^.dato ← 5 ptr 5 ?? 3.- ptr^.sig ← lista lista 3 2 9 ptr 5 Metodología de Programación 8 Insertar un Nodo al Principio 4.- lista ← ptr lista 3 2 9 ptr 5 Metodología de Programación Eliminar el Primer Nodo Suponiendo: lista 3 2 9 1.- ptr ← lista lista 3 2 9 ptr Metodología de Programación 9 Eliminar el Primer Nodo 2.- lista ← lista^.sig lista 3 2 9 ptr 3.- ELIMINAR(ptr) lista 2 9 ptr Metodología de Programación Insertar un Nodo en una Lista Enlazada Ordenada Partimos de la lista: Queremos insertar el número: 15 lista 2 9 19 1.- nuevoNodo ← NUEVO(INFO) nuevoNodo ?? ?? Metodología de Programación 10 Insertar un Nodo en una Lista Enlazada Ordenada 2.- nuevoNodo^.dato ← 15 nuevoNodo^.sig ← NULO nuevoNodo 15 3.- Algoritmo que inserta el nodo en la posición correcta. Metodología de Programación Insertar un Nodo en una Lista Enlazada Ordenada PROC InsertaNuevoNodo( ↓↑ lista: Tlista; ↓ dato: ENTERO) VARIABLES ENOTROCASO nuevoNodo : Tlista buscaPosicion ← lista MIENTRAS (buscaPosicion^.sig ≠ NULO) buscaPosicion: Tlista ∧ (nuevoNodo^.dato >= INICIO buscaPosicion^.sig^.dato)) HACER nuevoNodo ← NUEVO(INFO) buscaPosicion ← buscaPosicion^.sig nuevoNodo^.dato ← dato FINMIENTRAS nuevoNodo^.sig ← NULO nuevoNodo^.sig ← buscaPosicion^.sig SI (lista = NULO) ENTONCES buscaPosicion^.sig ← nuevoNodo; /* Si la lista está vacía */ FINSI lista ← nuevoNodo FINSI ENOTROCASO FIN SI (nuevoNodo^.dato <= lista^.dato) ENTONCES nuevoNodo^.sig ← lista lista ←nuevoNodo Metodología de Programación 11 Insertar un Nodo en una Lista Enlazada Ordenada Gráficamente: buscaPosicion lista 2 9 19 nuevoNodo 15 Metodología de Programación Eliminar un Nodo de una Lista Enlazada Suponiendo: lista 2 1.- actual anterior 6 9 Queremos borrar el número: 6 Supondremos que está en la lista. ← lista ← NULO lista 2 actual 6 anterior 9 Metodología de Programación 12 Eliminar un Nodo de una Lista Enlazada 2.- Búsqueda del nodo a borrar. MIENTRAS (actual^.dato ≠ dato) HACER anterior ← actual actual ← actual^.sig FINMIENTRAS lista 2 6 anterior 9 actual Metodología de Programación Eliminar un Nodo de una Lista Enlazada 3.- Actualizar los punteros SI (anterior = NULO) ENTONCES lista ← lista^.sig ENOTROCASO anterior^.sig ← actual^.sig FINSI actual 6 lista 2 anterior 9 Metodología de Programación 13 Eliminar un Nodo de una Lista Enlazada 4.- ELIMINAR(actual) actual lista 2 9 anterior Metodología de Programación Eliminar Todos los Nodos de una Lista Enlazada PROC borrarLista(↓↑ lista: Tlista) VARIABLES nodoABorrar: Tlista INICIO MIENTRAS (lista ≠ NULO) HACER nodoABorrar ← lista lista ← lista^.sig ELIMINAR(nodoABorrar) FINMIENTRAS FIN Metodología de Programación 14 BIBLIOGRAFIA • Pascal. Dale/Orshalick. Ed. McGraw Hill 1986 • Programación I. José A. Cerrada y Manuel Collado. U.N.E.D. 1993. • Fundamentos de Programación. Joyanes Aguilar. McGraw Hill. 1988. • Programación en C++. Algoritmos, estructuras de datos y objetos. Joyanes, Aguilar. McGraw Hill, 2000 5 Metodología de Programación 15