Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FPII03 Estructuras Lineales de Datos PDF
FPII03 Estructuras Lineales de Datos PDF
Memoria esttica
(Pila)
Memoria esttica
(Pila)
entero: a
Memoria esttica
(Pila)
ptr1
ptr2
Puntero nulo.
Se corresponde a la constante nulo.
Se considera un puntero inicializado
(cmo dar a una variable numrica un
valor 0).
Apunta a una direccin de memoria
nula.
varPuntero
Si varPuntero hace referencia a la zona de memoria a la que apunta,
varPuntero hace referencia al contenido de dicha zona de memoria.
Hay que tener en cuenta que:
varPuntero es una variable de tipo puntero, por lo que slo es posible asignarla
otro puntero (otra variable de tipo puntero, puntero nulo o reservar espacio).
o Los operadores de asignacin o las instrucciones de lectura o escritura no funcionan de
la misma forma para variables de tipo puntero que para otro tipo de variables.
10
Memoria esttica
(Pila)
Memoria dinmica
(montculo)
ptr1
ptr2
reservar(ptr1)
ptr1
5 //Error
escribir(ptr1) //Error
leer(ptr1) //Error
11
Comparacin de variables de
tipo puntero.
Compara si dos punteros
apuntan a la misma direccin
de memoria.
12
Memoria esttica
(Pila)
ptr1
Memoria dinmica
(montculo)
10
10
ptr2
ptr3
liberar(ptr3)
13
14
15
16
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.
17
CARLOS
DANIEL
insertar(v,PEPE,n)
V
ANA
CARLOS
DANIEL
JUANA
JUANA
MANOLO
MANOLO
PEPA
PEPA
RAUL
PEPE
RAUL
V
ANA
V
ANA
CARLOS
CARLOS
DANIEL
DANIEL
JUANA
n=7
n
7
borrar(v,5,n)
JUANA
MANOLO
PEPA
PEPA
PEPE
PEPE
RAUL
RAUL
RAUL
n=8
insertar(v,CARMEN,n)
Error, no se puede
insertar porque el array
est lleno
n=8
n=7
18
19
20
Puntero nulo
21
Pilas
Es un tipo especial de lista.
Estructura lineal de datos compuesta por una secuencia de
elementos en la que las operaciones slo se pueden realizar por uno
de sus extremos llamado cima (tope o top).
Estructuras de tipo LIFO (Last In-First Out).
Simulacin de la recursividad.
En general, cualquier aplicacin en la que se necesite recuperar informacin en
orden inverso a como ha entrado.
22
Pilas (II)
23
Pilas (III)
La estructura de tipo Pila no se considera implementada en
nuestro lenguaje de programacin.
En otros lenguajes, como .NET, existe la clase Stack (pila en ingls)
que implementa pilas e incluye todas las operaciones que se
pueden hacer sobre las pilas.
24
Pilas (IV)
Operaciones primitivas.
Procedimiento PilaNueva(ref pila: p)
Crea un pila sin elementos.
25
La pila est definida por la posicin dnde est el ltimo elemento (la cima).
Este dato es lo nico que necesitamos para trabajar con pilas.
MaxPila
cima
el
Pila
26
Funcin EsPilaVaca,
Devuelve verdad si la pila est vaca.
cima = 0
p
PilaNueva(p)
EsPilaVaca(p)
//Devuelve verdad
27
LUIS
ANA
cima
0
3
1
2
MANOLO
p
Pinsertar(p,MANOLO)
Pinsertar(p,ANA)
Pinsertar(p,LUIS)
28
LUIS
ANA
cima
3
MANOLO
p
Cima(p,nombre)
escribir(nombre)
//Escribe LUIS
29
LUIS
ANA
cima
2
1
MANOLO
p
PBorrar(p)
PBorrar(p)
30
LUIS
ANA
cima
0
MANOLO
p
Pop(p,nombre)
escribir(nombre)
//escribe MANOLO
31
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).
32
Funcin EsPilaVaca
lgico: funcin EsPilaVaca(valor pila:p)
inicio
devolver(p = nulo)
fin_funcin
33
; valor TipoElemento : e)
34
reservar(aux)
aux.sig p
aux.info e
p aux
35
36
PBorrar(p)
Es necesario comprobar si la
pila tiene elementos (p <>
nulo)
p
aux p
ANA
MANOLO
ANA
MANOLO
aux
p p.sig
aux
p
MANOLO
liberar(aux)
aux
37
38
p p.sig
e p.info
liberar(aux)
aux p
p
e
MANOLO
aux
39
Ejemplo 3.1
Utilizando las operaciones primitivas para trabajar con pilas, disee
un procedimiento que devuelva una copia de una pila ya creada.
Es necesario utilizar una pila auxiliar para copiar los elementos en el mismo
orden que la pila original.
40
41
42
43
Colas
Estructura lineal de datos compuesta por un conjunto de elementos
en la que la adicin de nuevos elementos se har por un extremo de
la cola, final (rear), y la salida de elementos por el contrario,
principio (front).
Estructura de datos de tipo FIFO (first in-first out), es decir el
primer elemento en entrar es el primero en salir.
En aplicaciones informticas se utiliza para controlar procesos que
tengan que realizarse en un cierto orden (colas de impresin, colas
de prioridades, etc.)
principio
e0
final
e1
e2
e3
e4
e5
e6
e7
44
Colas (II)
La estructura de tipo Cola no se considera implementada en
nuestro lenguaje de programacin.
En otros lenguajes, como .NET, existe la clase Queue (cola en
ingls) que implementa colas e incluye todas las operaciones que se
pueden hacer sobre las colas.
45
Colas (III)
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.
46
const
MaxCola =
tipos
= TipoElemento
registro = cola
entero : p,f
array[1..MaxCola] de TipoElemento : el
fin_registro
47
CBorrar(c)
c
CInsertar(c,A)
c
A
p
B
p
CInsertar(c,C)
CInsertar(c,D)
...
CInsertar(c.G)
c
B
p
CInsertar(c,B)
c
CInsertar(c,H)
//Error, el array se ha agotado
c
B
p
48
49
50
Funcin EsColaVaca.
c
p
ColaNueva(c)
EsColaVaca(c)
//Devuelve verdad
51
; valor TipoElemento : e)
52
CInsertar(c,ANA)
c
p
reservar(aux)
reservar(aux)
aux
c
p
aux.info e
aux.sig nulo
LUIS
aux.info e
aux.sig nulo
aux
c
p
c.p aux
c.f aux
LUIS
c.f.sig aux
c.f aux
aux
Universidad Pontificia de Salamanca (Campus Madrid)
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2012
53
54
CBorrar(c)
aux c.p
c.p c.p.sig
liberar(aux)
55
56
c
p
e c.p.info
c.p c.p.sig
ANA
e
ANA
c
p
aux
ANA
aux c.p
liberar(aux)
e
ANA
57
Ejemplo 3.2
Utilizando una pila y una cola, realizar una funcin que
reciba una cadena y devuelva el valor lgico verdad, si
es un palndromo.
Si se meten todos los caracteres de la cadena al mismo tiempo
en una pila y en una cola, al sacarlos de las dos estructuras de
datos saldrn en orden inverso: los caracteres de la cola saldrn
del primero al ltimo, los de la pila del ltimo al primero. Si
todos los caracteres son iguales, se tratar de un palndromo.
La funcin longitud(cadena) devuelve el nmero de caracteres
de una cadena.
o Por ejemplo, longitud(hola) devuelve 4.
58
59
Cuenta una leyenda sobre el historiador judio Josephus Flavius que, durante las guerras judeoromanas, 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.
60
Listas enlazadas
Estructura lineal de datos compuesta por un conjunto de nodos que ocupan
posiciones no contiguas de memoria.
Cada nodo contiene la informacin del componente y, al menos, un puntero
que indica la posicin del siguiente nodo.
61
62
63
64
animales
info
sig
TORO
MANUEL
6
3
personas
7
-1
PEPE
PERRO
DELFIN
10
JUANA
-1
-1
10
11
GATO
5
-1
65
animales
info
sig
TORO
MANUEL
6
3
personas
9
-1
1
animales
PERRO
personas
DELFIN
10
JUANA
ANA
10
GATO
11
-1
TORO
MANUEL
PEPE
-1
sig
info
-1
PEPE
PERRO
DELFIN
JUANA
-1
ANA
10
GATO
-1
11
-1
66
tipos
= TipoElemento
puntero_a nodo : Lista
registro = nodo
TipoElemento : info
Lista : sig
fin_registro
67
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
68
Procedimiento LInsertar
procedimiento LInsertar(ref lista : l; valor TipoElemento : e)
var
lista : aux
inicio
reservar(aux)
aux.sig l
aux.info e
l aux
fin_procedimiento
69
70
reservar(aux)
aux.sig l
aux.info e
l aux
71
reservar(aux)
aux.sig l
aux.info e
l aux
72
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
73
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
l
B
74
Procedimiento LSiguiente.
Devuelve la la direccin del siguiente nodo de la lista
procedimiento LSiguiente(valor lista : l; ref lista : siguiente)
inicio
si l = nulo entonces
// Error, la lista est vaca
si_no
siguiente l.sig
fin_si
fin_procedimiento
75
76
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
77
aux l
l l.sig
liberar(aux)
78
aux l
l l.sig
liberar(aux)
79
Ejemplo 3.3
Utilizando las operaciones primitivas para trabajar con
listas, disee las siguientes operaciones bsicas:
a. Un procedimiento que copie una lista.
b. Una funcin que devuelva en nmero de elementos de una
lista.
c. Una funcin lgica que indique si un elemento pertenece a una
lista.
d. Una funcin qu busque un elemento en una lista. Si existe
devolver su direccin, en caso contrario devolver un puntero
nulo.
e. Una funcin que devuelva la direccin del ltimo nodo de la
lista.
f. Un procedimiento que invierta una lista.
80
81
82
83
84
85
86
87
88
89
Leer una cadena carcter a carcter hasta que el usuario pulse la tecla Intro.
Escribir una cadena.
Concatenar dos cadenas.
Comparar dos cadenas. Devolver 0 si son iguales, -1 si la primera cadena es
menor que la segunda o 1 si la primera cadena es mayor que la segunda.
Realizar un procedimiento subcadena que devuelva una subcadena de una
cadena principal a partir de una posicin el nmero de caracteres indicado. Por
ejemplo, si la cadena cad es cocodrilo
90
Listas ordenadas
Si se requiere que los elementos de la lista estn
ordenados por algn criterio, se puede incluir un
procedimiento para insertar un elemento ordenado en la
lista y mejorar el procedimiento de borrar.
Insertar Ordenado.
procedimiento InsertarOrdenado(ref lista : l; valor TipoElemento : e)
var
lista : act,ant
lgico : encontrado
inicio
encontrado falso
act l
91
92
entonces
encontrado verdad
si_no
ant act
act act.sig
fin_si
fin_mientras
si e = act.info entonces
si act = l entonces
LBorrar(l)
si_no
LBorrar(ant.sig)
fin_si
fin_si
fin_prodedimiento
Universidad Pontificia de Salamanca (Campus Madrid)
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2012
93
2.
94
95
Listas circulares
Una lista circular es una lista enlazada en la que el ltimo elemento de
la lista apunta al primer elemento.
miLista
LUIS
ANA
MANOLO
96
97
98
99
100
Listas dobles
Cada elemento tiene un puntero al siguiente elemento y un puntero
al anterior, menos el primero que tiene un puntero anterior nulo y el
ltimo que tiene un puntero siguiente nulo.
La estructura del nodo es distinta.
tipos
registro = nodo
TipoElemento : info
ant,sig : lista
fin_registro
101
102
103
104
105
Otras realizaciones
Los tres modelos anteriores se pueden combinar.
Listas dobles circulares.
Listas dobles con cabecera.
Listas dobles circulares con cabecera.
106
107
108
109
110