Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FPII03 Estructuras Lineales de Datos PDF
FPII03 Estructuras Lineales de Datos PDF
Dato esttico.
Dato que no puede variar su ubicacin a lo
largo de la ejecucin del programa.
Se reserva espacio en tiempo de Memoria esttica Memoria esttica
(Pila) (Pila)
compilacin.
Cuando el programa empieza su ejecucin
es necesario saber de antemano su a a 5
tamao y ubicacin en la memoria.
Se almacena en una zona de memoria
esttica: pila.
El dato se identifica por una variable que no
es ms que una direccin de memoria
dnde est almacenada la informacin.
Cuando se asigna un valor a ese dato, se
almacena directamente en esa direccin de
memoria. entero: a a 5
Cuando se accede a ese dato, por ejemplo
al ejecutar la instruccin escribir(a), se
accede de forma directa al contenido de esa
direccin de memoria.
Dato dinmico.
Realiza una asignacin dinmica de memoria.
Reserva espacio para almacenar la informacin en tiempo de ejecucin.
Cuando el programa comienza su ejecucin, slo se reserva espacio
para almacenar una referencia a la posicin donde se almacenar el
dato, no para almacenar el dato en s.
La variable que guarda la direccin de memoria (la referencia) es el
puntero.
El puntero se almacena en la pila.
Durante la ejecucin del programa es posible reservar memoria
para el dato al que apunta el puntero.
El dato en s se almacena en una zona de memoria dinmica: el
montculo.
En cualquier momento se puede reservar o liberar ese espacio.
Definicin de un puntero.
puntero_a tipoDato : varPuntero
tipoDato, cualquier tipo de dato
Memoria esttica
estndar o definido por el usuario. (Pila)
Al arrancar el programa la variable de
a 5
tipo puntero no est inicializada (no
tiene ningn valor). ptr1
Slo es posible darle valor asignndola ptr2
a otro puntero, reservando espacio en
memoria o asignndola a puntero
nulo.
Puntero nulo.
Se corresponde a la constante nulo.
Se considera un puntero inicializado puntero_a entero : ptr1
(cmo dar a una variable numrica un puntero_a entero : ptr2
valor 0).
Apunta a una direccin de memoria
nula.
a 5
ptr1
ptr2
reservar(ptr1)
ptr1 5 //Error
escribir(ptr1) //Error
leer(ptr1) //Error
Liberar espacio de
almacenamiento.
liberar(varPuntero)
Deja libre la posicin de
memoria, volvindola a
marcar como zona libre.
El puntero que apuntaba la
posicin queda indeterminado. Memoria esttica Memoria dinmica
(Pila) (montculo)
No es posible recuperar la a 5 10
informacin a la que apuntaba ptr1 10
el puntero. ptr2
liberar(ptr3)
Listas contiguas.
Los elementos ocupan posiciones contiguas de memoria.
Se pueden implementar con arrays.
Los elementos ocuparan posiciones correlativas del array.
Presentan dos problemas:
o La insercin o el borrado de elementos implica mover las posiciones
para mantener el orden original.
o El nmero de elementos de la lista se puede modificar, pero no puede
sobrepasar el tamao mximo del array.
array[1..8] de cadena : v
V V
1 ANA 1 ANA
2 CARLOS 2 CARLOS
3 DANIEL 3 DANIEL Error, no se puede
4 JUANA insertar(v,PEPE,n) 4 JUANA insertar(v,CARMEN,n) insertar porque el array
est lleno
5 MANOLO 5 MANOLO
6 PEPA 6 PEPA
7 RAUL n=7
n 7 7 PEPE
8 8 RAUL n=8
V V
1 ANA 1 ANA
2 CARLOS 2 CARLOS
3 DANIEL 3 DANIEL
4 JUANA borrar(v,5,n) 4 JUANA
5 MANOLO 5 PEPA
6 PEPA 6 PEPE
7 PEPE 7 RAUL n=7
Listas enlazadas.
Los elementos no ocupan posiciones contiguas de memoria.
Aparecen dispersos por el almacenamiento.
Cada elemento contiene una referencia al siguiente elemento de la
estructura.
El orden lgico lo darn los enlaces que hay entre elementos.
El primer elemento en el orden lgico no tiene por qu
corresponderse con el primer elemento almacenado.
El necesario indicar cul es el primer elemento en el orden lgico.
Tambin es necesario indicar cual ser el ltimo elemento en el
orden lgico de la estructura.
La insercin o eliminacin de elementos no implica mover los
elementos de sitio.
Slo se modifican las referencias al siguiente elemento.
Si se utilizan estructuras de datos dinmicas el nmero de
elementos ser virtualmente ilimitado.
Puntero nulo
Operaciones primitivas.
Procedimiento PilaNueva(ref pila: p)
Crea un pila sin elementos.
Funcin lgica EsPilaVaca(valor pila: p).
Devuelve verdad si la pila est vaca.
Procedimiento PInsertar (ref pila:p; valor TipoElemento:e)
o Push(ref pila : p; valor TipoElemento: e).
Inserta un elemento e en la pila y devuelve la pila resultante.
TipoElemento es un tipo de dato genrico que se corresponde al tipo de dato
de los elementos que contendr la pila.
Procedimiento Cima(valor pila: p; ref TipoElemento : e).
Devuelve en el argumento e el elemento situado en la cima de la pila.
Procedimiento PBorrar(ref pila : p).
Elimina el elemento cima de la pila y devuelve la pila resultante.
Procedimiento Pop(ref pila : p; ref TipoElemento : e) o
Sacar(ref pila : p; ref TipoElemento : e).
Elimina un elemento de la cima de la pila, devolviendo la pila resultante y el
elemento extrado.
const
MaxPila =
tipos
= TipoElemento
registro = Pila cima
entero : cima
array[1..MaxPila] de TipoElemento : el
fin_registro el
Pila
Universidad Pontificia de Salamanca (Campus Madrid)
26
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2012
Realizaciones mediante arrays (II)
Procedimiento PilaNueva.
Se limita a inicializar la cima de la pila a 0.
Funcin EsPilaVaca,
Devuelve verdad si la pila est vaca.
Procedimiento PInsertar
Inserta en la posicin cima un elemento de TipoElemento.
En la implementacin con arrays, es necesario comprobar si la pila est
llena (si cima=MaxPila).
Procedimiento Cima
Devuelve el dato de TipoElemento situado en la posicin cima.
Es necesario comprobar si la pila contiene elementos (si cima <> 0).
Procedimiento PBorrar
Elimina el elemento cima de la pila
Es necesario comprobar si la pila contiene elementos (si cima <> 0).
La pila est definida por la posicin del primer elemento que ser por
dnde hay que insertar y eliminar informacin.
No es necesario definir el almacenamiento como ocurra con los arrays:
Los nodos se almacenan dispersos por el montculo (memoria dinmica).
El dato que define la pila ser ese puntero.
tipos
= TipoElemento
puntero_a nodo = pila
registro = nodo
TipoElemento : info
puntero_a nodo : sig
fin_registro
Procedimiento PilaNueva
procedimiento PilaNueva(ref pila : p)
inicio
p nulo
fin_procedimiento
Funcin EsPilaVaca
lgico: funcin EsPilaVaca(valor pila:p)
inicio
devolver(p = nulo)
fin_funcin
Procedimiento PInsertar
No es necesario comprobar si hay espacio suficiente para almacenar el
elemento.
Se supone que en el montculo (memoria dinmica) siempre habr espacio.
reservar(aux)
aux.sig p
aux.info e
p aux
Procedimiento Cima
Es necesario comprobar si la pila tiene elementos (p <> nulo)
Es necesario comprobar si la
pila tiene elementos (p <>
nulo)
p
var
aux
pila : aux
inicio
si EsPilaVaca(p) entonces p
// error, la pila est vaca p p.sig ANA MANOLO
si_no
aux p aux
p p.sig
liberar(aux) p
fin_si
fin_procedimiento liberar(aux) MANOLO
aux
p p.sig
e p.info
liberar(aux)
p
aux p
e
MANOLO
aux
Versin iterativa.
Versin recursiva.
procedimiento CopiarPila(ref pila : p,copia)
var
TipoElemento : e
inicio
//Si p est vaca estaramos en el caso trivial
//Si p est vaca, la copia tambin es una pila vaca
si EsPilaVaca(p) entonces
PilaNueva(copia)
si_no
Pop(p,e)
CopiarPila(p,copia)
PInsertar(copia,e)
Pinsertar(p,e)
fin_si
fin_procedimiento
principio final
e0 e1 e2 e3 e4 e5 e6 e7
Operaciones primitivas.
ColaNueva(ref cola: c), inicializa una nueva cola.
EsColaVaca(valor cola :c), una funcin lgica que
devuelve verdad si la cola est vaca.
CInsertar(ref cola : c; valor tipoElemento: e),
inserta un elemento de tipo TipoElemento en la cola en la
posicin final.
CBorrar(ref cola : c), elimina el elemento principio
de la cola.
Primero(valor cola : c; ref tipoElemento : e),
obtiene el valor del elemento situado en la posicin principio
de la cola.
Sacar(ref cola : c; ref tipoElemento : e), elimina
el primer elemento de la cola devolviendo su contenido en e.
const
MaxCola =
tipos
= TipoElemento
registro = cola
entero : p,f
array[1..MaxCola] de TipoElemento : el
fin_registro
ColaNueva(c) CBorrar(c)
c B
p 2
f 2
CInsertar(c,C)
CInsertar(c,D)
CInsertar(c,A)
...
c A CInsertar(c.G)
p 1 c B C D E F G
f 1 p 2
f 7
CInsertar(c,B)
CInsertar(c,H)
c A B
//Error, el array se ha agotado
p 1
c B C D E F G
f 2
p 2
f 7
tipos
= TipoElemento
registro : cola
puntero_a nodo : p,f
fin_registro
registro = nodo
TipoElemento : info
puntero_a nodo : sig
fin_registro
Procedimiento ColaNueva.
procedimiento ColaNueva(ref cola : c)
inicio c
c.p nulo p f
//c.f nulo //No sera necesario
fin_procedimiento ColaNueva(c)
EsColaVaca(c)
Funcin EsColaVaca. //Devuelve verdad
lgico: funcin EsColaVaca(valor cola : c)
inicio
devolver(c.p = nulo) //o (c.f = nulo)
fin_funcin
Procedimiento CInsertar
No es necesario comprobar si hay espacio suficiente para almacenar el elemento.
Se supone que, con estructuras dinmicas, el espacio es ilimitado
Hay que comprobar si es el primer elemento de la cola.
Si es cierto, el frente de la cola tambin debe apuntar a ese elemento.
Si no, el ltimo elemento deber apuntar al nuevo elemento.
c
p f
reservar(aux) reservar(aux)
aux
c
p f
aux.info e aux.info e
LUIS
aux.sig nulo aux.sig nulo
aux
c
p f
c.p aux c.f.sig aux
LUIS
c.f aux c.f aux
aux
Procedimiento Primero
Es necesario comprobar si la pila tiene elementos (c.p <> nulo)
liberar(aux)
Procedimiento Sacar.
Combina los procedimientos CBorrar y Primero.
c
p f
e
ANA
c
p f aux
1. El problema de Josephus.
Cuenta una leyenda sobre el historiador judio Josephus Flavius que, durante las guerras judeo-
romanas, l y otros 40 soldados judos quedaron atrapados en una cueva rodeados por los
romanos. Visto que tenan pocas posibilidades de salir con vida, decidieron suicidarse. Josephus y
un amigo suyo no estaban muy felices con esa idea. As pues, propusieron que si haba que
hacerlo, se hiciera con cierto orden: se colocaran en crculo y se iran suicidando por turno cada
tres empezando a contar por uno determinado. Josephus y su amigo se colocaron de tal forma que
fueron los dos ltimos y decidieron seguir viviendo.
Realizar un algoritmo que devuelva el orden en que salieron los soldados. El nmero de soldados
ser m y el salto ser n.
2. Se tiene una cola de procesos. Cada elemento contiene la prioridad (de 1 a 20) y un
identificador de proceso nico. Se desea hacer un listado con el orden de salida de los
procesos.
3. Se tiene una cola de procesos. Cada elemento contiene la prioridad (de 1 a 20) y un
identificador de proceso nico. Se desea hacer un listado con el orden de salida de los
procesos con prioridad p.
4. Se tiene una cola de procesos. Cada elemento contiene informacin sobre el identificador
de proceso nico y su prioridad (de 1 a 20). Los elementos de la cola estn ordenados por
prioridad. Disear un procedimiento que permita ordenar un nuevo proceso en la cola.
miLista
C F M S V
Operaciones primitivas.
ListaNueva(ref lista:l), convierte la lista l en una lista
vaca.
EsListaVaca(valor lista:l), devuelve verdad si la lista l
est vaca.
LInsertar(ref lista:l;valor tipoElemento:e),,
inserta el elemento e en la lista l.
LBorrar(ref lista:l), elimina un elemento de la lista l.
LPrimero(valor lista:l; ref tipoElemento : e),
devuelve la informacin del primer elemento de la lista en el
argumento e.
LSiguiente(valor lista:l; ref lista:sig), devuelve
la direccin del siguiente nodo de la lista en el argumento sig.
estructura. 11 -1
info sig
info sig
1 TORO 0
1 TORO 0
animales
2 MANUEL 4 animales
6 2 MANUEL 4
6
3 -1
1
3 -1
4 PEPE 0
4 PEPE 0
personas 5 PERRO 1 personas 5 PERRO 1
9
6 DELFIN 10 9
6 DELFIN 5
7 JUANA 2
7 JUANA 2
8 -1
8 -1
9 ANA 7
9 ANA 7
10 GATO 5
10 GATO -1
11 -1
11 -1
tipos
= TipoElemento
puntero_a nodo : Lista
registro = nodo
TipoElemento : info
Lista : sig
fin_registro
Procedimiento ListaNueva
procedimiento ListaNueva(ref lista : l)
inicio
l nulo
fin_procedimiento
Funcin EsListaVaca
lgico funcin EsListaVaca(valor lista : l)
inicio
devolver(l = nulo)
fin_funcin
Procedimiento LInsertar
LInsertar(l,B)
reservar(aux)
aux.sig l
aux.info e
l aux
LInsertar(l.sig.sig,E)
reservar(aux)
aux.sig l
aux.info e
l aux
Procedimiento LPrimero.
Devuelve la informacin del primer elemento de la lista.
procedimiento LPrimero(valor lista : l; ref TipoElemento : e)
inicio
si l = nulo entonces
// Error, la lista est vaca
si_no
e l.info
fin_si
fin_procedimiento
LPrimero(l,e)
escribir(e) //Escribe B
LPrimero(l.sig,e)
escribir(e) //Escribe C
LPrimero(l.sig.sig.sig,e)
escribir(e) //Escribe F
B C E F M
Procedimiento LSiguiente.
Devuelve la la direccin del siguiente nodo de la lista
Recorrido de la lista.
Se utiliza una combinacin de los procedimiento LPrimero y
LSiguiente .
var
lista : aux
TipoElemento : e
...
aux miLista
mientras no EsListaVaca(aux) hacer
LPrimero(aux,e)
escribir(e)
LSiguiente(aux,aux)
fin_mientras
Procedimiento LBorrar
Elimina el elemento al que apunta la lista pasada como argumento.
procedimiento LBorrar(ref lista : l)
var
lista : aux
inicio
si EsListaVaca(l) entonces
// error, la lista est vaca
si_no
aux l
l l.sig
liberar(aux)
fin_si
fin_procedimiento
LBorrar(l)
aux l
l l.sig
liberar(aux)
LBorrar(l.sig)
aux l
l l.sig
liberar(aux)
Las primitivas para crear una lista, para ver si est vaca, y para insertar
al principio o inserta y borrar por el centro no varan.
Para insertar al final.
tipos
registro = nodo
TipoElemento : info
ant,sig : lista
fin_registro
Se puede hacer otra versin pasando simplemente la posicin del nodo anterior
o nulo si se quiere insertar el primer nodo de la estructura.
procedimiento LDInsertar(ref lista:anterior; valor TipoElemento:e)
var
lista : aux
inicio
reservar(aux)
aux.info e
si anterior = nulo entonces //Est vaca
aux.sig nulo
aux.ant nulo
anterior aux
si_no
si anterior.ant = nulo entonces //Queremos insertar al comienzo
aux.sig anterior
aux.ant nulo
anterior.ant aux
anterior aux
si_no
aux.sig anterior.sig
aux.ant anterior
si aux.sig <> nulo entonces //no es el ltimo elemento
aux.sig.ant aux
fin_si
anterior.sig aux
fin_si
fin_si
fin_procedimiento