Punteros
Introducción a estructuras
dinámicas
! Ejemplo sencillo:
variables
x, y ∈ a entero
pa, pb ∈ puntero a entero
inicio
x " 1
y " 2
crear(pa)
↑ " 10
pa↑
pb " pa
escribir x + y
↑ + pb↑
escribir pa↑ ↑
destruir (pa)
fin 6
Punteros y estructuras dinámicas. Punteros (v)
Variables del inicio
Variables del crear(pa)
algoritmo x " 1 algoritmo pa↑ " 10
y " 2
pa
pa
pb " pa
pb
pb
x
x 1
y y 2
pb pb
x 1 x 1
y 2 y 2
pb
y 2
pa 10 ↑ " 10
pa↑
pa " NIL
Si en el algoritmo anterior se pb
sustituye la sentencia
x 1
y 2
se tendría...
y 2
Referencias
Puntero
12
Punteros y estructuras dinámicas. “Punteros” FORTRAN (i)
14
Punteros y estructuras dinámicas. “Punteros” FORTRAN (iii)
! Ejemplo sencillo:
program programa
implicit none
integer, pointer :: pa,pb
integer x,y
x=1
y=2
allocate(pa)
pa = 10
pb => pa
print *, x + y
print *, pa + pb
deallocate(pa)
end 15
Ejemplo algorítmico:
tipos
cliente = tupla
nombre ∈ carácter
siguientecliente ∈ puntero a cliente
fin tupla
variables
colaSuper ∈ puntero a cliente
nombre ∈ carácter
inicio
colaSuper " NIL
mientras nombre ≠ ‘.’ hacer
escribir ‘Deme su nombre (pulse . para finalizar):’
leer nombre
si nombre ≠ ‘.’ entonces
ponerseCola (nombre, colaSuper)
fin si
fin mientras 17
18
Punteros y estructuras dinámicas. Estructura Dinámica (iii)
carácter funcion atenderCliente (cola ∈ puntero a cliente)
variables
cursor ∈ puntero a cliente
inicio
si cola = NIL entonces
atenderCliente " ‘’
si no
↑.siguienteCliente
cursor = cola↑
atenderCliente " cola↑↑.nombre
destruir (cola)
cola " cursor
fin si
fin funcion
fin
19
! Se inicializa la cola
!
nullify (colaSuper)
20
Punteros y estructuras dinámicas. Estructura Dinámica (v)
do while (nombre/='.')
print *, 'Deme su nombre (pulse . para finalizar):'
read *, nombre
if (nombre/='.') then
call ponerseCola (nombre, colaSuper)
end if
end do
do while (nombre/='')
nombre = atenderCliente (colaSuper)
print *, nombre
end dO
21
character*64, nombreCliente
type(cliente), pointer :: cola
if (.not.associated(cola)) then
allocate(cola)
cola%nombre=nombreCliente
nullify(cola%siguienteCliente)
else
call ponerseCola (nombreCliente, cola%siguienteCliente)
end if
end subroutine ponerseCola
22
Punteros y estructuras dinámicas. Estructura Dinámica (vii)
! Función que retorna el nombre del primer cliente y lo elimina de la cola
!
character*64 function atenderCliente (cola)
implicit none
if (.not.associated(cola)) then
atenderCliente = ''
else
cursor => cola%siguienteCliente
atenderCliente = cola%nombre
deallocate(cola)
cola => cursor
end if
end function atenderCliente
end
23
25