Professional Documents
Culture Documents
UNIDAD 3.
ESTRUCTURAS LINEALES
COMPETENCIA ESPECIFICA DE LA UNIDAD.
3.1 LISTAS
Una lista es una coleccin de elementos llamados generalmente nodos. El orden entre los nodos se
establece por medio de enlaces o referencias a otros nodos.
Su representacin es la siguiente:
NODO
Informacin
Enlace
Ejemplo:
p
Garca
Prez
Lpez
Santos
null
2
ESTRUCTURA DE DATOS (ING.)
Prez
Lpez
Santos
null
3
ESTRUCTURA DE DATOS (ING.)
Borrado de un elemento
Borrar
{
Si (inicio=null) entonces escribir Lista vaca;
Sino
{
Leer dato a eliminar;
Buscar (dato);
Si (ban=1)
{
Si (n=inicio) entonces { inicio=inicio.enlace; }
Sino { q.enlace=n.enlace; }
Si (n.enlace=null) entonces {p=q;}
Liberar (n);
}
}
}
Buscar
Buscar (dato)
{
Hacer n=inicio y ban=0;
Repetir Mientras (n!=null y ban=0)
{
Si (n.informacin=dato) entonces hacer ban=1;
Sino
{
Hacer q=n y n=n.enlace;
}
}
Si (ban=0) entonces escribir "Este dato no existe";
}
3.1.4 LISTAS DOBLEMENTE ENLAZADAS
Su representacin es la siguiente:
Izquierda
NODO
Informacin
Derecha
Al tener doble enlace, la lista puede recorrerse tanto del inicio al final (tomando el enlace derecho), como
en el sentido opuesto (tomando el enlace izquierdo).
Por ejemplo:
4
ESTRUCTURA DE DATOS (ING.)
p
null Garca
p
Prez
Lpez
Santos null
5
ESTRUCTURA DE DATOS (ING.)
6
ESTRUCTURA DE DATOS (ING.)
Prez
Lpez
Santos
Las operaciones en listas circulares son similares a las operaciones en listas lineales.
En el caso de la operacin de recorrido de listas circulares, es necesario aclarar que se debe considerar
algn criterio para detectar cundo se han visitado todos los nodos para evitar caer en ciclos infinitos. Una
posible solucin consiste en usar un nodo extra, llamado nodo de cabecera, para indicar el inicio de la
lista. Este nodo contendr informacin especial, de tal manera que se distinga de los dems y as podr
hacer referencia al principio de la lista.
3.1.6 APLICACIONES
Dos de las aplicaciones ms conocidas de las listas son:
Representacin de polinomios
Resolucin de colisiones (hash)
En general, puede decirse que las listas son muy tiles para aquellas aplicaciones en las cuales se necesite
dinamismo en el crecimiento y reduccin de las estructuras de datos.
Representacin de polinomios
Las listas se utilizan para almacenar los coeficientes diferentes de cero del polinomio, junto al exponente.
As, por ejemplo, dado el polinomio:
P(x) = 3X4 + 0.5X3 + 6X - 4
su representacin mediante lista, sera como sigue:
p
3
0.5
Campo
Campo
Coeficiente Exponente
-4
null
7
ESTRUCTURA DE DATOS (ING.)
B
2
C
3
...
MAX
TOPE
PILA
MAX
:
TOPE
3
2
1
C
B
A
8
ESTRUCTURA DE DATOS (ING.)
Poner un elemento
Aqu es muy importante verificar si la pila ya est llena, porque si ste es el caso, y se intenta insertar un
elemento ms, se tendra el error conocido como desbordamiento (overflow).
Algoritmo Pone
Si (tope < max) entonces
{
Hacer tope = tope + 1;
Hacer pila [tope] = dato;
}
Si no escribir Desbordamiento
Quitar un elemento
Otro error que puede presentarse al trabajar con pilas, es tratar de eliminar un elemento de una pila vaca.
Este tipo de error se conoce con el nombre de subdesbordamiento (underflow).
Algoritmo Quita
Si (tope > 0) entonces
{
Hacer dato = pila [tope];
Hacer tope = tope -1;
}
Si no escribir Subdesbordamiento
Representacin de pilas a travs de listas enlazadas
Hacer tope=nuevo=p=null;
Insertar
Insertar
{
Crear nodo (nuevo);
Leer dato;
Hacer nuevo.informacin=dato;
Si (tope=null) entonces nuevo.enlace=null;
Sino nuevo.enlace=tope;
Hacer tope=nuevo;
}
9
ESTRUCTURA DE DATOS (ING.)
Eliminar
Eliminar
{
Si (tope=null) entonces escribir "Pila vaca";
Sino
{
Hacer p=tope; tope=tope.enlace; y liberar (p);
}
}
Consultar
Consulta
{
Si (tope!=null) entonces
{
Hacer p=tope;
Repetir
{
Imprimir p.informacin;
Hacer p=p.enlace;
}Mientras (p!=null);
}
Sino escribir "Pila vaca";
}
3.2.3 APLICACIONES
Algunas aplicaciones usando pilas son las siguientes:
Llamadas a subprogramas. Cuando se tiene un programa que llama a un subprograma, internamente
se usan pilas para guardar el estado de las variables y la direccin del programa en el momento que se
hace la llamada, para que cuando termine la ejecucin del subprograma, los valores almacenados en la
pila puedan recuperarse para continuar con la ejecucin del programa en el punto en el cual fue
interrumpido.
Por ejemplo, se tiene un programa principal (PP) que llama a los subprogramas UNO y DOS. A su vez,
el subprograma DOS llama al subprograma TRES. Cada vez que la ejecucin de uno de los
subprogramas concluye, se regresa el control al nivel inmediato superior.
PP
UNO
DOS
TRES
10
ESTRUCTURA DE DATOS (ING.)
3
2
1
PP
TOPE = 1
3
2
1
TOPE = 0
3
2
1
PP
TOPE = 1
3
2 DOS
1 PP
TOPE = 2
3
2
1
PP
TOPE = 1
3
2
1
TOPE = 0
Recursin. Con cada llamada recursiva se crea una copia de todas las variables y constantes que estn
vigentes, y se guarda esa copia en la pila, para usarse posteriormente una vez terminado el proceso
recursivo.
Tratamiento de expresiones aritmticas. Convertir expresiones en notacin infija (el operador est
entre los operandos, por ejemplo: A + B) a su equivalente en notacin postfija o prefija (el operador
est despus o antes de los operandos, respectivamente; por ejemplo: AB+ y +AB).
Ordenacin. Otra aplicacin de las pilas puede verse en el mtodo de ordenacin rpida.
3.2.4 NOTACION INFIJA Y POSTFIJA
Notacion infija, prefija y postfija en expresiones
Dada la expresin A+ B se dice que est en notacin infija, y su nombre se debe a que el operador ( + )
est entre los operandos (A y B).
Dada la expresin AB+ se dice que est en notacin postfija, y su nombre se debe a que el operador
( + ) est despus de los operandos (A y B).
Dada la expresin +AB se dice que est en notacin prefija, y su nombre se debe a que el operador
( + ) est antes que los operandos (A y B).
La ventaja de usar expresiones en notacin polaca postfija o prefija radica en que no son necesarios los
parntesis para indicar orden de operacin, ya que ste queda establecido por la ubicacin de los
operadores con respecto a los operandos.
Para convertir una expresin dada en notacin infija a una notacin postfija (o prefija), debern
establecerse previamente ciertas condiciones:
Solamente se manejarn los siguientes operadores (estn dados ordenadamente de mayor a menor
segn su prioridad de ejecucin):
^
(potencia)
* / (multiplicacin y divisin)
+ - (suma y resta)
Los operadores de ms alta prioridad se ejecutan primero.
Si hubiera en una expresin dos o ms operadores de igual prioridad, entonces se procesarn de
izquierda a derecha.
Las subexpresiones parentizadas tendrn ms prioridad que cualquier operador (aunque los parntesis
como operadores, para efectos del algoritmo tienen prioridad cero).
Como ejemplo, se presenta paso a paso, la conversin de una expresin infija a notacin polaca postfija
utilizando el siguiente algoritmo:
11
ESTRUCTURA DE DATOS (ING.)
12
ESTRUCTURA DE DATOS (ING.)
Para que esto funcione, cuando se invoca un mtodo, el sistema reserva un nuevo segmento de memoria
para que el mtodo almacene lo siguiente:
o bien
n * ( n - 1 )!
Si n = 0
Si n > 0
{Estado bsico}
{Llamada recursiva}
13
ESTRUCTURA DE DATOS (ING.)
0
1
2
3
4
5
6
7
3
3
2
1
0
1
2
3
Pila
3*,
3*, 2*,
3*, 2*, 1*,
3*, 2*, 1*,
3*, 2*,
3*,
res
1
1*1=1
2*1=2
3*2=6
La secuencia de Fibonacci
Recordando:
n
Fibonacci ( n ) = Fibonacci ( n - 1) + Fibonacci ( n - 2 )
Entonces:
Fibonacci ( 0 ) = 0
Fibonacci ( 1 ) = 1
Fibonacci ( 2 ) = Fibonacci ( 1 ) + Fibonacci ( 0 ) = 1 + 0 = 1
Fibonacci ( 3 ) = Fibonacci ( 2 ) + Fibonacci ( 1 ) = 1 + 1 = 2
Fibonacci ( 4 ) = Fibonacci ( 3 ) + Fibonacci ( 2 ) = 2 + 1 = 3
As para calcular el Fibonacci del nmero 4, se tendra:
Si n = 0 n = 1
Si n > 1
14
ESTRUCTURA DE DATOS (ING.)
{Estado bsico}
{Llamada recursiva}
0
1
2
3
4
5
6
7
8
9
4
4
3
2
1
0
1
2
1
0
Pila
fibo (2)+,
fibo (2)+, fibo (1)+,
fibo (2)+, fibo( 1)+, fibo (0)+,
fibo (2)+, fibo( 1)+, fibo (0)+,
fibo (2)+, fibo (1)+,
fibo (2)+,
fibo (0)+,
fibo (0)+,
1
1+0=1
1+1=2
2+
2+1=3
3+0=3
15
ESTRUCTURA DE DATOS (ING.)
3.3 COLAS
Una cola es una lista de elementos en la que stos se introducen por un extremo y se eliminan por otro.
Los elementos se eliminan en el mismo orden en el que se insertaron. Por lo tanto, el primer elemento que
entra a la cola ser el primero en salir. Por sto tambin se les conoce como Estructuras FIFO (First-In,
First-Out: Primero en Entrar, Primero en Salir). Como ejemplo de estas estructuras, se puede mencionar la
cola para el telfono, la cola en el banco, etc.
3.3.1 REPRESENTACION EN MEMORIA ESTATICA Y DINAMICA
Las colas pueden representarse por medio de arreglos o listas enlazadas. Debe definirse el tamao mximo
de la cola y dos variables auxiliares, una de ellas para que guarde la posicin del primer elemento de la
cola (FRENTE) y otra para que guarde la posicin del ltimo elemento de la cola (FINAL).
COLA
A
1
B
2
FRENTE
C
3
...
MAX
FINAL
COLA
FRENTE
FINAL
1
2
3
:
:
A
B
C
MAX
16
ESTRUCTURA DE DATOS (ING.)
17
ESTRUCTURA DE DATOS (ING.)
Consultar
Consulta
{
Si (frente!=null) entonces
{
Hacer p=frente;
Repetir
{
Imprimir p.informacin;
Hacer p=p.enlace;
}Mientras (p!=null);
}
Sino escribir "Cola vaca";
}
COLA CIRCULAR
Para hacer un uso ms eficiente de la memoria disponible, se trata a la cola como a una estructura circular.
Es decir, el elemento anterior al primero, es el ltimo.
COLA CIRCULAR
A
2
B
3
C
4
D
5
E
6
F
7
G
8
FRENTE
I
1
A
2
H
FINAL
B
3
COLA CIRCULAR
C
D
E
F
4
5
6
7
FINAL FRENTE
G
8
H
9
18
ESTRUCTURA DE DATOS (ING.)
La primera de ellas permite que las eliminaciones puedan hacerse por cualquiera de los dos extremos,
mientras que las inserciones slo por el final de la cola:
DOBLE COLA
FRENTE
1
A
2
B
3
C
4
D
5
E
6
F
7
FINAL
H
G
8
MAX
La segunda variante permite que las inserciones puedan hacerse por cualquiera de los dos extremos,
mientras que las eliminaciones slo por el FRENTE de la cola:
19
ESTRUCTURA DE DATOS (ING.)
DOBLE COLA
FRENTE
1
A
2
B
3
C
4
D
5
E
6
F
7
FINAL
H
G
8
MAX