ptr.

Anuncio
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
Descargar