Professional Documents
Culture Documents
UNIDAD III
Estructuras Estticas y Dinmicas
3.1 Pila
3.2 Colas
3.3 Listas Enlazadas
Las pilas son estructuras de datos lineales, como los arreglos, ya que los
componentes ocupan lugares sucesivos en la estructura y cada uno de ellos tiene
un nico sucesor y un nico predecesor, con excepcin del ltimo y del primero,
respectivamente. Una pila se define formalmente como una coleccin de datos a
25
ESTRUCTURA DE DATOS
los cuales se puede acceder mediante un extremo,que se conoce generalmente
como tope.
Representacin de pilas
Arreglos
Listas
25
ESTRUCTURA DE DATOS
25
ESTRUCTURA DE DATOS
Si la pila estuviera llena y se intentara insertar un nuevo elemento, se producir un
error conocido como desbordamiento overflow. Por ejemplo, si en la pila que
se presenta en la figura F31-3 a , donde TOPE = MAX, se quisiera insertar un
nuevo elemento, se producir un error de este tipo. La pila est llena y el espacio
de memoria reservado es fijo, no se puede expandir ni contraer.
Una posible solucin a este tipo de inconvenientes consiste en definir pilas de gran
tamao, pero esto ultimo resultara ineficiente y costoso si solo se utilizaran
algunos elementos. No siempre es viable saber con exactitud cul es el nmero de
elementos a tratar; por tanto, siempre existe la posibilidad de cometer un error de
desbordamiento si se reserva menos espacio del que efectivamente se usara
o bien de hacer uso ineficiente de la memoria si se reserva ms espacio del que
realmente se necesita.
25
ESTRUCTURA DE DATOS
permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el
nuevo TOS.
Por analoga con objetos cotidianos, una operacin apilar equivaldra a colocar un
plato sobre una pila de platos, y una operacin retirar a retirarlo.
Ejemplo
Forma principal
25
ESTRUCTURA DE DATOS
Hacer mientras Apuntador <=Top
imprimir Pila(Apuntador)
apuntador = Apuntador +1
Fin del ciclo.
Fin si
fin.
Procedimiento: Bsqueda de un elemento en Pila
Algoritmo
Busqueda(Pila, Top, Elemento)
ban=0
Si Top = -1 //verifica si la pila esta vaca
Imprimir Pila vaca (undreflow)
Si no
Apuntador = 0
Hacer mientras Apuntador <= Top AND ban=0
Si Pila[Apuntador] = Elemento
Imprimir El Dato fue encontrado
ban=1
Si no
Apuntador = Apuntador + 1
Fin si
Fin del ciclo
Fin si
Si ban=0
Imprimir El Dato no se encontr
fin
Procedimiento: Eliminacin de elemento en Pila
Algoritmo
Eliminar(Pila, Top)
Si Top = -1 entonces
Imprimir pila vaca (Underflow)
Si no
Top=Top-1
Imprimir El Dato se elimino
Fin si
fin
25
ESTRUCTURA DE DATOS
3.2 COLAS
Una cola constituye una estructura lineal de datos en la que los nuevos elementos
se introducen por un extremo y los ya existentes se eliminan por el otro. Es
importante sealar que los componentes de la cola se eliminan en el mismo orden
en el cual se insertaron. Es decir, el primer elemento que se introduce en la
estructura ser el que se eliminara en primer orden. Debido a esta caracterstica,
las colas tambin reciben el nombre de estructuras FIFO (First-In, First-Out: el
primero en entrar es el primero en salir).
Existen numerosos casos de la vida real en los cuales se usa este concepto.
Ejemplo, la cola de los bancos en las que los clientes esperan para ser atendidos
primera persona de la cola ser la primera en recibir el servicio, la cola de los
que esperan a veces pacientemente para subir a un juego mecnico, las colas de
vehculos esperando la luz verde del semforo, las colas para entrar a un cine,
teatro o estadio de futbol, etctera.
Representacin de colas
25
ESTRUCTURA DE DATOS
Las colas, al igual que las pilas, no existen como estructuras de datos estndar en
lenguajes de programacin. Este tipo de estructura de datos se puede representar
mediante el uso de:
Arreglos
Listas
El elemento 111 est en el FRENTE ya que fue el primero que se inserto; mientras
que el elemento 333, que fue el ltimo en entrar, est en el FINAL de la cola.
25
ESTRUCTURA DE DATOS
Las inserciones se llevaran a cabo por el FINAL de la cola, mientras que las
eliminaciones se harn por el FRENTE recuerde que el primero en entrar es el
primero en salir.
Considerando que una cola puede almacenar un mximo nmero de elementos
y que adems FRENTE indica la posicin del primer elemento y FINAL la posicin
del ltimo, se presentan a continuacin los algoritmos correspondientes a las
operaciones mencionadas.
25
ESTRUCTURA DE DATOS
25
ESTRUCTURA DE DATOS
hacer mientras i <= final
Escribir Cola[i]
i=i+1
fin mientras
fin si
fin si
fin
Procedimiento 3: Bsqueda de elemento en cola
25
ESTRUCTURA DE DATOS
Si Frente = Final, entonces //[La cola solo tena un elemento]
Frente = -1
Final = -1
Si no
Frente = Frente + 1
Imprimir elemento eliminado
Fin si
LISTAS
Las estructuras de datos presentadas hasta el momento, arreglos y registros, se
denominan estticas. Reciben este nombre debido a que durante la compilacin
se les asigna un espacio de memoria, y este permanece inalterable durante la
ejecucin del programa.
En este tema se presenta la estructura de datos lista. Este es un tipo de estructura
lineal y dinmica de datos. Lineal porque a cada elemento le puede seguir solo
otro elemento; dinmica porque se puede manejar la memoria de manera flexible,
sin necesidad de reservar espacio con antelacin.
25
ESTRUCTURA DE DATOS
La principal ventaja de manejar un tipo dinmico de datos es que se pueden
adquirir posiciones de memoria a medida que se necesitan; estas se liberan
cuando ya no se requieren. As es posible crear estructuras dinmicas que se
expandan o contraigan, segn se les agregue o elimine elementos. El dinamismo
de estas estructuras soluciona el problema de decidir cul es la cantidad ptima
de memoria que se debe reservar para un problema especfico. Sin embargo, es
importante destacar que las estructuras dinmicas no pueden reemplazar a los
arreglos en todas sus aplicaciones. Existen numerosos casos que podran
fcilmente ser solucionados aplicando arreglos, mientras que si se utilizaran
estructuras dinmicas, como las listas, la solucin de estos problemas se
complicara.
Las listas ligadas son colecciones de elementos llamados nodos; el orden entre
estos se establece por medio de un tipo de datos denominado punteros,
apuntadores, direcciones o referencias a otros nodos. Por tanto, siempre es
importante distinguir entre un dato de tipo apuntador y el dato contenido en la
celda al cual este apunta. Se usara la notacin P <- D para indicar que P es un
apuntador al nodo D, Crear(P) para sealar el proceso de asignacin de memoria
al nodo P, y Quitar(P) para indicar el proceso inverso; es decir, cuando se libera
una position de memoria apuntada por P.
Las operaciones ms importantes que se realizan en las estructuras de datos son
las de bsqueda, insercin y eliminacin. Se utilizan tambin para comparar la
eficiencia de las estructuras de datos y de esta forma observar cual es la
estructura que mejor se adapta al tipo de problema que se quiera resolver. La
bsqueda, por ejemplo, es una operacin que no se puede realizar en forma
eficiente en las listas. Por otra parte, las operaciones de insercin y eliminacin se
efectan de manera eficiente en este tipo de estructuras de datos.
Este tema se dedicara a las estructuras dinmicas lineales llamadas listas; entre
ellas se distinguen tres tipos: listas simplemente ligadas, listas doblemente ligadas
y listas circulares.
Ventajas de usar listas: Las listas son dinmicas, es decir, podemos almacenar
en ellas tantos elementos como necesitemos, siempre y cuando haya espacio
suficiente espacio en memoria. Al insertar un elemento en la lista, la operacin
tiene un tiempo constante independientemente de la posicin en la que se inserte,
solo se debe crear el nodo y modificar los enlaces. Esto no es as en los arreglos,
ya que si el elemento lo insertamos al inicio o en medio, tenemos un tiempo lineal
debido a que se tienen que mover todos los elementos que se encuentran a la
derecha de la posicin donde lo vamos a insertar y despus insertar el elemento
en dicha posicin; solo al insertar al final del arreglo se obtienen tiempos
25
ESTRUCTURA DE DATOS
constantes. Al eliminar un elemento paso lo mismo que se menciono en el punto
anterior.
Desventajas de usar listas:
El acceso a un elemento es ms lento, debido a que la informacin no est en
posiciones contiguas de memoria, por lo que no podemos acceder a un elemento
con base en su posicin como se hace en los arreglos.
LISTAS SIMPLES
Una lista simplemente ligada constituye una coleccin de elementos llamados
nodos. El orden entre estos se establece por medio de punteros; es decir,
direcciones o referencias a otros nodos. Un tipo especial de lista simplemente
ligada es la lista vaca. La figura F331 - 1 presenta la estructura de un nodo de
una lista simplemente ligada. En general, un nodo consta de dos partes:
1. Un campo INFORMACION que ser del tipo de los datos que se quiera
almacenar en la lista.
2. Un campo LIGA, de tipo puntero, que se utiliza para establecer la liga o el
enlace con otro nodo de la lista. Si el nodo fuera el ltimo de la lista, este campo
como valor NULO vacio. Al emplearse el campo liga para relacionar dos, no
ser necesario almacenar fsicamente a los nodos en espacios contiguos.
25
ESTRUCTURA DE DATOS
simplemente ligada estuviera vaca, entonces el apuntador al tendr el valor
NULO.
Crea_Inicio
{Este algoritmo permite crear una lista simplemente ligada, agregando cada nuevo
nodo al inicio de la misma}
{P y Q son variables de tipo puntero. Los campos del nodo son INFO, que ser del
tipo de datos que se quiera almacenar en la lista, y LIGA de tipo apuntador. P
apunta al inicio de la lista. RES es una variable de tipo entero}
1. Crear (P) {Se crea el primer nodo de la lista simplemente ligada}
2. Leer P^.INFO
3. Hacer P^.LIGA <- NULO
4. Escribir Desea ingresar ms nodos a la lista? Si: 1, No: 0
5. Leer RES
6. Mientras (RES = 1) Repetir
Crear (Q)
Leer Q^.INFO
25
ESTRUCTURA DE DATOS
Hacer Q^.LIGA <- P y P <- Q
Escribir Desea ingresar ms nodos a la lista? Si: 1, No: 0
Leer RES
7. {Fin del ciclo del paso 6}
Crea_final
{Este algoritmo permite crear una lista simplemente ligada, agregando cada nuevo
final de la misma}
{P, Q y T son variables de tipo apuntador. Los campos del nodo son INFO, que
ser del tipo de datos que se quiera almacenar en la lista, y LIGA de tipo
apuntador. P apunta al inicio de lista. RES es una variable de tipo entero}
Crear (P) {Se crea el primer nodo de la lista)
Leer P^.INFO
Hacer P^.LIGA <- NULO y T <- P
Escribir Desea ingresar mas nodos a la lista? Si: 1, No: 0
Leer RES
Mientras (RES = 1) Repetir
Crear (Q)
Leer Q^.INFO
Hacer Q^.LIGA <- NULO, T^.LIGA <- Q y T<- Q { T apunta al ltimo nodo}
Escribir Desea ingresar ms nodos a la lista? S = 1, No = 0"
Leer RES
7. {Fin del ciclo del paso 6}
25
ESTRUCTURA DE DATOS
Recorre_Iterativo (P)
{ste algoritmo recorre una lista cuyo primer nodo esta apuntado por P}
{Q es una variable de tipo apuntador. INFO y LIGA son los campos de cada nodo
de la lista}
1. Hacer Q <- P
2. Mientras (Q NULO) Repetir
Escribir Q^.INFO
Hacer Q <- Q^.LIGA {Apunta al siguiente nodo de la lista}
3. {Fin del ciclo del paso 2}
Recorre_recursivo (F)
{Este algoritmo recorre una lista simplemente ligada en forma recursiva. P es un
apuntador al nodo que se va a visitar. La primera vez trae la direccin del primer
nodo de la lista}
{INFO y LIGA son los campos de cada nodo de la lista}
1. Si P NULO entonces
Escribir P^.INFO
Llamar a Recorre_recursivo con P^.LIGA {Llamada recursiva con el
apuntador al siguiente nodo de la lista}
2, {Fin del condicional del paso 1}
25
ESTRUCTURA DE DATOS
25
ESTRUCTURA DE DATOS
25
ESTRUCTURA DE DATOS
2.3. {Fin del ciclo del paso 2.1}
3. {Fin del condicionante del paso 2}
4. Quitar(Q)
Eliminar un nodo con informacin X de una lista simplemente ligada
Elimina_X
{Este algoritmo permite elimina un nodo con informacin X de una lista
simplemente ligada. P es el apuntador al primer nodo de la lista}
{Q y T son variables de tipo apuntador. BAND es una variable de tipo entero. INFO
y LIGA son los campos de los nodos de la lista}
1. Hacer Q <- P y BAND <- 1
2. Mientras ((Q^.INFO X ) y (BAND = 1)) repetir
2.1 si Q^.LIGA NULO
entonces
Hacer T <- Q y Q <- Q^.LIGA
si no
Hacer BAND <- 0
2.2 {Fin del condicionante del paso 2.1}
3. {Fin del ciclo del paso 2}
4. Si (BAND = 0)
entonces
Escribir El elemento con informacin X no se encuentra en la lista
si no
4.1 Si (P = Q) {Se verifica si el elemento a eliminar es el primero}
Entonces
Hacer P <- Q^.LIGA
si no
Hacer T^.LIGA <- Q^.LIGA
4.2 {Fin del condicional del paso 4.1}
Quitar (Q)
5. {Fin del condicional del paso 4}
25
ESTRUCTURA DE DATOS
desordenadas. Se comenzar, en primer trmino, con el algoritmo de bsqueda
par listas simplemente ligadas que se encuentran desordenadas.
Bsqueda_Desordenada(P,X)
{Este algoritmo permite buscar el elemento con la informacin X en una lista
simplemente ligada que se encuentra desordenada. P es una variable de tipo
apuntador, sealando al primer nodo}
{Q es una variable tipo apuntador. INFO y LIGA son campos de los nodos de la
lista}
1. Hacer Q <- P
2. Mientras ((Q NULO) y (Q^.INFO X)) repetir
Hacer Q <- Q^.LIGA
3. {Fin del ciclo del paso 2}
4. Si (Q = NULO)
entonces
Escribir El elemento no se encuentra en la lista
si no
Escribir El elemento si se encuentra en la lista
5. {Fin del condicionante del paso 4}
Bsqueda_Ordenada(P,X)
{Este algoritmo permite buscar el elemento con la informacin X en una lista
simplemente ligada que se encuentra ordenada de forma ascendente. P es una
variable de tipo apuntador, sealando al primer nodo}
{Q es una variable tipo apuntador. INFO y LIGA son campos de los nodos de la
lista}
1. Hacer Q <- P
2. Mientras ((Q NULO) y (Q^.INFO < X)) repetir
Hacer Q <- Q^.LIGA
3. {Fin del ciclo del paso 2}
4. Si ((Q = NULO) o (Q^.INFO > X))
entonces
MSC. MA. DE LOURDES HDEZ. MARTNEZ
25
ESTRUCTURA DE DATOS
Escribir El elemento no se encuentra en la lista
si no
Escribir El elemento si se encuentra en la lista
5. {Fin del condicionante del paso 4}
Busqueda_Recursiva(P,X)
{Este algoritmo permite buscar recursivamente a un elemento con informacin X
en una lista simplemente ligada que se encuentre desordenad. P es el apuntador
al primer nodo de la lista}
1. Si (P NULO)
entonces
1.1 Si (P^.INFO = X)
entonces
Escribimos El elemento se encuentra en la lista
si no
Llamar a Busqueda_Recursivo con P^.LIGA y X
1.2 {Fin del condicionante del paso 1.1}
si no
Escribir El elemento no se encuentra en la lista";
2. {Fin del condicionante del paso 1}
LISTAS DOBLES
Una lista doblemente ligada es una coleccin de nodos, en la cual cada uno de
ellos tiene dos apuntadores, uno apuntando a su predecesor (LIGAIZQ) y otro a su
sucesor (LIGADER). Por medio de estos punteros se podr entonces avanzar o
retroceder a travs de la lista, segn se tomen las direcciones de uno u otro
apuntador. La figura F332-1 representa una lista doblemente ligada que almacena
apellidos.
25
ESTRUCTURA DE DATOS
25
ESTRUCTURA DE DATOS
25
ESTRUCTURA DE DATOS
Eliminar_X (P, F, X)
{Este algoritmo elimina el nodo con informacin X de una lista doblemente ligada.
P y F son los apuntadores al primero y ltimo nodos de la lista, respectivamente)
{Q, T y R son variables de tipo apuntador. INFOR, LIGADER y LIGAIZQ son los
campos de cada nodo de la lista}
1. Hacer Q <- P
2. Mientras ((Q^.LIGADER NULO) y (Q^.INFOR X)) Repetir
Hacer Q <- Q^.LIGADER
3. {Fin del ciclo del paso 2}
4. Si(Q^.INFOR = X)
entonces
4.1. Si ((Q = P) y (Q = F)) {La lista tiene un solo nodo}
entonces
Hacer P <- NULO y F <-NULO
si no
4.1.1 Si (G = P) {Es el primero}
entonces
Hacer P <- Q^.LIGADER y P^.LIGAIZQ <- NULO
si no
4.1.1.1 Si (Q = F) {Es el ultimo}
entonces
MSC. MA. DE LOURDES HDEZ. MARTNEZ
25
ESTRUCTURA DE DATOS
Hacer F <- Q^.LIGAIZQ y
F^.LIGADER <- NULO
si no {Es un nodo intermedio}
Hacer T<- Q^.LIGAIZQ, R <Q^.LIGADER y
T^.LIGADER <- R y R^
.LIGAIZQ <- T
4.1.1.2 {Fin del condicional del paso 4.1.1.1}
4.1.2 {Fin del condicional del paso 4.1.1}
4.2 {Fin del condicional del paso 4.1}
Quitar (Q)
si no
Escribir "El elemento con informacin X no se encuentra en la lista"
5. {Fin del condicional del paso 4}
25