Sei sulla pagina 1di 129

UNIVERSIDAD TECNICA DE ORURO

FACULTAD NACIONAL DE INGENIERIA


INGENIERIA DE SISTEMAS E INFORMATICA

TEXTO GUIA:

ESTRUCTURA DE DATOS

SIS2204

Docente: Ing. Juan Gregorio Choque Uo


Fecha de Realizacin: Marzo del 2008

Oruro - Bolivia

1
2
CONTENIDO
INTRODUCCION 6

1.1 ESTRUCTURA DE DATOS. 6

1.2 OPERACIONES SOBRE ESTRUCTURAS DE DATOS. 9

PILAS Y COLAS 10

2.1 PILAS. 10
PILA SECUENCIAL 10
OPERACIONES CON PILAS 11
DISTRIBUCIN DE PILAS. 14
Manejo de Dos Pilas y Operaciones Primitivas. 14

2.2 COLAS. 17
COLA SECUENCIAL 17
OPERACIONES CON COLAS 17
INICIAR COLA. 17
ACCEDER A UN ELEMENTO EN LA COLA 18
INSERTAR UN ELEMENTO EN LA COLA. 18
ELIMINAR UN ELEMENTO DE LA COLA. 19

2.3 COLAS CIRCULARES. 19


INSERCIN EN COLA CIRCULAR 20
ELIMINAR EL NODO DELANTERO DE LA COLA 20

2.4 APLICACIONES DE LISTAS RESTRINGIDAS. 22


ALGORITMO DE NOTACIN INFIJA A POSFIJA 22
ALGORITMO DE EVALUACIN EN NOTACIN POSFIJA 24

ARCHIVOS, REGISTROS Y CAMPOS 26

3.1 ARCHIVOS 26

3.2 TIPOS DE ARCHIVOS. 26


ARCHIVOS SECUENCIALES. 26
ARCHIVOS DIRECTOS. 27
OPERACIONES SOBRE ARCHIVOS 27

3.3 REGISTROS Y CAMPOS. 28


TIPOS DE REGISTROS 29
OPERACIONES SOBRE REGISTROS. 29

TRATAMIENTO DE ARCHIVOS 30

4.1 INTRODUCCION 30

4.2 OPERACIONES SOBRE ARCHIVOS 30


ADICION DE DATOS 31
ELIMINAR DATOS 32
CONSULTAS DE DATOS 33
BUSQUEDA DE DATOS 34

3
4.3 PARTICION DE ARCHIVOS 35
PARTICION POR CONTENIDO 36
PARTICION POR UNA SECUENCIA " P " DADA 36
PARTICIN DE ARCHIVOS POR TRAMOS ORDENADOS 37

4.4 MEZCLAS DE ARCHIVOS 38


MEZCLA POR CONTENIDO TOTAL 39
MEZCLA POR SECUENCIAS " P " 39
MEZCLA POR TRAMOS ORDENADAS 41

4.5 ORDENACIN EXTERNA 42


ORDENACIN POR MEZCLA DIRECTA 42
ORDENACIN POR VON NEWMAN 45
ORDENACIN POR MEZCLA EQUILIBRADA 47
ORDENACIN POR DIGITOS 49

LISTAS ENCADENADAS 52

5.1 LISTAS ENCADENADAS 52


TIPOS DE LISTAS. 52

5.2 LISTAS SIMPLEMENTE ENLAZADAS 53


OPERACIONES EN LISTAS SIMPLEMENTE ENLAZADAS 54
RECORRIDO 54
BUSQUEDA 55
INSERCION DE DATOS 55
ELIMINAR DATOS 58

5.3 LISTAS SIMPLEMENTE ENLAZADAS CIRCULARES. 59


OPERACIONES EN LISTAS SIMPLEMENTE ENLAZADAS CIRCULARES 60
RECORRIDO 60
BUSQUEDA 61
INSERCION DE DATOS 61
ELIMINAR DATOS 63

5.4 LISTAS DOBLEMENTE ENLAZADAS. 64


OPERACIONES EN LISTAS DOBLEMENTE ENLAZADAS. 65
RECORRIDO 66
INSERCION DE DATOS 67
ELIMINAR DATOS 69

5.5 LISTAS CIRCULARES DOBLEMENTE ENLAZADAS. 72


OPERACIONES EN LISTAS DOBLEMENTE ENLAZADAS CIRCULARES. 73
RECORRIDO 73
INSERCION DE DATOS 74
ELIMINAR DATOS 76

RBOLES 78

6.1 DEFINICION. 78
REPRESENTACIN 78
MATRIZ DE ADYACENCIA 79
LISTA DE ADYACENCIA 79
ESTRUCTURA DINMICA PURA 79

6.2 CONCEPTOS ASOCIADOS 80

4
6.3 ARBOL BINARIO 81
DEFINICION 82
OPERACIONES BASICAS 82
INSERCIN DE DATOS 88
ELIMINAR UN DATO 88
BSQUEDA DE DATOS 90

6.4 RBOLES BINARIOS DE EXPRESIONES 90


CONSTRUCCIN A PARTIR DE UNA EXPRESIN EN NOTACIN CONVENCIONAL 91

6.5 RBOLES EQUILIBRADOS O AVL 92


DEFINICIN 93
INSERCIN EN AVL 93
IMPLEMENTACIN DE LA INSERCIN 100
BORRADO EN AVL 103
IMPLEMENTACIN DE LA ELIMINACIN 109

RBOLES BINARIOS DE EXPRESIONES 113

GRAFOS 115

7.1 DEFINICIONES. 115

7.2 ALMACENAMIENTO DE UN GRAFO EN MEMORIA. 122

7.3 APLICACIONES. 126

5
TEMA 1

INTRODUCCION
OBJETIVOS

Conceptuar las diferentes etapas por las que atraviesa el procesamiento de datos desde la abstraccin de
los mismos hasta la obtencin de los resultados en la computadora.

CONTENIDO

1.1 Estructura de Datos


1.2 Operaciones Sobre Estructuras de Datos

1.1 ESTRUCTURA DE DATOS.


Estructuras de datos y tipos de datos abstractos (TDA)
Un tipo de datos es una coleccin de valores
Un tipo de datos abstracto (TDA) es un tipo de datos definido de forma nica mediante un tipo y un
conjunto dado de operaciones definidas sobre el tipo.
Una estructura de datos es la implementacin fsica de un tipo de datos abstracto.
Debido al proceso de abstraccin, el diseo deber realizarse siguiendo tres pasos fundamentales:
1.- Anlisis de datos y operaciones
2.- Eleccin del Tipo de Datos Abstracto
3.- Eleccin de la implementacin

Tipos de datos bsicos

TDA Entero: tiene como tipo el conjunto de nmeros enteros, y como operaciones la suma, resta,
multiplicacin y divisin entera
TDA Real: tiene como tipo el conjunto de nmeros reales y como operaciones la suma, resta
multiplicacin y divisin
TDA Booleano: tiene como tipo el conjunto de valores booleanos True, False y como operaciones las
definidas en el lgebra de Boole (AND, OR, NOT)
TDA Carcter: tiene como tipo el conjunto de caracteres definido por un alfabeto dado y como
operaciones todos los operadores relacionales (<, >, =, >=, <=, <>)

Se denominan tipos de datos escalares a aquellos en los que el conjunto de valores est ordenado y
cada valor es atmico: Carcter, Entero, Real y Booleano.
Se denominan tipos de datos ordinales a aquellos en los que cada valor tiene un predecesor (excepto el
primero), y un nico sucesor (excepto el ltimo): Carcter, Entero y Booleano.

Los lenguajes de alto nivel suelen presentar tres funciones adicionales asociadas a los tipos de datos
ordinales: posicin (Ord), predecesor (Pred) y sucesor (Suc) de un elemento.

Otro tipo de datos son los denominados compuestos, dado que son divisibles en componentes que
pueden ser accedidas individualmente. Las operaciones asociadas a los tipos compuestos o
estructurados son las de almacenar y recuperar sus componentes individuales.
6
Los TDA compuestos bsicos:

TDA Conjunto: coleccin de elementos tratados con las operaciones unin, interseccin y diferencia
de conjuntos.
TDA Arreglo: coleccin homognea de longitud fija tal que cada una de sus componentes pueden ser
accedidas individualmente mediante uno o varios ndices, que sern de tipo ordinal, y que indican la
posicin de la componente dentro de la coleccin.
TDA Registro: tipo de datos heterogneo compuesto por un nmero fijo de componentes denominadas
campos a las que se accede mediante un selector de campo.
El TDA Conjunto no es estructurado ya que no est organizado mediante el modo de acceso a sus
componentes individuales, mientras que el Arreglo y el Registro si lo son. Los registros pueden tener
como campos tipos de datos simples o arreglos o incluso otros registros.
Los TDA bsicos son los utilizados con mayor frecuencia, pero adems cada problema puede requerir
la definicin de varios TDA propios. Por ejemplo, un TDA muy utilizado en aplicaciones informticas
es el TDA lista definido de la siguiente forma:
TDA lista (o Secuencia): coleccin homognea de datos, ordenados segn su posicin en ella, tal que
cada elemento tiene un predecesor (excepto el primero) y un sucesor (excepto el ltimo) y los
operadores asociados son:
Insertar: inserta un elemento x, en una posicin p de la lista
Localizar: localiza la posicin p en la que se encuentra el dato x
Recuperar: encuentra el elemento x que esta en la posicin p
Suprimir: elimina de la lista el elemento de la posicin p
Suprimir_dato: elimina de la lista cualquier aparicin del elemento x
Anula: ocasiona que la lista se vace
Primero (Fin): proporciona el primer (ltimo) elemento de la lista
Imprimir: imprime todos los elementos de la lista en su orden.

En general el trmino lista se utiliza cuando el TDA se implementa sobre memoria principal mientras
que secuencia suele reservarse para implementaciones sobre memoria secundaria.
La lista es una estructura dinmica ya que su longitud depender del nmero de elementos que tenga,
aumentar al insertar y se reducir al suprimir. Ahora bien, la lista puede implementarse de formas muy
diferentes. Una de ellas es mediante arreglos. As, la lista, que es dinmica independientemente de su
implementacin, se realiza mediante una implementacin esttica.

Estructura

Es un conjunto de elementos entrelazados regidos por una serie de leyes. En general, las estructuras que
nos presenta el mundo real estn regidas por las leyes fsicas.

Estructura de Datos

Una estructura de datos es una coleccin organizada de elementos de datos bajo las leyes de la
informtica. Estos elementos, o ladrillos, son los tipos de datos, con los cuales se forman las estructuras
de datos que incluyen los diferentes lenguajes:

Binarios
Enteros

7
Reales
Caracteres
o Doble precisin
o Vectores
o Arreglos bidimensionales
o Arreglos n-dimensionales
o Registros
Complejos

El tipo de dato determina:

Los rangos de la variable.


La cantidad de memoria que se le asigna a la variable.
Las operaciones que se pueden realizar.

Debido a lo limitado de los lenguajes de alto nivel, los programadores estaban insatisfechos por el nivel
de abstraccin que lograban.

Este problema, se ha superado al proveer los nuevos lenguajes con mecanismos que le permiten al
programador construir sus propias abstracciones con base en su necesidad, a travs de los tipos de datos
definidos por el usuario.

El enfoque de los nuevos lenguajes, orientados por objetos, es tener un conjunto fijo de estructuras y un
conjunto poderoso de primitivas que permiten su manipulacin, brindandole al usuario la oportunidad
de definir datos (atributos) y operaciones (mtodos).

Estructura Lgica. Es la estructura que define el usuario a nivel de anlisis y parte de diseo, al
relacionar lgicamente los elementos para satisfacer un requerimiento determinado.

Estructura Fsica. Corresponde a la forma en que a travs de un lenguaje de programacin se crea la


estructura lgica, en memoria auxiliar.

struct ID_CARRO {
char placa[6];
struct PROPIETARIO prop;
struct CARACTER car;
};

struct PROPIETARIO {

8
char direccion[50];
struct NOMBRE nomb;
};
struct CARACTERISTICAS {
char marca[20];
int modelo[2];
char color[10];
};
struct NOMBRE {
char nombre[10];
char apellido_1[10];
char apellido_2[10];
};

1.2 OPERACIONES SOBRE ESTRUCTURAS DE DATOS.


Son varias las operaciones que se efectan sobre las estructuras de datos, y una vez establecidas se
definen como funciones.

Funcin Constructora Son los algoritmos y mecanismos que permiten construir una estructura.
Asigna memoria en forma dinmica o espacios en medios magnticos.

Funcin Destructora Son los algoritmos y mecanismos que desasignan memoria y liberan recursos
del sistema.

Funcin de Acceso Son los algoritmos a travs de los cuales se llega a una estructura y sus elementos

Funcin de Prueba Por medio de la funcin de acceso se llega a un elemento y se prueba si posee
determinado atributo.

Funcin de Insercin Permite la inclusin de un elemento en una estructura.

Funcin de Eliminacin Permite la exclusin de un elemento de una estructura.

Funcin Inversa Las funciones de acceso proveen un nombre o valor. Estas funciones son los
mecanismos o procesos, en que dado un valor o un nombre, se determina la posicin del elemento de
dato en la estructura.

9
TEMA 2

PILAS Y COLAS
OBJETIVOS

Emplear y desarrollar aplicaciones empleando estructuras estticas de datos como apoyo a procesos
ms complejos.

CONTENIDO

2.1 Pilas
2.2 Colas
2.3 Colas Circulares
2.4 Aplicaciones de Listas Restringidas
2.5 Ejercicios

En este captulo se introducen dos tipos de listas, pilas y colas, que se pueden actualizar, solo de una
manera muy limitada. Son estructuras bastante importantes utilizadas en multitud de aplicaciones.

2.1 PILAS.
Una pila es una lista en donde tanto las inserciones como las supresiones se hacen por el mismo
extremo, que se conoce como el tope de la pila.

Por ejemplo, la pila de carritos de los supermercados, porque el ltimo carro que se coloca es el
primero que se saca. Esta propiedad de la pila se conoce como LIFO (Last In First Out; ltimo que
entra primero que sale).

PILA SECUENCIAL

Aqu se trabaja como una lista secuencial de acceso restringido. Para su manejo se requieren dos
apuntadores, uno que indica la posicin del ltimo elemento insertado, llamado TOPE de la pila, y otro
denominado BASE que apunta al fondo de la pila. Cuando la pila est vaca, no hay elementos,
BASE=TOPE.

Figura 2.1 Pila, se inserta y se elimina por el mismo extremo. El apuntador TOPE apunta al ltimo
elemento de la pila; el apuntador BASE no apunta a ningn elemento de la pila

10
OPERACIONES CON PILAS

Las operaciones primitivas que se efectan sobre una pila son:

1. Iniciar la pila (dejarla en condiciones de pila vaca).


2. Probar si la pila est vaca.
3. Acceder al elemento del tope de la pila.
4. Insertar un elemento en el tope de la pila (PUSH).
5. Eliminar el elemento tope de la pila (POP).
6. Destruir la pila.

Para la implementacin de esta estructura de datos, se har uso de un arreglo que aqu llamamos PILA,
de dimensin M. Esta es la estructura esttica con la que se trabajan estos algoritmos.

Iniciacin de una pila. En el arreglo PILA, se inicia la lista restringida.

Precondicin: Que exista el arreglo.


Poscondicin: Condicin de pila vaca.

INIC_PILA
Inicio
BASE = 0
TOPE = BASE
Fin

Aqu, la base apunta al elemento 0 del arreglo, que como se haba determinado, no corresponde a
ningn elemento de la lista.

Prueba de Pila Vaca: En general es importante, para todo tipo de estructura, establecer si se
encuentra vaca, pues el proceso vara dependiendo de esta condicin.

Este algoritmo retorna un valor verdadero si la pila est vaca.

Precondicin: No hay.
Poscondicin: Retorna verdadero cuando no hay elementos en la pila. En caso
contrario retorna el valor falso.

ENTERO PILA_VACIA()
Inicio
Si (TOPE==BASE) Entonces
RETORNA VERDADERO
Sino
RETORNA FALSO
Fin-Si
Fin

Esta rutina se emplea en el algoritmo ELIM_PILA que saca el elemento que apunta el TOPE de la pila.

11
Acceder al Elemento Tope de la Pila: Con esta operacin se lee el ltimo elemento de la pila y se
lleva a DATO.

Precondicin: Pila vlida.


Poscondicin: En DATO queda una copia del elemento que apunta el ndice
TOPE si hay elementos en la pila, en caso contrario DATO queda indefinido.

ACCE_PILA(DATO,I)
Inicio
I = Verdadero
Si (NO PILA_VACIA()) Entonces
DATO = PILA[TOPE]
Sino
I = Falso
Fin-Si
Fin

Insertar un Dato en la Pila: Se coloca DATO en un nodo que queda en el TOPE de la pila. Es posible
que no se pueda hacer la insercin debido a que no hay nodos disponibles recordemos que con la
variable I se indica si se pudo, o no, hacer la insercin.

Precondicin: TOPE < M


Poscondicin: I verdadero indica que se hizo la insercin de DATO y el ndice
TOPE apunta a DATO.

INSER_PILA(DATO,I)
Inicio
I = Verdadero
Si (TOPE>=M) Entonces
I = Falso
Sino
TOPE = TOPE + 1
PILA[TOPE] = DATO
Fin-Si
Fin

Figura 2.2 Estado de la pila luego de la insercin

La condicin de saturacin generalmente es un error y significa que el rea disponible est llena y que
aun se tratan de colocar ms datos en ella. La poltica comn es, en primer lugar, tratar de manejar
dicha condicin para superarla, o rechazar la insercin e informar al sistema operacional para una
terminacin anormal de la tarea.

12
Eliminar un Elemento de la Pila: En DATO se coloca el elemento que inicialmente apunta al TOPE
de la pila. Al disminuir TOPE el elemento anterior permanece en el rea de memoria como basura.

Precondicin: Pila vlida.


Poscondicin: Si se pudo realizar la operacin, I verdadero, DATO queda con
elemento que haba en el tope de la pila. Si la pila estaba vaca I es falso y DATO
indeterminado.

ALGORITMO ELIM_PILA(DATO,I)
Inicio
I = Verdadero
Si (NO PILA_VACIA()) Entonces
DATO = PILA[TOPE]
TOPE = TOPE - 1
Sino
I = Falso
Fin-Si
Fin

La condicin de pila vaca se presenta cuando se trata de obtener un elemento inexistente, la cual no es
una condicin de error.

Esta condicin se puede considerar en el sentido de que hay una serie de recursos disponibles para
procesar el DATO que se espera, en caso de que no llegue, simplemente se liberan los recursos o se
inicia el proceso de los datos anteriores.

Es semejante a la condicin que se presenta cuando se est procesando un archivo secuencial y se llega
al fin del archivo.

Destruir la Pila. Se sacan todos los elementos de la lista.

Precondicin: Pila vlida.


Poscondicin: Pila vaca.

ALGORITMO DEST_PILA
Inicio
I = Verdadero
Mientras I Hacer
ELIM_PILA(DATO,I)
Rutina_usa (Dato)
Fin-M
Fin

En muchas aplicaciones es necesario vaciar la pila, para esto se incluye la rutina apropiada que utiliza
DATO dentro del ciclo.

13
DISTRIBUCIN DE PILAS.

En los lenguajes de programacin, las subrutinas y los diferentes componentes de los sistemas
operacionales requieren la utilizacin de varias pilas, las cuales se pueden disponer de muchas formas,
buscando optimizar el uso de la memoria.

Manejo de Dos Pilas y Operaciones Primitivas.

Como se vio en la insercin, el hecho de que haya saturacin implica una terminacin anormal,
perdindose todo lo procesado.

Figura 2.3 Pilas enfrentadas. El rea comn es todo el arreglo con sus M elementos. La base de la pila
1 tiene el ndice 0 y el ndice de la base de la pila 2 es M.

Se debe observar la figura 2.3 y dejar claro cmo se trabajan los ndices y a que nodos apuntan. En los
siguientes algoritmos se incluye la variable IP (indicador de pila) que dir sobre cual de las dos pilas se
debe realizar la operacin.

Iniciacin de las Pilas.

Precondicin: Arreglo vlido.


Poscondicin: Las dos pilas en condicin de pila vaca.

INIC2PILAS
Inicio
BASE1 = 0; TOPE1 = BASE1
BASE2 = M; TOPE2 = BASE2
Fin

Prueba de Pila Vaca

Precondicin: IP solo puede timar valores 1 o 2.


Poscondicin: No hay cambio en la pila. Vaca queda en V si la pila IP est vaca
sino vaca queda en F.

ALGORITMO 2PILASVAC(IP,VACIA)
Inicio
Si (IP=1) Entonces
Si (BASE1 = TOPE1)
VACIA = V
Sino
VACIA = F

14
Fin-Si
Sino
Si (BASE2 = TOPE2)
VACIA = V
Sino
VACIA = F
Fin-Si
Fin-Si
Fin

Acceder al Elemento de una de las Dos Pilas

Precondcin: IP solo puede tomar valores de 1 o 2.


Poscondicin: Si hay datos en la pila IP, I es falso, y en Dato queda copia del
elemento indicado por el tope de la pila IP, sino I es verdadero.

ACC2PILAS(DATO,IP,I)
Inicio
I = V
2PILASVAC(IP,VACIA)
Si (VACIA) Entonces
I = F
Sino
Si (IP=1) Entonces
DATO = PILA[TOPE1]
Sino
DATO = PILA[TOPE2]
Fin-Si
Fin-Si
Fin

Insertar un Dato en una de las Dos Pilas.

Precondicin: IP es 1 o 2, no hay saturacin mientras ( TOPE1+1) < TOPE2.


Poscondicin: Insercin de DATO en una de las dos pilas o la imposibilidad de
hacerlo, I=FALSO.

ALGORITMO INSER2PILAS(DATO,IP,I)
Incio
I = F
Si ((TOPE1+1) < TOPE2) Entonces
Si (IP=1) Entonces
TOPE1 = TOPE1 + 1
PILA[TOPE1] = DATO
Sino
TOPE2 = TOPE2 - 1
PILA[TOPE2] = DATO
Fin-Si
Sino
I = V
Fin-Si
Fin

15
Eliminar un Elemento de una de las Pilas

Precondicin: IP solo puede tomar los valores 1 o 2.


Poscondicin: Se elimina el elemento tope de pila IP.

ALGORITMO ELIM2PILAS(DATO,IP,I)
Inicio
I = V
2PILASVAC(IP,VACIA)
Si (NO VACIA) Entonces
Si (IP = 1) Entonces
DATO = PILA[TOPE1]
TOPE1 = TOPE1 - 1
Sino
DATO = PILA[TOPE2]
TOPE2 = TOPE2 + 1
Fin-Si
Sino
I = F
Fin-Si
Fin

Destruir una de las Pilas.

Precondicin:
Poscondicin: Se elimina el elemento tope de pila IP.

ALGORITMO DESTR2PILAS(IP)
Incio
Si (IP = 1) Entonces
Mientras I Ejecute
ELIM_2PILAS(DATO,IP,I)
Rutina_Usa(Dato)
Fin-M
Sino
Mientras I Ejecute
ELIM_2PILAS(DATO,IP,I)
Rutina_Usa(Dato)
Fin-M
Fin-Si
Fin

16
2.2 COLAS.
Es una lista de proceso restringido en la cual las inserciones se hacen por un extremo llamado "ltimo"
y las eliminaciones se hacen por el otro extremo llamado "delantero". Por ejemplo, los aviones que
esperan despegar de un aeropuerto forman una cola, el que llega a la pista queda de ltimo y el que va a
despegar est de delantero en la cola. Se dice que una cola tiene poltica FIFO(First In, First Out) El
primer elemento en entrar ser el primero en salir.

COLA SECUENCIAL

Aqu se trabaja la cola como una lista secuencial de acceso restringido, dentro del arreglo COLA. Para
su manejo se requieren dos ndices, ULTIMO que indica el ltimo elemento insertado en la cola, y
DELANTERO que indica el primer elemento de la cola.

Figura 2.4 Cola, se inserta por el ltimo y se suprime por delante. El apuntador U, ltimo, apunta al
ltimo elemento insertado. El apuntador D, delantero, apunta al primer elemento en la cola

OPERACIONES CON COLAS

Sobre una cola se pueden efectuar las siguientes operaciones primitivas, similares a las operaciones de
la pila:

1. Iniciar una cola


2. Probar si la cola est vaca
3. Acceder al elemento delantero de la cola
4. Insertar un elemento en la cola
5. Eliminar el elemento delantero de la cola
6. Destruir la cola

INICIAR COLA.

Se tiene un arreglo COLA asignado para almacenar la cola, con M posiciones disponibles.

Precondicin: Arreglo vlido


Poscondicin: Se tiene condicin de cola vaca

INIC-COLA
Inicio
D = 0
U = D
Fin

17
PROBAR SI LA COLA EST VACA

Precondicin: Arreglo vlido


Poscondicin: Si la cola est vaca retorna verdadero, sino falso.
ENTERO COLA_VACIA()
Inicio
Si (D = 0) Entonces
RETORNA V
Sino
RETORNA F
Fin-Si
Fin

ACCEDER A UN ELEMENTO EN LA COLA

Precondicin: Arreglo vlido


Poscondicin: Se saca en DATO el elemento que indica D, sino I es falso.
ACCED-COLA(DATO,I)
Inicio
I = V
Si (NO COLA_VACIA()) Entonces
DATO = COLA[D]
Sino
I = F
Fin-Si
Fin

INSERTAR UN ELEMENTO EN LA COLA.

Se coloca DATO en el nodo siguiente al ltimo, quedando como ltimo. Es posible que no se pueda
hacer la insercin debido a que no hay espacio. La variable I indica si se pudo o no hacer la insercin.

Precondicin: Que exista la cola


Poscondicin: La cola queda con un elemento adicional DATO, que queda como
ltimo elemento de la cola, o hay terminacin normal.
INSER-COLA(DATO,I)
Inicio
I = V
Si (U > M) Entonces
I = F
Sino
Si (COLA_VACIA()) Entonces
D = 1
U = D
Sino
U = U + 1
Fin-Si
COLA[U] = DATO
Fin-Si
Fin

18
ELIMINAR UN ELEMENTO DE LA COLA.

Se elimina el elemento que est de delantero en la cola.

Precondicin: Que haya cola.


Poscondicin: Se elimina el primer elemento de la cola, si existe, sino, I = falso.
ELIM-COLA(DATO,I)
Inicio
Si (COLA_VACIA()) Entonces
I = F
Sino
Dato =Cola [D]
I = V
Si (D == U) Entonces
U = 0
D = U
Sino
D = D + 1
Fin-Si
Fin-Si
Fin

DESTRUIR LA COLA

Precondicin: Cola vlida.


Poscondicin: Cola vaca.
DESTRU-COLA(IP)
Inicio
I=V
Mientras I Ejecute
ELIM-COLA(DATO,I)
Rutina-Usa(Dato)
Fin-M
Fin

2.3 COLAS CIRCULARES.


Observemos que en el numeral anterior, al hacer eliminaciones, se va corriendo el apuntador D, y las
inserciones tambin van desplazando el apuntador U, llegando incluso a condiciones de saturacin,
cuando hay memoria desperdiciada. Una solucin a este inconveniente es formar una cola circular. Es
decir, hacer un manejo de ndices.

Figura 2.5 Despus de que U = M se U = 1.

19
Figura 2.6 Si se presenta una insercin, hay saturacin.

Los algoritmos de iniciacin, prueba, acceso y destruccin de la cola son similares a los del caso
anterior. Los de insercin y eliminacin vara por la condicin inicial: U=0 U=D; y por la condicin de
saturacin: D=U.

INSERCIN EN COLA CIRCULAR

Aunque es similar al de insercin en colas comunes, se debe considerar, cuando U = M, para enviarlo a
0. Tambin se debe tener en cuenta la nueva condicin de saturacin.

Precondicin:Que haya cola.


Poscondicin: D apunta al nuevo nodo, si hay espacio, sino, I =falso.
INSER-COL-CIR(DATO,I)
Inicio
I = V
Si (COLA_VACIA() Entonces
D = 1
U = 1
COLA[U] = DATO
Sino
U = U+1
Si (U = M) Entonces
U = 1
Sino
Fin-Si
Si (D=U) Entonces
I = F
Sino
COLA[U] = DATO
Fin-Si
Fin-Si
Fin

ELIMINAR EL NODO DELANTERO DE LA COLA

Figura 2.7 (a) Condicin inicial crtica


(b) Condicin final una vez se ha eliminado el nodo delantero

20
Precondicin: Que haya cola.
Poscondicin: U apunta al ltimo elemento de la cola, si hay elementos, sino,
queda la cola en condicin de cola vaca.
ALGORITMO ELIM-COLA-CIR(DATO,I)
Inicio
I = V
Si (COLA_VACIA()) Entonces
I = F
Sino
DATO = COLA[D]
Si (D=U) Entonces
D = 0
U = D
Sino
D = D + 1
Si (D = M) Entonces
D = 1
Sino
Fin-Si
Fin-Si
Fin-Si
Fin

21
2.4 APLICACIONES DE LISTAS RESTRINGIDAS.
Son muchas las aplicaciones de estas listas restringidas, en especial en sistemas operativos,
compiladores e interpretadores. Vamos a trabajar una aplicacin universal, la evaluacin de una
expresin.

ALGORITMO DE NOTACIN INFIJA A POSFIJA

La gran mayora de lenguajes representa las expresiones aritmticas en la llamada forma INFIJA, en la
cual los operadores se encuentran dentro de los operandos. Otra manera de hacerlo es usando notacin
POSFIJA o POLACA. En este tipo de notacin los operadores aparecen despus de los operandos, as
se facilita la evaluacin de la expresin.

Vamos a suponer que se tienen los siguientes operadores, con sus respectivas prioridades.

... Operador Prioridad


Asignacin = 0
Suma, Resta +,- 1
Multiplicacin,
*,/ 2
Divisin
Potencia ^ 3

El algoritmo analiza carcter a carcter la expresin infija, de izquierda a derecha y sigue el siguiente
manejo:

1. Todos los operandos pasan directamente a una cola salida.


2. Los operadores van a una pila. Su posicin depende de los que haya en el tope de la pila:

Si el operador que entra, tiene mayor prioridad que el operador que est en el tope de la pila, se
coloca en el tope de la pila.
Si el operador que entra es de prioridad menor o igual al del tope de la pila, la pila se desocupa
enviando los operadores a la cola, hasta que el operador tenga mayor prioridad al del tope de la
pila.

3. Si es un parntesis izquierdo "(", se manda a la pila.


4. Si es un parntesis derecho ")", se desocupa la pila hasta encontrar el parntesis izquierdo y se
mandan los operadores a la cola de salida.
5. Desocupar la pila.

La expresin infija que se va a convertir a posfija, se encuentra en un arreglo X, con N posiciones,


donde X[J], J=1,...,N; es una letra (operando), un parntesis izquierdo o derecho, o uno de los
operadores = , +, -, *, /, ^

Observaciones sobre la expresin infija.

1. Se supone que la entrada es una expresin infija vlida.

22
2. Los operandos consisten de una sola letra
3. No se espera la entrada de constantes ni de referencia a funciones
4. No deben aparecer funciones unarias.

Se define una funcin de prioridad P:

P( ) ) = -1 P(-) = 1
P(( ) = -1 P(*) = 2
P( = ) = 0 P(/) = 2
P(+) = 1 P(^) = 3

ALGORITMO INF-A-POSF
Precondicin: nicamente los caracteres ya definidos.
Poscondicin:

Comience
CREA_PILA
D = 0
TOPE = 0
INSER-PILA( ,I)
Si (I) Entonces
J = 1
K = 1
Mientras (K < N) Ejecute
Si (X[K] = LETRA) Entonces
Y[J] = X[K]
J = J+1
Sino
Si (X[K] = ")" ) Entonces
Mientras (PILA [TOPE]) <> "(" ) Ejecute
Y[J] = PILA[TOPE]
J = J+1
TOPE = TOPE - 1
Fin-Mientras
TOPE = TOPE - 1
Sino
Mientras (P(X[K])<= P(PILA[TOPE]) Ejecute
Y[J] = PILA[TOPE]
J = J+1
TOPE = TOPE-1
Fin-Mientras
TOPE=TOPE+1
PILA[TOPE] = X[K]
Fin-Si
Fin-Si
K=K+1
Fin-Mientras
Mientras [(PILA[TOPE]) <>(I)] Ejecute
Y[J] = PILA[TOPE]
J = J+1
TOPE = TOPE -1
Fin-Mientras

23
Sino
Fin-Si
Termine

ALGORITMO DE EVALUACIN EN NOTACIN POSFIJA

En este caso se tiene una expresin aritmtica en notacin posfija se encuentra en un arreglo X. Cada
X(J), J=1,...N., puede ser una letra o un operador (<= , +, -, *, /, ).

Los operandos se van guardando en una pila hasta cuando se encuentra un operador, que hace que se
ejecute esa operacin entre los dos nodos operandos que se tengan en los nodos superiores de la pila.

El resultado se guarda en el tope de la pila.

ALGORITMO EVAL-POL
Precondicin:
Poscondicin:

Comience
TOPE = 0
K = 1
Mientras (K<=N) Ejecute
Si (X[K] = OPERANDO) Entonces
TOPE = TOPE +1
PILA[TOPE] = X[K]
Sino
AUX1 = PILA[TOPE]
TOPE = TOPE-1
AUX2 = PILA[TOPE]
AUX3 = AUX2 (X[K]) AUX1
PILA[TOPE] = AUX3
Fin-Si
K = K +1
Fin-Mientras
Termine

Evaluacin de una expresin

Vamos a seguir los dos algoritmos anteriores para la evaluacin de la siguiente expresin: G = ((A-
B)*C)+(D/(E ^F))

1. Conversin a Posfija.

X COLA PILA
. .
1 G
2 G =
3 G =(
4 G =((

24
5 GA =((
6 GA =((-
7 GAB =((-
8 GAB- =(
9 GAB- =(*
10 GAB-C =(*
11 GAB-C* =
12 GAB-C* =+
13 GAB-C* =+(
14 GAB-C*D =+(
15 GAB-C*D =+(/
16 GAB-C*D =+(/(
17 GAB-C*DE =+(/(
18 GAB-C*DE =+(/(^
19 GAB-C*DEF =+(/(^
20 GAB-C*DEF^ =+(/
21 GAB-C*DEF^/ =+
22 GAB-C*DEF^/+
23 GAB-C*DEF^/+=

2. Evaluacin de la notacin Posfija, donde A=4, B=1, C=5, D=64 , E=2, F=5

X COLA PILA
1 G G
2 GA G4
3 GAB G41
4 G3 G3
5 G3C G35
6 G 15 G 15
7 G 15 D G 15 64
8 G 15 D E G 15 64 2
9 G 15 D E F G 15 64 2 5
10 G 15 D 32 G 15 64 32
11 G 15 2 G 15 2
12 G 17 G 17
13 17 17

25
TEMA 3

ARCHIVOS, REGISTROS Y CAMPOS


OBJETIVOS

Estructurar la informacin con el soporte fundamental para el almacenamiento externo de datos.

Aprovechar de una forma eficiente el medio de almacenamiento secundario de datos.

CONTENIDO
3.1 Archivos
3.2 Registros y Campos
3.3 Archivos Secuenciales y Directos

3.1 ARCHIVOS
Un archivo es un conjunto de registros relacionados entre s, que forman una entidad, que se puede
identificar y manipular de modo unitario.

Un archivo almacena grandes volmenes de informacin en unidades externas (Floppy, HD, Cintas ..).

3.2 TIPOS DE ARCHIVOS.


ARCHIVOS SECUENCIALES.

Son aquellos en los que los registros se graban unos a continuacin de otros y el acceso a un registros
determinado, necesita forzosamente el paso por todas los registros anteriores.

CAMPOS DE LONGITUD VARIABLE.

Se realiza este tipo de definicin de campos de longitud variable, con el objetivo principal de
ahorro de memoria, ya que con campos de longitud fija se realiza un desperdicio de memoria.
Para la implementacin de este tipo de campos se lo realiza con archivos de tipo texto.
Existen dos mecanismos de implementacin:

USO DE DELIMITACIONES

DELIMITADOR DE CAMPOS :

Existe un smbolo especfico para delimitar los campos ( , ; *)

DELIMITADOR DE REGISTROS :

Smbolo diferente al delimitador de campo.

Ejemplo :

26
Nombre Direccin Edad Lista de Materias

$CLAUDIA, BALLIVIN@ 17, SIS-2204, SIS-1103$ANA, LA PAZ@17, SIS-1103, MAT- 2207

SUBCAMPO DE LONGITUD

Registro con un numero constante de campos.

Ejemplo :

Nombre Direccin Edad Lista de Materias

7 CLAUDIA, 9 BALLIVIN, 2 17, 8 SIS-2204, 8 SIS-1103, 8 MAT- 2207

Para distinguir algunos registros que contienen los mismos campos se recurre a un campo que contiene
informacin nica o diferente que se le llama clave.

ARCHIVOS DIRECTOS.

Son aquellos en los que los registros se pueden localizar mediante una direccin. El acceso a los
registros es directo.

CAMPOS DE LONGITUD FIJA.

Los campos definidos de esta manera son almacenados en memoria con una longitud fija de datos,
sin importar si se realiza el uso parcial o completo del campo.

OPERACIONES SOBRE ARCHIVOS

Creacin. Consiste en la grabacin, por primera vez, en un soporte de los registros de un determinado
archivo.

Apertura y Cierre. Un archivo debe poseer las condiciones necesarias para ser abierto, manipularse y
tener acceso a los registros. Para evitar deterioros de informacin el archivo es cerrado durante el
tiempo que no se utiliza y no debe permitir su acceso.

Borrado. Es la eliminacin de todo el archivo, se puede hacer prohibiendo definitivamente su acceso o


destruyendo la informacin que hay en el.

Ordenamiento o Clasificacin. Es lograr una nueva disposicin en el soporte de los registros de un


archivo, con una secuencia de ubicacin determinada por el valor de sus campos. Este orden puede ser
ascendente o descendente.

Copiado o Duplicacin. Consiste en crear un archivo idntico a otro y existencte, sin que se afecte el
original.

27
Concatenacin. Consiste en obtener de dos archivos, con la misma estructura, un archivo que contenga
ambos, de manera que queden uno a continuacin del otro.

Interseccin. Consiste en formar un nico archivo mediante los registros comunes de dos archivos
distintos.

Funcin o Intercalacin. Llamada mezcla, consiste en obtener de dos archivos ordenados por un
mismo campo y con la misma estructura, otro archivo que contenga los registros de ambos y mantenga
su ordenacin.

Particin. Consiste en dividir un archivo en dos, de acuerdo a alguna caracterstica determinada de sus
registros.

Compactacin o Empaquetamiento. Consiste en reorganizar todos los registros de un archivo,


ocupando todos los huecos de memoria existentes entre ellos, dejen libres fuera de la parte de soporte
ocupada por el archivo todos los espacios correspondientes que hallan sido eliminados del mismo.

3.3 REGISTROS Y CAMPOS.


REGISTROS.

Un registro es un conjunto organizado de datos del mismo o diferente tipo, que estan relacionados entre
s por contener informacin relativa a una entidad particular y superior, de la que forman parte y los
unifica.

Los registros estn compuestos por campos. Un campo es una unidad mnima de informacin, dentro
del registro, independiente de las dems. Representa un concepto global en la finalidad unitaria del
registro y se caracteriza por el tipo de datos asociados y el tamao de memoria que necesita para su
almacenamiento. El campo se puede dividir en subcampos.

CAMPOS.

Los componentes de un registro se denominan campos, los campos son los atributos de los
objetos de estudio, cada campo tiene los siguientes atributos.

Nombre ( identificador ) de campo que es elegido por el programador.


Contenido o valor.
Ubicacin dentro del registro.
Longitud o dimensin.

TIPOS DE CAMPOS.

Existen tres tipos de campos

Longitud fija.
Longitud variable
Campos mltiples

28
TIPOS DE REGISTROS

Registro Lgico. Cada uno de los componentes de un archivo que posee una estructura para almacenar
informacin referente a un tema general del archivo. Diseado por el programador.

Registro Fsico. Informacin que el sistema puede transferir como una unidad, en una sola operacin de
entrada o salida. Registros segn la longitud de sus campos:

Registros de Longitud Fija. Su tamao no vara. En cuanto a su estructura interna, el registro puede
tener el mismo nmero de campos de igual longitud cada uno, o diverso nmero de campos de
diferentes longitudes. En ambos casos la suma de las longitudes de los campos es la misma para cada
registro.

Registros de Longitud Variable. Su tamao vara de un registro a otro. Su longitud variable puede estar
determinada por un valor mximo o tambin sin ninguna limitacin. Entre las agrupaciones
estructuradas de registros se tienen los archivos de datos y las bases de datos.

OPERACIONES SOBRE REGISTROS.

Aqu se analizan las operaciones que solo afectan a algunos registros. Todas estas operaciones
necesitan la operacin de bsqueda como preliminar para localizar los registros deseados.

Recuperacin (Consultas y Listados). Consiste en acceder a los registros de un archivo para obtener
una informacin determinada, almacenada en el.

Consultas: Se accede a uno o varios registros determinados de un archivo y se visualiza el


contenido de sus campos, por impresora o pantalla.
Listados: La visualizacin de la informacin es una lista ordenada.

Actualizacin o Mantenimiento. Consiste en introducir nuevos datos en el archivo o en eliminar o


modificar los ya existentes.

Inserciones: Se introducen uno o varios registros en un archivo, ya creado, al final o en


cualquier lugar del mismo.
Borrados: Se eliminan uno o varios registros del archivo, borrando su contenido definitivamente
o prohibiendo su acceso.
Modificaciones: Consiste en cambiar los datos de uno o varios campos de cualquier registro de
archivo.

29
TEMA 4

TRATAMIENTO DE ARCHIVOS
OBJETIVOS

Desarrollar las operaciones bsicas sobre la informacin almacenada en un medio secundario.

Desarrollar nuevos mecanismos de procesamiento de acuerdo a las caractersticas del problema.

CONTENIDO
4.1 Introduccin
4.2 Operaciones en Archivos
4.3 Particin de Archivos
4.4 Mezclas de Archivos
4.5 Mtodos Ordenacin Externa

4.1 INTRODUCCION
Un archivo es una coleccin de registros, donde cada registro esta conformado por un conjunto de
campos.

El objetivo principal del siguiente tema es realizar las siguientes operaciones para el tratamiento de
archivos:

1. Almacenamiento de informacin.
2. Recuperacin de informacin.
3. Actualizacin de la informacin.

Se hace nfasis en la recuperacin de la informacin, debido a que esta es imprescindible para el


usuario, para contar con informacin en forma inmediata, para lo cual se toca el tema de mtodos de
ordenacin externa.

4.2 OPERACIONES SOBRE ARCHIVOS


Las operaciones bsicas sobre archivos son:

1. Adicin de datos
2. Eliminacin de datos
3. Consultas
4. Bsquedas

Existen otras operaciones complejas, las cuales son:

1. Particin de Archivos
2. Mezcla o fusin de Archivos

30
Estas ltimas son operaciones auxiliares, necesarias para los mtodos de ordenacin externa.

ADICION DE DATOS

Una de las tareas mas comunes en archivos es la adicin de datos, se puede aadir datos de dos
maneras a un archivo:

1. Adicin de datos en desorden


2. Manteniendo el orden del archivo

ADICION DE DATOS EN DESORDEN (al final).

Pasos a realizar para aadir un registro en un archivo:


1. Leer Dato.
2. Buscar Dato en el Archivo.
3. Si existe entonces:
mostrar ' Ya Existe '.

Si no :
Aadir el dato al final del Archivo

ADICION DE DATOS EN ORDEN

Para aadir un registro manteniendo el orden del archivo, es necesario el uso de un archivo auxiliar.

Se deben seguir los siguientes:

31
ELIMINAR DATOS

Se puede eliminar datos de dos maneras:

1. Eliminar lgicamente
2. Eliminara fsicamente

FSICAMENTE:

En este tipo de eliminacin es necesario usar un archivo Auxiliar, por lo que este proceso es lento, y
por lo tanto no es usado con frecuencia.

LOGICAMENTE:

Este tipo de eliminacin ahorra tiempo cuando se usa grandes volmenes de informacin. Ya que se
cuenta con un campo adicional, que permite marcar el registro como eliminado.

32
Muchas aplicaciones usan primeramente la eliminacin lgica, y al finalizar el da utilizan la
eliminacin de fsica. Esto por ser ms rpida la eliminacin lgica que la eliminacin fsica.

CONSULTAS DE DATOS

Se recupera la informacin sin alterar el estado del registro, para lo cual debe existir un criterio de
seleccin de la informacin.

CRITERIOS DE SELECCIN

Consulta Simple:

Cuando la clave del registro es especfica y hace referencia a un solo registr.


Ejemplo:

Mientras no eof (F) y reg <= clave hacer


Leer (F,reg)
SI Nombre = 'Veronica' ENTONCES
......
FIN SI
Fin mientras

Consultas con rango:

El valor de la clave especificada hace referencia a un conjunto o rango de registros.


Ejemplo :

Mientras no eof (F) y reg <= clave hacer


Leer (F,reg)
SI Edad > 17 ENTONCES
......
FIN SI
Fin mientras

Consulta funcional:

La clave hace referencia a valores que responden, a la evaluacin de un proceso o fusin.


Ejemplo:

Mientras no eof (F) y reg <= clave hacer


Leer (F,reg)
SI Edad = prom(Edad) ENTONCES
......
FIN SI

33
Fin mientras

Consulta lgicas:

Una combinacin de las tres anteriores por medio de operaciones logicas.


Ejemplo:

Mientras no eof (F) y reg <= clave hacer


Leer (F,reg)
SI Edad = prom(Edad) or Nombre ='Martha' ENTONCES
......
FIN SI
Fin mientras

BUSQUEDA DE DATOS

Existen dos formas de bsqueda de datos:

1. Secuencial en un archivo ordenado


2. Secuencial en un archivo desordenado

BSQUEDA SECUENCIAL EN UN ARCHIVO ORDENADO

Se realiza el recorrido de los registros de archivo hasta el incumplimiento de una condicin o que
finalice el archivo.

Ejemplo: Realizar la bsqueda del registro, donde Dato='MARIA'.

Inicio
Leer Clave
Abrir (F,Lectura)
Leer (F,reg)
Mientras no eof (F) y reg <= clave hacer
Leer (F,reg)
Fin mientras
Si reg=clave Entonces
Mostrar " Existe el dato"
Si no
Mostrar "No existe el dato"
Fin si
Cerrar (F)
Fin

34
BSQUEDA SECUENCIAL EN UN ARCHIVO DESORDENADO

Se realiza el recorrido de los registros hasta encontrar el registro o hasta que se finalice el archivo.

Ejemplo: Realizar la bsqueda del registro, donde Dato='MARIA'.

ALGORITMO
Inicio
Leer Dato
Abrir (F,Lectura)
Leer (F,reg)
Mientras no eof (F) y reg <> clave hacer
Leer (F,reg)
Fin mientras
Si reg=clave Entonces
Mostrar " Existe el dato"
Si no
Mostrar "No existe el dato"
Fin si
Cerrar (F)
Fin

4.3 PARTICION DE ARCHIVOS


A partir de un archivo se genera dos o ms archivos de trabajo

Existen tres tipos de particin de archivos:

1. Particin por el contenido


2. Particin por una secuencia ' P ' dada.
3. Particin por secuencias ordenadas.

35
PARTICION POR CONTENIDO

Se debe establecer un criterio de particin, para determinar que registros de F1 se destinan al archivo
F2.

Donde el archivo F1 es solo lectura y el archivo F2 para escritura.

Ejemplo: Crear un archivo llamado CARRERA seleccionando Clave = 'SIS' del Archivo FNI.

ALGORITMO
Inicio
Leer Clave
Abrir FNI (Lectura)
Abrir Carrera (Escritura)
Mientras no eof (FNI) Hacer
Leer (FNI, Reg)
Si Reg = Clave Entonces
Grabar (Carrera, Reg)
Fin si
Fin Mientras
Cerrar (FNI)
Cerrar (Carrera)
Fin

PARTICION POR UNA SECUENCIA " P " DADA

Se establece un numero entero P que ndica las secuencias para realizar la particin. Se copia 'P'
registros de Arch a Arch1, luego los siguientes 'P' registros de Arch a Arch2, esto se repite hasta
terminar de leer el archivo Arch

Ejemplo:
Realizar la particin del archivo ARCH en dos archivos ARCH1 y ARCH2, utilizando la secuencia de
particin (P = 2).

36
ALGORITMO
Inicio
Leer (P)
Abrir Arch(Lectura)
Abrir Arch1(Escritura)
Abrir Arch2(Escritura)
Mientras no eof (Arch) Hacer
Copiar_Secuencia(Arch, Arch1, P)
Si no eof (Arch) Entonces
Copiar_Secuencia(Arch, Arch2, P)
Fin si
Fin Mientras
Cerrar (Arch)
Cerrar (Arch1)
Cerrar (Arch2)
Fin

Copiar_Secuencia (Var x, y : Archivo; P: entero)


Inicio
Cont = 0
Mientras (no eof (x)) y (cont < P ) Hacer
Leer (x, Reg)
Grabar (y, Reg)
Cont = Cont +1
Fin mientras
Fin

PARTICIN DE ARCHIVOS POR TRAMOS ORDENADOS

Se toma primeramente un tramo ordenado del archivo C y se copia al archivo A, luego se toma otro
tramo ordenado del archivo C para copiarlo al archivo B este proceso se repite hasta que finalice de leer
todo el archivo C.

Ejemplo: Particionar el archivo C en dos archivos A y B por secuencias ordenadas.

ALGORITMO
Inicio
Abrir A (Lectura)
Abrir B (Lectura)
Abrir C (Escritura)
Mientras no eof (C) Hacer
Copiar_Tramo (C, A )
Si no eof (C) Entonces
Copiar_Tramo (C, B )

37
Fin si
Fin Mientras
Cerrar (A)
Cerrar (B)
Cerrar (C)
Fin

Copiar_Tramo (Var x, y : Archivo)


Inicio
Repetir
Copiar_Dato ( x, y )
Hasta Fin_Tramo
Fin

Copiar _Dato ( Var x, y :Archivo)


Inicio
Si eof (x) Entonces
Fin_Tramo = TRUE
Si no
Leer (x, Reg)
Grabar (y, Reg)
Si eof (x) Entonces
Fin_Tramo = TRUE
Si no
Pos = File Pos (x)
Leer (x, Reg1)
Seek (x, Pos)
Fin_Tramo = Reg > Reg1
Fin si
Fin si
Fin

4.4 MEZCLAS DE ARCHIVOS


El proceso de unir dos o ms archivos se le denomina mezcla de archivos.

Existen tres tipos al igual que en particiones:

1. Mezcla por Contenido Total.


2. Mezcla por Secuencias " P ".
3. Mezcla por Secuencias Ordenadas.

38
MEZCLA POR CONTENIDO TOTAL

Se procede a la unin de dos archivos A, B en un archivo C, este proceso se los realiza primeramente
copiando toda la informacin de A al C y posteriormente B al C.

Ejemplo:
Mezclar los Archivos A, B en un tercer archivo C.

ALGORITMO
Inicio
Abrir A (Lectura)
Abrir B (Lectura)
Abrir C (Escritura)
Mientras no eof (A) Hacer
Leer (A, Reg)
Grabar (C, Reg)
Fin Mientras
Mientras no eof (B) Hacer
Leer (B, Reg)
Grabar (C, Reg)
Fin Mientras
Cerrar (A)
Cerrar (B)
Cerrar (C)
Fin

MEZCLA POR SECUENCIAS " P "

Se establece un numero entero 'P', que indica las secuencias para realizar la mezcla de dos archivos. El
resultado de la mezcla es una secuencia ordenada de datos.

Ejemplo: Realizar la Mezcla de A, B en un tercer archivo C, utilizando las secuencias P = 2 para


realizar dicha operacin.

39
ALGORITMO
Inicio
Leer (P)
Abrir A (Lectura)
Abrir B (Lectura)
Abrir C (Escritura)

Mientras no eof (A) y no eof (B) Hacer


Mezclar_SecP
Fin Mientras
Mientras no eof (A) Hacer
Copiar_SecP (A, C, P)
Fin Mientras
Mientras no eof (B) Hacer
Copiar_SecP (B, C, P)
Fin Mientras

Cerrar (A)
Cerrar (B)
Cerrar (C)
Fin

Mezclar_SecP
Inicio
SecA =0; SecB=0
Repetir
PosA = FilePos(A);Leer(A, RegA);Seek (A, PosA)
PosB = FilePos(B);Leer(B, RegB);Seek (B, PosB)

Si RegA < RegB Entonces


Copiar_SecP (A, C,P)
SecA=SecA+1
Si SecA=P Entonces
Copiar_SecP (B, C,P-SecB)
SecB =P
Fin Si
Si no
Copiar_SecP (B, C,P)
SecB=SecB+1
Si SecB=P Entonces
Copiar_SecP(A, C,P-SecA)
SecA =P
Fin si
Fin si
Hasta SecA=P y SecB=P
Fin

Copiar_SecP (Var x, y : Archivo; P : Entero)


Inicio
Cont = 0
Mientras no eof (x) y Cont < P Hacer
Leer (x, Reg); Grabar (y, Reg)
Cont = Cont +1
Fin Mientras
Fin

40
MEZCLA POR TRAMOS ORDENADAS

Se realiza la mezcla los archivos A y B en el archivo C, tomando tramos ordenados. Es decir se realiza
la mezcla del primer tramo ordenado de A con la de B.

Ejemplo: Realizar la mezcla A y B en un tercer archivo C, utilizando las secuencias ordenadas.

ALGORITMO
Inicio
Abrir A (Lectura)
Abrir B (Lectura)
Abrir C (Escritura)
Mientras no eof (A) y no eof (B) Hacer
Mezclar_Tramo
Fin Mientras
Mientras no eof (A) Hacer
Copiar_Tramo (A, C)
Fin Mientras
Mientras no eof (B) Hacer
Copiar_Tramo (B, C)
Fin Mientras
Cerrar (A)
Cerrar (B)
Cerrar (C)
Fin

Mezclar_Tramo
Inicio
Repetir
PosA = FilePos (A)
Leer (A, RegA)
Seek (A, PosA)

PosB = FilePos (B)


Leer (B, RegB)
Seek (B, PosB)

Si Reg1 < Reg2 Entonces


Copiar_Dato (A, C)
Si Fin_Tramo Entonces
Copiar_Tramo (B, C)
Fin Si
Si no
Copiar_Dato (B, C)
Si Fin_Tramo Entonces

41
Copiar_Tramo (A, C)
Fin si
Fin si
Hasta Fin _Tramo
Fin

Copiar_Tramo ( Var x, y : Archivo)


Inicio
Repetir
Copiar_Dato (x, y)
Hasta Fin_Tramo
Fin

Copiar_Dato (Var x, y: Archivo)


Inicio
Si eof (x) Entonces
Fin_Tramo = TRUE
Si no
Leer (x, Reg)
Grabar (y, Reg)
Si eof (x) Entonces
Fin_Tramo = TRUE
Si no
Pos = File Pos (x)
Leer (x, Reg1)
Seek (x,Pos)
Fin_Tramo = Reg > Reg1
Fin si
Fin si
Fin

4.5 ORDENACIN EXTERNA


Debido a la limitacin en memoria interna y a la enorme informacin que es almacenada en los
archivos, no es posible utilizar los mtodos de ordenacin interna. Para lo cual existen distintos
mtodos de ordenacin externa exclusivos que son las siguientes:

Ordenacin por Mezcla Directa.


Ordenacin Von Newman.
Ordenacin por Mezcla Equilibrada.
Ordenacin por Dgitos.

Todos estos mtodos hacen el uso de archivos auxiliares, para realizar el proceso de ordenacin de
archivos.

ORDENACIN POR MEZCLA DIRECTA

El mtodo solo funciona con archivos donde su longitud sea mltiplo de 2n, hace el uso de los
siguientes archivos:

42
C Archivo a ordenar
A,B Archivos auxiliares

Se deben seguir los siguientes pasos para ordenar:

1. Partir el archivo C en la mitad, copiar la primera mitad del archivo C en el archivo A, y la otra
mitad en el archivo B.
2. Mezclar los archivos auxiliares A y B por secuencias de 2n. Donde: n = 0,1,2,3...
3. Repetir los pasos 1 y 2 hasta que la secuencia sea mayor que la mitad del archivo a ordenar
(secuencia{2n}> long(C)/2)

Ejemplo:

Ordenar los siguientes datos.

ALGORITMO
Inicio
Sec = 1
Abrir C (Lectura)
Repetir
Abrir B (Escritura)
Abrir A (Escritura)
Seek (C, 0)
Particionar
Seek (A, 0); Seek (B, 0); Seek (C, 0)
Mezclar

43
Cerrar A; Cerrar B
Sec = Sec * 2
Hasta Sec > (Filesize (C) Div 2)
Cerrar C
Fin

Particionar
Inicio
Max = Filesize (C) Div 2
Para J = 1 Hasta Max Hacer
Leer C, Reg
Grabar A, Reg
Fin Para
Para J = 1 Hasta Max Hacer
Leer C, Reg
Grabar B, Reg
Fin Para
Fin

Mezclar
Inicio
Mientras no eof (A) y no eof (B) Hacer
Mezclar_Sec
Fin Mientras
Fin

Mezclar_Sec
Inicio
SecA = 0; SecB = 0
Repetir
PosA = FilePos (A); Leer A, RegA; Seek (A, PosA)
PosB = FilePos (B); Leer B, RegB; Seek (B, PosB)
Si RegA < RegB Entonces
Leer A, Reg
Grabar C, Reg
SecA =SecA + 1
Si SecA = Sec Entonces
Copiar_SecP (B, C, Sec-SecB);
SecB = Sec
Fin si
Si no
Leer B, Reg
Grabar C, Reg
SecB = SecB + 1
Si SecB = Sec Entonces
Copiar_SecP (A, C, Sec-SecA);
SecA = Sec
Fin si
Fin si
Hasta (SecA = Sec) y (SecB = Sec)
Fin

Copiar_SecP (Var x, y : Archivo; Sec : Entero)


Inicio
Cont = 0
Mientras no eof (x) y (Cont < Sec) Hacer
Leer (x, Reg)
Grabar (y, Reg)
Cont = Cont +1;

44
Fin Mientras
Fin

ORDENACIN POR VON NEWMAN

El mtodo solo funciona con archivos donde su longitud sea mltiplo de 2n, hace el uso de los
siguientes archivos:

C Archivo a ordenar
A,B Archivos auxiliares

Se deben seguir los siguientes pasos para ordenar:

1. Partir el archivo C en secuencias de 2n, copiar intercaladamente las secuencias del archivo C,
primeramente en el archivo A, y luego en el archivo B.
2. Mezclar los archivos auxiliares A y B por secuencias de 2n. Donde: n = 0,1,2,3...
3. Repetir los pasos 1 y 2 hasta que la secuencia sea mayor que la mitad del archivo a ordenar
(secuencia{2n}> long(C)/2)

Ejemplo:

Ordenar los siguientes datos.

45
ALGORITMO
Inicio
Sec = 1
Abrir C (Lectura)
Repetir
Abrir B (Escritura)
Abrir A (Escritura)
Seek (C, 0)
Particionar
Seek (A, 0); Seek (B, 0); Seek (C, 0)
Mezclar
Cerrar A; Cerrar B
Sec = Sec * 2
Hasta Sec > (Filesize (C) Div 2)
Cerrar C
Fin

Particionar
Inicio
Mientras no eof (C) Hacer
Copiar_SecP (C, A, Sec)
Si no eof (C) Entonces
Copiar_SecP(C,B,Sec)
Fin si
Fin mientras
Fin

Copiar_SecP (Var x, y : Archivo; Sec : Entero)


Inicio
Cont = 0
Mientras no eof (x) y (Cont < Sec) Hacer
Leer (x, Reg)
Grabar (y, Reg)
Cont = Cont +1;
Fin Mientras
Fin

Mezclar
Inicio
Mientras no eof (A) y no eof (B) Hacer
Mezclar_Sec
Fin Mientras
Fin

Mezclar_Sec
Inicio
SecA = 0; SecB = 0
Repetir
PosA = FilePos (A)
Leer A, RegA
Seek (A, PosA)

PosB = FilePos (B)


Leer B, RegB
Seek (B, PosB)

46
Si RegA < RegB Entonces
Leer A, Reg
Grabar C, Reg
SecA =SecA + 1
Si SecA = Sec Entonces
Copiar_SecP (B, C, Sec-SecB);
SecB = Sec
Fin si
Si no
SecB = SecB + 1
Si SecB = Sec Entonces
Copiar_SecP (A, C, Sec-SecA);
SecA = Sec
Fin si
Fin si
Hasta (SecA = Sec) y (SecB = Sec)
Fin

ORDENACIN POR MEZCLA EQUILIBRADA

El mtodo funciona con todo tipo de archivos, hace el uso de los siguientes archivos:

C Archivo a ordenar
A,B Archivos auxiliares

Se deben seguir los siguientes pasos para ordenar:

1. Partir el archivo C en secuencias ordenadas, copiar intercaladamente las secuencias ordenadas


del archivo C, primeramente en el archivo A, y luego en el archivo B.
2. Mezclar los archivos auxiliares A y B por secuencias ordenadas.
3. Repetir los pasos 1 y 2 hasta que la mezcla de secuencias sea igual a uno (n_tramos=1).

Ejemplo: Ordenar los siguientes datos.

47
ALGORITMO
PRINCIPAL
Inicio
Abrir C (Lectura)
Repetir
Abrir A (Escritura);Abrir B (Escritura);
Seek (C, 0)
Particionar
Seek (C, 0); Seek (A, 0); Seek (B, 0)
Num_Tramos = 0
Mezclar;
Cerrar A; Cerrar B
Hasta Num_Tramos =1
Cerrar C
Fin

Particionar
Inicio
Mientras no eof (C) Hacer
Copiar Tramo (C, A)
Si no eof (C) Entonces
Copiar_Tramo(C,B)
Fin si
Fin mientras
Fin

Copiar_Tramo (x, y : Archivo)


Inicio
Repetir
Copiar_Dato (x, y)
Hasta Fin_Tramo
Fin

Copiar_Dato (var x, y : Archivo)


Inicio
Si eof (x) Entonces
Fin_Tramo = TRUE
Si no
Leer (x), Reg
Grabar (y), Reg

Si eof (x) Entonces


Fin_Tramo = TRUE
Si no
Pos = FilePos (x)
Leer (x), Reg1)
Seek (x, Pos )
Fin_Tramo = Reg > Reg1
Fin si
Fin si
Fin

Mezclar
Inicio

Mientras no eof (A) y no eof (B) Hacer


Mezclar_Tramos
Num_Tramos = Num_Tramos + 1
Fin Mientras

48
Mientras no ef (A) Hacer
Copiar_Tramo (A, C)
Num_Tramos = Num_Tramos + 1
Fin Mientras

Mientras no ef (B) Hacer


Copiar_Tramo (B, C)
Num_Tramos = Num_Tramos + 1
Fin Mientras

Fin

Mezclar_Tramo
Inicio
Repetir
PosA = File Pos (A);
Leer (A, RegA);
Seek (A, PosA)
PosB = File Pos (B);
Leer (B, RegB);
Seek (B, PosB)
Si RegA < RegB Entonces
Copiar_Dato (A, C)
Si Fin_Tramo Entonces
Copiar_Tramo (B, C)
Fin Si
Si no
Copiar_Dato (B, C)
Si Fin_Tramo Entonces
Copiar_Tramo (A, C)
Fin si
Fin si
Hasta Fin _Tramo
Fin

ORDENACIN POR DIGITOS

El mtodo funciona solo con archivos que almacenan datos numricos con cifras elevadas, hace el uso
de los siguientes archivos:

C Archivo a ordenar
A0, A1..., A9 Archivos auxiliares

Se deben seguir los siguientes pasos para ordenar:

1. Partir el archivo C de acuerdo al digito inspeccionado, ejemplo si el digito inspeccionado es 1


este dato debe copiarse al archivo A1. Se debe empezar inspeccionando por la posicion de la
unidad, decena, centena...etc.
2. Mezclar los 10 archivos auxiliares A0..A9 en orden, empezando del archivo A0 y finalizando
en el archivo A10.
3. Repetir los pasos 1 y 2 hasta que se haya inspeccionado todos los dgitos, es decir unidades,
decenas, centenas, etc.

49
Ejemplo:Ordenar los siguientes datos.

ALGORITMO
FUNCION PRINCIPAL
Var Arch : [0....9] of Archivo
Inicio

Abrir C (Lectura)
Dig = 0
Repetir
Abrir_Archivos
Seek (C, 0)
Particionar
Para I = 0 Hasta 9 Hacer Seek (Arch [ i ], 0)
Seek (C, 0)
Mezclar
Dig = Dig + 1
Cerrar_Archivos
Hasta Dig > 4
Cerrar C
Fin

Particionar
Inicio
Mientras no eof (C) Hacer

50
Leer C, Reg
Aux = Reg Div (Exp(Dig * Ln (10)))
Pos = Aux Mod 10
Grabar Arch [Pos], Reg
Fin Mientras
Fin

Mezclar
Inicio
Para I = 0 Hasta 9 Hacer
Mientras no eof (Arch [I]) Hacer
Leer Arch [I], Reg
Grabar C, Reg
Fin Mientras
Fin Para
Fin

Abrir_Archivos
Inicio
Para I = 0 Hasta 9 Hacer
NOMBRE = 'DATOS'+ CHR(48 + i)+ '.DAT'
Abrir Arch [i] (Escritura)
Fin Para
Fin

Cerrar_Archivos
Inicio
Para I = 0 Hasta 9 Hacer
Cerrar Arch [ i ]
fin Para
Fin

51
TEMA 5

LISTAS ENCADENADAS
OBJETIVOS

Emplear estructuras dinmicas de datos en el procesamiento de la informacin.

Desarrollar algoritmos para optimizar las operaciones bsicas que se llevan a cabo en proceso de
ejecucin en estructuras lineales.

CONTENIDO
5.1 Introduccin
5.2 Lista Simplemente Enlazada
5.3 Listas Simplemente Enlazadas Circulares
5.4 Listas Doblemente Enlazadas
5.5 Listas Doblemente Enlazadas Circulares

5.1 LISTAS ENCADENADAS


Las listas enlazadas son estructuras de datos lineales, que constan de una secuencia de nodos que se
encuentran enlazados uno con otro, mediante un enlace o puntero.

La adicin / eliminacin en estas estructuras de datos, se realiza en tiempo de ejecucin y en forma


dinmica.

La cantidad de nodos que una lista enlazada puede contener esta limitada por la memoria del
computador.

TIPOS DE LISTAS.

Existen los siguientes tipos de listas enlazadas:

Listas simplemente enlazadas

52
Listas simplemente enlazadas circulares

Listas doblemente enlazadas

Listas doblemente Enlazadas circulares

5.2 LISTAS SIMPLEMENTE ENLAZADAS


Una lista simplemente enlazada se representa tal como se muestra en la siguiente grafica:

Donde:

El nodo Raz es un puntero al primer elemento de la lista.

Cada elemento (nodo) de la lista simplemente enlazada debe tener dos campos:

Un campo informacin (info) que contiene el valor de ese elemento y puede contener
cualquier tipo estndar o definido por el usuario.
Un campo enlace (o puntero) que indica la posicin del siguiente elemento de la lista.

NODO
53
Existe una marca para fin de lista, que es la constante NIL, tambin representada por una barra
inclinada o el signo elctrico de tierra.

Declaracin de un nodo usando el lenguaje Pascal:

Type
pnodo = ^nodo
nodo = record
info : Integer;
Sig :pnodo;
End;

Declaracin de un nodo usando el lenguaje C:

struct Nodo
{
int info;
struct Nodo *sig;
};

OPERACIONES EN LISTAS SIMPLEMENTE ENLAZADAS

Como cualquier estructura de datos, en las listas simplemente enlazadas se puede realizar las siguientes
operaciones bsicas:

Insercin
Eliminacin
Bsqueda
Recorrido

RECORRIDO

Para realizar el recorrido en una lista simple, es necesario el uso de un puntero auxiliar ACT, con la
cual se visita toda la lista, empezando por la RAIZ y finalizando cuando el puntero ACT apunta a NIL.

ALGORITMO:

Recorrido(Dato:Integer)
Inicio
Actual = Raz
Mientras(Actual <> Nil) hacer
Actual =Actual^.sig

54
Mostar Actual^.inf
Fin Mientras
Fin.

BUSQUEDA

Para realizar la bsqueda en una lista simple, es necesario el uso de un puntero auxiliar ACT, con la
cual se busca empezando por la RAIZ y finalizando cuando el puntero ACT apunta al elemento
buscado o a NIL.

ALGORITMO:

Buscar(Dato:Integer)
Inicio
Actual = Raz
Mientras(Actual<>Nil) y (Actual^.inf<>Dato) hacer
Actual =Actual^.sig
Fin Mientras
Si Actual^.inf = Dato entonces
Mostar "El Dato Esta en la Lista"
Sino
Mostrar "No Existe el Dato"
Fin si
Fin.

INSERCION DE DATOS

Existen distintas formas de adicin de nodos a una lista simple, de acuerdo a los propsitos de uso de
estos, entre las cuales se tiene:

Insertar cuando lista esta vaca


Insertar al principio
Insertar al final
Insertar al medio de dos nodo

En todas ellas se realiza una tarea comn:

Crear una nuevo nodo


Almacenar el elemento
Agregar los enlaces respectivos

INSERTAR CUANDO LISTA ESTA VACIA:

55
Insertar(5)

New(Nuevo)
Nuevo^.inf= 5
Raiz = nuevo (1)
Nuevo^.sig= nil(2)

INSERTAR AL PRINCIPIO:

Insertar(3)

New(Nuevo)
Nuevo^.inf= 3
Nuevo^.sig = Raiz(1)
Raiz = Nuevo (2)

INSERTAR AL FINAL:

Insertar(13)

56
New(Nuevo)
Nuevo^.inf= 13
ant^.sig =Nuevo(1)
Nuevo^.sig =Nil(2)

INSERTAR AL MEDIO DE DOS NODOS:

Insertar(7)

New(Nuevo)
Nuevo^.inf= 7
Nuevo^.sig =Act(1)
Ant^.sig = Nuevo(2)

ALGORITMO :

Insertar (Dato:Entero)
Inicio
New(Nuevo)
Nuevo^.inf = Dato
Si Raiz = Nil Entonces
Raiz = Nuevo
Nuevo^ sig = Nil
Si no
Anterior = Raiz
Actual = Raiz
Mientras (Actual <>Nil) y (Dato> Actual^.Inf) Hacer
Anterior = Actual
Actual = Actual^.sig
Fin Mientras
Si Anterior =Actual Entonces
Nuevo^.sig = Raiz
Raiz = Nuevo
Si no
Nuevo^.sig = Actual

57
Anterior^.sig = Nuevo
Fin si
Fin si
Fin.

ELIMINAR DATOS

Para eliminar un dato de una lista simple, es necesario buscarlo en la lista primeramente.

La bsqueda se realiza con dos punteros auxiliares ANT y ACT, si el dato se encuentra en la lista, el
puntero ACT apunta a ella y el puntero ANT apunta al anterior elemento.

Existen dos casos que se presentan al eliminar un dato:

1. Eliminar el primer elemento


2. Eliminar un elemento distinto del primero

ELIMINAR EL PRIMER ELEMENTO

Dada la siguiente lista:

Eliminar(5)

Raiz= act^.sig(1)
Dispose(act)

ELIMINAR UN ELEMENTO DISTINTO DEL PRIMERO

Dada la siguiente lista:

Eliminar(9)

58
ant^.sig = act^.sig
Dispose(act)

ALGORITMO:

Eliminar (Dato:Entero)
Inicio
Si Raiz = nil then
Mostrar No existe Datos
Si no
Anterior = Raiz
Actual = Raiz
Mientras (Actual <> Nil) y (Actual^.inf <> Dato) Hacer
Anterior = Actual
Actual =Actual^.sig
Fin Mientras
Si Actual^.inf = Dato entonces
Si Anterior = Actual entonces
Raiz = Actual^.sig
Sino
Anterior^.sig = Actual^.sig
Fin si
Dispose(Actual)
Sino
Imprimir "No Existe el Dato"
Fin si
Fin si
Fin.

5.3 LISTAS SIMPLEMENTE ENLAZADAS CIRCULARES.


Una lista circular es aquella en la cual el puntero siguiente del ltimo elemento apunta hacia el primer
elemento. Por lo cual en estas listas no existe ni primero ni ltimo elemento, aunque se debe elegir
obligatoriamente un puntero para referenciar la lista.

Esta lista presenta la gran ventaja de que cada nodo en una lista circular es accesible desde cualquier
nodo. Tiene el inconveniente de que requiere un diseo cuidadoso para evitar caer en un bucle infinito.

Existen dos tipos de listas enlazadas simples circulares:

59
Listas simples circulares sin nodo cabecera

Listas simples circulares con nodo cabecera

El manejo de la primera es complejo, de tal modo que solo se usaremos las listas enlazadas con nodo
cabecera, debido a su fcil manejo.

OPERACIONES EN LISTAS SIMPLEMENTE ENLAZADAS CIRCULARES

Como cualquier estructura de datos, en las listas simplemente enlazadas circulares se puede realizar las
siguientes operaciones bsicas:

Insercin
Eliminacin
Bsqueda
Recorrido

RECORRIDO

Para realizar el recorrido en una lista simple circular, es necesario el uso de un puntero auxiliar ACT,
con la cual se visita toda la lista, empezando por la RAIZ y finalizando cuando el puntero ACT apunta
a NIL.

ALGORITMO:
Recorrido(Dato:Integer)
Inicio
Actual = Raz^.sig
Mientras(Actual <> Raiz) hacer
Actual =Actual^.sig
Mostarc Actual^.inf

60
Fin Mientras
Fin.

BUSQUEDA

Para realizar la bsqueda en una lista simple, es necesario el uso de un puntero auxiliar ACT, con la
cual se busca empezando por la RAIZ y finalizando cuando el puntero ACT apunta al elemento
buscado o a NIL.

ALGORITMO :
Buscar(Dato:Integer)
Inicio
Actual = Raz^.sig
Mientras(Actual <> Raiz) y (Actual^.inf <> Dato) hacer
Actual =Actual^.sig
Fin Mientras
Si Actual^.inf = Dato entonces
Mostar "El Dato Esta en la Lista"
Sino
Mostrar "No Existe el Dato"
Fin si
Fin.

INSERCION DE DATOS

Existen distintas formas de adicin de nodos a una lista simple circular, de acuerdo a los propsitos de
uso de estos. Entre las cuales se tiene:

Insertar cuando lista esta vaca


Insertar al medio de dos nodos

En todas ellas se realiza una tarea comn, que es el de crear una nuevo nodo para almacenar al
elemento que ser agregado a la lista.

INSERTAR CUANDO LISTA ESTA VACIA:

Insertar(5)

61
New(Cab)
New(Nuevo)
Nuevo^.inf= 5
Raiz = Cab (1)
Cab^.sig= nuevo (2)
Nuevo^.sig= Raiz (3)

INSERTAR AL MEDIO DE DOS NODOS:

Insertar(7)

New(Nuevo)
Nuevo^.inf= 7
Nuevo^.sig = Act (1)
Ant^.sig = Nuevo (2)

ALGORITMO :

Insertar (Dato:Entero)
Inicio
New(Nuevo)
Nuevo^.inf = Dato
Si Raiz = Nil Entonces
New(Cab)
Raiz = Cab
Cab^.sig =Nuevo
Nuevo^.sig = Raiz
Si no
Anterior = Raiz
Actual = Raiz^ sig
Mientras (Actual <> Raiz) y (Dato> Actual^.Inf) Hacer

62
Anterior = Actual
Actual = Actual^.sig
Fin Mientras
Nuevo^.sig = Actual
Anterior^.sig = Nuevo
Fin si
Fin.

ELIMINAR DATOS

Para eliminar un dato de una lista simple circular, es necesario buscarlo en la lista primeramente. La
bsqueda se realiza con dos punteros auxiliares ANT y ACT, si el dato se encuentra en la lista, el
puntero ACT apunta a ella y el puntero ANT apunta al anterior elemento.

Existen dos casos que se presentan al eliminar un dato:

Eliminar l ultimo elemento de la lista


Eliminar un elemento distinto del ultimo

ELIMINAR EL ULTIMO ELEMENTO DE LA LISTA

Dada la siguiente lista:

Eliminar(9)

Para eliminar el ultimo elemento, es necesario liberar la memoria de los nodos que apuntan a ANT y
ACT.

Dispose(ant)
Dispose(act)
Raiz = nil (1)

ELIMINAR UN ELEMENTO DISTINTO DEL ULTIMO

Dada la siguiente lista:

63
Eliminar(5)

ant^.sig = act^.sig
Dispose(act)

ALGORITMO:

Eliminar (Dato:Entero)
Inicio
Si Raiz = nil then
Mostrar No existe Datos
Si no
Anterior = Raiz
Actual = Raiz^.sig
Mientras (Actual <> Raiz) y (Actual^.inf <> Dato) Hacer
Anterior = Actual
Actual =Actual^.sig
Fin Mientras
Si Actual^.inf <>Raiz entonces
Si Anterior = Actual^.sig entonces
Dispose(Anterior)
Raiz = Nil
Sino
Anterior^.sig = Actual^.sig
Fin si
Dispose(Actual)
Sino
Imprimir "No Existe el Dato"
Fin si
Fin si
Fin.

5.4 LISTAS DOBLEMENTE ENLAZADAS.


En muchas aplicaciones se requiere recorrer la lista en dos direcciones. Estos recorridos se pueden
conseguir manteniendo dos campos de enlace en cada nodo en lugar de uno.

64
Estos enlaces(punteros) se utilizan para denotar la direccin del predecesor y sucesor de un nodo dado.
El predecesor se llama enlace izquierdo y el sucesor enlace derecho.

Donde:

Nodo Inicio es un puntero al primer elemento de la lista.


Nodo Fin es un puntero al ultimo elemento de la lista.
Una lista cuya Estructura de Nodo,contiene dos campos de enlace se denominar lista lineal
doblemente enlazada.

NODO

Donde:

campo enlace ant. apunta al anterior nodo de la lista.


campo info contiene cualquier tipo estndar de datos.
campo enlace sig. apunta al siguiente nodo de la lista.

Existe una marca para fin de lista, que es la constante NIL, tambin representada por una barra
inclinada o el signo elctrico de tierra.

Declaracin de un nodo usando el lenguaje Pascal:

Type
pnodo = ^nodo
nodo = record
info : Integer;
Ant, Sig :pnodo;
End;

Declaracin de un nodo usando el lenguaje C:

Struct nodo
{
int info;
struct nodo *Ant, * Sig;
};

OPERACIONES EN LISTAS DOBLEMENTE ENLAZADAS.

Las operaciones bsicas para manipular listas doblemente enlazadas son:

65
Insercin
Eliminacin
Recorrido
Bsqueda

RECORRIDO

En una lista doble circular es posible realizar dos tipos de recorridos, esto debido a que en estas listas
existen enlaces en ambas direcciones.

Recorrido en forma ascendente


Recorrido en forma descendente

RECORRIDO EN FORMA ASCENDENTE

Este recorrido se inicia cuando el puntero apunta a INICIO y se recorre de nodo a nodo con el puntero
SIG hasta que el nodo apunte a NIL.

ALGORITMO:

Inicio
Actual = Inicio
Mientras Actual <> NIL hacer
Mostrar Actual^.inf
Actual = Actual^.sig
Fin Mientras
Fin.

RECORRIDO EN FORMA DECENDENTE

Este recorrido se inicia cuando el puntero apunta a FIN y se recorre de nodo a nodo con el puntero
ANT hasta que el puntero apunte a NIL.

ALGORITMO:

Inicio
Actual = Fin}
Mientras Actual <> Nil Hacer
Mostrar Actual^.inf

66
Actual = Actual^.ant
Fin Mientras
Fin.

INSERCION DE DATOS

Existen distintas formas de adicin de nodos a una lista doble, de acuerdo a los propsitos de uso de
estos. Entre las cuales se tiene:

Insertar cuando lista esta vaca


Insertar al principio
Insertar al final
Insertar al medio de dos nodos

En todas ellas se realiza una tarea comn, que es el de crear una nuevo nodo para almacenar al
elemento que ser agregado a la lista.

INSERTAR CUANDO LISTA ESTA VACIA:

Dada la siguiente lista:

Insertar(5)

New(Nuevo)
Nuevo^.inf= 5
Inicio = nuevo (1)
Fin = nuevo (2)
Nuevo^.ant= nil (3)
Nuevo^.sig= nil (4)

INSERTAR AL PRINCIPIO

Dada la siguiente lista:

Insertar(3)

67
New(Nuevo)
Nuevo^.inf= 3
Inicio = Nuevo(1)
Nuevo^.sig = Act(2)
Act^.ant = Nuevo(3)
Nuevo^.ant = Nil(4)

INSERTAR AL FINAL:

Dada la siguiente lista:

Insertar(13)

New(Nuevo)
Nuevo^.inf= 13
ant^.sig = Nuevo(1)
Nuevo^.sig = Nil(2)
Fin = Nuevo(3)
Nuevo^.ant = Ant(4)

INSERTAR AL MEDIO DE DOS NODOS:

Dada la siguiente lista:

68
Insertar(7)

New(Nuevo)
Nuevo^.inf= 7
Ant^.sig = Nuevo(1)
Nuevo^.sig = Act(2)
Act^.ant = Nuevo(3)
Nuevo^.ant = Ant (4)

ALGORITMO:

Insertar (Dato:Entero)
Inicio
New(Nuevo)
Si Inicio = Nil Entonces
Inicio = Nuevo; Final = Nuevo
Nuevo^.ant = Nil;
Nuevo^.sig = Nil
Si no
Anterior = Inicio
Actual = Inicio
Mientras (Actual <> Nil) y( Actual^.inf < Dato) Hacer
Anterior = Actual
Actual =Actual^.sig
Fin Mientras
Si Actual = Anterior Entonces
Nuevo^.sig = Inicio
Inicio^.ant = Nuevo
Inicio = Nuevo
Nuevo^.ant = Nil
Si no
Si Actual = Nil Entonces
Final = Nuevo
Si no
Actual^.ant = Nuevo
Fin si
Nuevo^.sig = Actual
Anterior^.sig = Nuevo
Nuevo^.ant = Anterior
Fin si
Fin si
Fin.

ELIMINAR DATOS

Para eliminar un dato de una lista doble, es necesario buscarlo en la lista primeramente.

69
La bsqueda se realiza con dos punteros auxiliares ANT y ACT, si el dato se encuentra en la lista, el
puntero ACT apunta a ella y el puntero ANT apunta al anterior elemento.

Existen dos casos que se presentan al eliminar un dato:

Eliminar el primer elemento


Eliminar un elemento distinto del primero
Eliminar l ultimo elemento

ELIMINACIN AL PRINCIPIO:

Dada la siguiente lista:

Eliminar(5)

1. Inicio = Inicio^.sig
2. Inicio^.ant = Nil
Dispose(act)

ELIMINACIN AL MEDIO:

Dada la siguiente lista:

Eliminar(8)

70
1. Ant^.sig = Act^.sig
2. Act^.sig^.ant = Ant
Dispose(act)

ELIMINACIN AL FINAL:

Dada la siguiente lista:

Eliminar (9)

1. Ant^.sig = Act^.sig = nil


2. Final = Ant
Dispose(act)

ALGORITMO:

Eliminar (Valor: Entero)


Inicio
Anterior = Inicio
Actual = Inicio
Mientras (Actual <> Nil) y (Actual^.inf <> Valor) hacer
Anterior = Actual
Actual =Actual^.sig
Fin Mientras
Si Actual^.inf <> Valor Entonces
Mostrar "No Existe el Elemento"
Si no
Si Actual=Anterior Entonces
Si Actual^.sig <> Nil Entonces
Inicio = Inicio^.sig
Inicio^.ant = Nil
Si no
Final = Nil
Inicio = Nil
Fin si
Si no
Si Actual^.sig <> Nil entonces
Actual^.sig^.Ant = Anterior
Si no
Final = Anterior

71
Fin si
Anterior^.sig = Actual^.sig
Fin si
Fin si
Fin.

5.5 LISTAS CIRCULARES DOBLEMENTE ENLAZADAS.


Una lista doble circular es aquella en la cual el puntero siguiente del ltimo elemento apunta hacia el
primer elemento. En estas listas no existe ni primero ni ltimo elemento, aunque se debe elegir
obligatoriamente un puntero para referenciar la lista.

Esta lista presenta la gran ventaja de que cada nodo en una lista doble circular es accesible desde
cualquier nodo. Tiene el inconveniente de que requiere un diseo cuidadoso para evitar caer en un
bucle infinito.

Existen dos tipos de listas enlazadas simples circulares:

Listas dobles circulares sin nodo cabecera

Listas dobles circulares con nodo cabecera

El manejo de la primera es complejo, de tal modo que solo se usaremos las listas enlazadas con nodo
cabecera, debido a su fcil manejo.

72
OPERACIONES EN LISTAS DOBLEMENTE ENLAZADAS CIRCULARES.

Las operaciones bsicas para manipular listas doblemente enlazadas son:

Insercin
Eliminacin
Recorrido
Bsqueda

RECORRIDO

En una lista doble circular es posible realizar dos tipos de recorridos, esto debido a que en estas listas
existen enlaces en ambas direcciones.

Recorrido en forma ascendente


Recorrido en forma descendente

RECORRIDO EN FORMA ASCENDENTE

Este recorrido se inicia cuando el puntero apunta a Raiz^.sig y se recorre de nodo a nodo con el puntero
SIG hasta llegar al nodo Raiz.

ALGORITMO:

Inicio
Actual = Raiz^.sig
Mientras Actual <> Raiz hacer
Mostrar Actual^.inf
Actual = Actual^.sig
Fin Mientras
Fin.

RECORRIDO EN FORMA DECENDENTE

Este recorrido se inicia cuando el puntero apunta a Raiz^.ant y se recorre de nodo a nodo con el puntero
ANT hasta llegar al nodo Raiz.

73
ALGORITMO:

Inicio
Actual = Raiz^.ant
Mientras Actual <> Raiz Hacer
Mostrar Actual^.inf
Actual = Actual^.ant
Fin Mientras
Fin.

INSERCION DE DATOS

Existen dos formas de insercin de datos a una lista doblemente enlazada circular:

Insercin en una lista vaca


Insertar al medio de dos nodos

INSERCIN EN UNA LISTA VACIA

Insertar(9)

New(Cab)
New(nuevo)
nuevo^.inf=9
Raiz = Cab (1)
Cab^.sig = Nuevo (2)
Nuevo^.sig = Cab (3)
Cab^.ant = Nuevo (4)
Nuevo^.ant = Cab (5)

74
INSERTAR AL MEDIO DE DOS NODOS:

Insertar(6)

New(Cab)
New(nuevo)
nuevo^.inf=6
Ant^.sig = Nuevo(1)
Nuevo^.sig = Act(2)
Act^.ant = Nuevo(3)
Nuevo^.ant = Ant(4)

ALGORITMO:

Insertar (dato:entero)
Inicio
New(Nuevo)
Nuevo^.inf = Dato
Si Raiz = Nil Entonces
New(NodoC)
Raiz = NodoC
NodoC^.sig = NodoC
NodoC^.ant = Nuevo
Nuevo^.ant = NodoC
Si no
Anterior = Raiz
Actual = Raiz^.sig
Mientras (Actual <> Raiz) y (Actual^.inf < dato) Hacer
Anterior = Actual
Actual =Actual^.sig
Fin Mientras
Nuevo^.sig = Actual
Actual^.sig = Nuevo
Nuevo^.ant = Anterior
Actual^.ant = Nuevo
Fin si
Fin.

75
ELIMINAR DATOS

Para eliminar un dato de una lista doble circular, es necesario buscarlo en la lista primeramente.

La bsqueda se realiza con dos punteros auxiliares ANT y ACT, si el dato se encuentra en la lista, el
puntero ACT apunta a ella y el puntero ANT apunta al anterior elemento.

Existen dos casos que se presentan al eliminar un dato:

Eliminar l ultimo elemento


Eliminar un elemento

ELIMINAR L ULTIMO ELEMENTO

Eliminar(9)

Dispose(ant)
Dispose(act)
Raiz = Nil

ELIMINAR UN ELEMENTO

Eliminar(9)

76
Ant^.sig = Act^.sig(1)
Act^.sig ^.ant = Ant(2)
Dispose(act)

ALGORITMO:

Eliminar (Valor:Entero)
Inicio
Anterior = Raiz
Actual = Raiz^.sig
Mientras (Actual <> Raiz) y (Actual^.inf <> Valor) Hacer
Anterior = Actual
Actual =Actual^.sig
Fin Mientras
Si (Actual^.inf <> Valor) Entonces
Mostrar "No Existe el Elemento"
Si no
Si Actual^.sig = Anterior) Entonces
Dispose(Anterior)
Raiz = Nil
Si no
Anterior^.sig = Actual^.sig
Actual^.sig ^.ant= Anterior
Fin si
Dispose(Actual)
Fin si
Fin.

77
TEMA 6

RBOLES
OBJETIVOS

Desarrollar aplicaciones con estructuras ramificadas que optimizan las operaciones bsicas.

Encontrar nuevas formas de organizacin de datos en forma ramificada de acuerdo a las caractersticas
de la aplicacin.

CONTENIDO
6.1 Introduccin
6.2 Conceptos Asociados
6.3 rbol Binario de Bsqueda
6.4 rboles Equilibrados o AVL

6.1 DEFINICION.
Un rbol es una lista en la que cada uno de sus elementos apunta a uno, ninguno o varios elementos del
mismo tipo.

Un rbol es una estructura dinmica y homognea, por tanto est compuesto de elementos del mismo
tipo base T, de forma que la estructura puede estar vaca o compuesta por un elemento del tipo base T
del que cuelgan un nmero finito de estructuras rbol similar, a las que llamaremos subrboles, y entre
s son disjuntos.

Dos rboles son iguales cuando tengan igual nmero de nodos, igual contenido en ellos y, adems,
estn dispuestos de igual manera

REPRESENTACIN

Un rbol es una estructura de datos no lineal que establece una jerarqua entre sus elementos.

Un rbol puede ser representado, en tres formas diferentes:

Matriz de adyacencia.
Lista de adyacencia.

78
Estructura dinmica pura.

MATRIZ DE ADYACENCIA

Es un array [1..n,1..n] OF BOOLEAN donde n es el nmero de nodos que tiene el rbol y cada posicin
de la matriz indicar si existe un enlace entre dos nodos. Esto es normal hacerlo en lenguajes en que no
pueden crearse componentes dinmicamente, y referenciales por medio de punteros.

Ejemplo:

LISTA DE ADYACENCIA

Es una tabla de 1 a n, siendo n el nmero de nodos, donde cada elemento de la tabla representa cada
uno de los nodos del rbol y de cada uno de los elementos sale un puntero a una lista que est formada
por todos los nodos que estn enlazados con l.

Ejemplo:

ESTRUCTURA DINMICA PURA

En ella, todos los componentes o nodos, se representan por punteros explcitos.

Vamos a tener un tipo como:

PNodo=^Nodo;
Nodo=RECORD
Info:Tinfo;
Enlace1,..., EnlaceN: PNodo;
END;

79
6.2 CONCEPTOS ASOCIADOS
A continuacin veremos algunos conceptos asociados a los Arboles.

Nodo: Cada uno de los elementos de un rbol.

Rama: Es cada uno de los enlaces que existe entre los nodos de un rbol.

Raz: Es aquel nodo que no tiene antecesores, es decir, todos son descendientes directos o indirectos
de el.

Subrbol: Se llama subrbol de raz m al conjunto de nodos que dependen directa o indirectamente
de l, as como al propio m.

Antecesor o padre: Es un nodo del que cuelga algn otro, llamado descendiente o hijo.

Grado de un nodo: Es el nmero de descendientes directos que tiene, el grado de un rbol es igual
al del nodo con mayor grado.

Nivel : Es el nmero de ramas que hay que recorrer para llegar a l desde la raz, tendiendo en cuenta
que la raz tiene nivel uno.

80
Nodo terminal u hoja: Es aquel que tiene grado cero, es decir, que no tiene ningn descendiente.

Nodo interno: Es aquel que no es hoja.

Longitud de camino interno de un arbol: Es la suma de las longitudes de camino de todos sus
nodos.

LCI = 1+2+2+3+3+3 = 14

Longitud de camino externa: Es la suma de las longitudes de camino de todos los Nodos
Especiales (Es aquel que se hace colgar de aquellos nodos que no tienen completo el cupo de
descendientes).

LCE = 3+4+4+4+4+4+4 = 27

Longitud de camino interna media: Es la longitud de camino interna partido del nmero de
nodos

6.3 ARBOL BINARIO


Los rboles de grado 2 tienen una especial importancia. Se les conoce con el nombre de rboles
binarios.

Se define un rbol binario como un conjunto finito de elementos (nodos) que bien est vaci o est
formado por una raz con dos rboles binarios disjuntos, llamados subrbol izquierdo y derecho de la
raz.

81
En los apartados que siguen se considerarn nicamente rboles binarios y, por lo tanto, se utilizar la
palabra rbol para referirse a rbol binario. Los rboles de grado superior a 2 reciben el nombre de
rboles multicamino.

DEFINICION

Los rboles binarios se utilizan frecuentemente para representar conjuntos de datos cuyos elementos se
identifican por una clave nica.

Si el rbol est organizado de tal manera que la clave de cada nodo es mayor que todas las claves del
subrbol izquierdo, y menor que todas las claves del subrbol derecho se dice que este rbol es un rbol
binario de bsqueda.

Ejemplo:

OPERACIONES BASICAS

Una tarea muy comn a realizar con un rbol es ejecutar una determinada operacin con cada uno de
los elementos del rbol. Esta operacin se considera entonces como un parmetro de una tarea ms
general que es la visita de todos los nodos o, como se denomina usualmente, del recorrido del rbol.

Si se considera la tarea como un proceso secuencial, entonces los nodos individuales se visitan en un
orden especfico, y pueden considerarse como organizados segn una estructura lineal.

Existen dos formas bsicas de recorrer un rbol:

o Recorrido en amplitud.
o Recorrido en profundidad.

RECORRIDO EN AMPLITUD.

En el recorrido por amplitud se visitan los nodos por niveles. Para ello se utiliza una estructura auxiliar
tipo "cola" en la que despus de mostrar el contenido del nodo, empezando por el nodo raz, se
almacenan los punteros correspondientes a sus hijos izquierdo y derecho.

De esta forma si recorremos los nodos de un nivel, mientras mostramos su contenido, almacenamos en
la cola los punteros a todos los nodos del nivel siguiente.

82
Resultado:

20, 10, 30, 5, 15, 25

El algoritmo:
Amplitud
Inicio
Ptr = raiz
Cima = 1
Inicio=1
Pila[cima] = Ptr

Mientras Inicio<=cima hacer

ptr=Pila[Inicio]
inicio++
Mostrar ptr^.inf

Si ptr^der <> nil entonces


Cima=cima+1
Pila[cima] = ptr^.der
Fin_si

Si ptr^izq <> nil entonces


Cima=cima+1
Pila[cima] = ptr^.izq
Fin_si

Fin_mientras
Fin.
RECORRIDO EN PROFUNDIDAD.

Para visualizar o consultar los datos en un rbol se necesita recorrer el rbol. Al contrario que las listas
enlazadas, los rboles no tienen un primer valor, un segundo valor, etc.

Existen mtodos de recorrido de un rbol binario, de acuerdo al orden en que se visitan los nodos, de
forma que ser preciso elegir cuidadosamente el tipo de recorrido. Segn sea la estrategia a seguir, los
recorridos se conocen como:

Recorrido inorden
Recorrido preorden
Recorrido postorden

83
Las tres etapas bsicas en el recorrido de un rbol binario recursivamente son:

- Visitar el nodo (Raiz)


- Recorrer el subrbol izquierdo (izq.)
- Recorrer el subrbol derecho (der.)

RECORRIDO PREORDEN

Si el rbol no esta vaci, el mtodo implica los siguientes pasos:

- Visitar el nodo (Raiz)


- Recorrer el subrbol izquierdo (izq.)
- Recorrer el subrbol derecho (der.)

El algoritmo usando recursividad:


preorden (var p:pnodo)
inicio
si p <>nil entonces
escribir p^.inf
preorden (p^.izq)
preorden (p^.der)
fin si
fin

En el rbol, los nodos se han numerado en el orden que son visitados en el recorrido preorden

Primero se visita el nodo raz A.

Despus se visita el subrbol izquierdo. Este consta de los nodos (B, D y E), por lo que siguiendo con
el orden (Raiz, izq., der.), se visita primero B, luego D y por ultimo E.

Por ultimo se visita el subrbol derecho que consta de los nodos (C, F y G). Siguiendo el orden (Raiz,
izq., der.), se visita primero C, luego F y por ultimo G.

El recorrido es: A-B-D-E-C-F-G

El algoritmo sin usar recursividad:

84
Preorden
Inicio
Cima = 1
Pila[cima] = nil
Ptr = raiz

Mientras ptr <> nil hacer

Mostrar ptr^.inf

Si ptr^der <> nil entonces


Cima=cima+1
Pila[cima] = ptr^.der
Fin_si

Si ptr^.izq <> nil entonces


Ptr = ptr^.izq
Sino
Ptr = pila[cima]
Cima=cima-1
Fin_si

Fin_mientras
Fin.
RECORRIDO INORDEN
Si el rbol no esta vaci, el mtodo implica los siguientes pasos:

- Recorrer el subrbol izquierdo (Izq)


- Visitar el nodo (Raiz)
- Recorrer el subrbol derecho (Der)

El algoritmo usando recursividad:


inorden (var p:pnodo)
inicio
si p <> nil entonces
inorden (p^.izq)
escribir p^.inf
inorden (p^.der)
fin si
fin

En el rbol, los nodos se han numerado en el orden que son visitados en el recorrido enorden.

85
El primer recorrido es el subrbol izquierdo del nodo raz. Este consta de los nodos (B, D y E), por lo
que siguiendo con el orden (Izq, Raiz, Der), se visita primero D, luego B y por ultimo E.

Despus se visita el nodo raz A.

Por ultimo se visita el subrbol derecho que consta de los nodos (C, F y G). siguiendo el orden (Izq,
Raiz, Der), se visita primero F, luego C y por ultimo G.

El recorrido es: D-B-E-A-F-C-G

El algoritmo sin usar recursividad:


Inorden
Inicio
Cima = 1
Pila[cima]=nil
Ptr = raiz

Mientras ptr <> nil hacer


Mientras ptr <> nil hacer
Cima=cima+1
Pila[cima] = ptr
Ptr = ptr^.izq
Fin_mientras

Ptr = pila[cima]
Cima=cima-1
Tieneder =false

Mientras Ptr <> nil y no tieneder hacer

Mostrar ptr ^.inf


Si ptr^.der <> nil entonces
Ptr = ptr^.der
Tieneder = true
Sino
Ptr = pila[cima]
Cima=cima-1
Fin_si
Fin_mientras
Fin_mientras
Fin.
RECORRIDO POSTORDEN
Si el rbol no esta vaci, el mtodo implica los siguientes pasos:

- Recorrer el subrbol izquierdo (Izq)


- Recorrer el subrbol derecho (Der)
- Visitar el nodo (Raiz)

El algoritmo usando recursividad:


postorden (var p:pnodo)

86
inicio
si p <> nil entonces
postorden (p^.izq)
postorden (p^.der)
escribir p^.inf
fin si
fin

En el rbol, los nodos se han numerado en el orden que son visitados en el recorrido preorden.

Primero se visita el subrbol izquierdo. Este consta de los nodos (B, D y E), por lo que siguiendo con
el orden (Izq, Der, Raiz), se visita primero D, luego E y por ultimo B.

Por ultimo se visita el subrbol derecho que consta de los nodos (C, F y G). Siguiendo el orden (Izq,
Der, Raiz), se visita primero F, luego G y por ultimo C.

Por ultimo se visita el nodo raz A.

El recorrido es: D-E-B-F-G-C-A

El algoritmo sin usar recursividad:


Postorden
Inicio
Cima = 1
Pila[cima]=nil
Ptr = raiz
Mientras ptr <> nil hacer
Mientras ptr <> nil hacer
Cima=cima+1
Pila[cima] = ptr
Si ptr^.der <> nil entonces
Cima = cima+1
Pila[cima]= -ptr^.der
Fin_si
Ptr = ptr^.izq
Fin_mientras

Ptr = pila[cima]
Cima = cima-1
Salir = false

87
Mientras ptr <> nil y no salir hacer
Si prt > 0 entonces
Mostrar prt^.inf
Ptr = pila[cima]
Cima = cima-1
Sino
Ptr = -ptr
Salir=true
Fin_si
Fin_mientras
Fin_mientras
Fin.

INSERCIN DE DATOS

La insercin de datos en un arbol binario de bsqueda, se realiza de acuerdo al valor que se debe
insertar, si el dato es menor que la raz es insertada en el subrbol izquierdo, si el dato es mayor que la
raz es insertada en el subrbol derecho.

Insertar(Var raiz:pnodo;dato:entero)
Inicio
Si raiz = nil entonces
New(raiz)
Raiz^.inf = dato
Raiz^.izq = nil
Raiz^.der = nil
Sino
Si dato > raiz^.inf entonces
Insertar (raiz^.der,dato)
Sino
Insertar(raiz^.izq,dato)
Fin_si
Fin_si
Fin.

ELIMINAR UN DATO

Existen varios casos de eliminacin en un arbol binario de bsqueda:

Nodo que no tiene hijos:

Solucin : Ptr = nil

Nodo que tiene un hijo:

88
Solucin : Ptr = ptr^.der

Solucin : Ptr = ptr^.izq

Nodo que tiene dos hijos:

En este caso existen dos posibilidades de reemplazo, donde el nodo a ser eliminado puede ser
reemplazado por los siguientes nodos:

caso a).- El nodo del subrbol izquierdo que se encuentra mas a la derecha

caso b).- El nodo del subrbol derecho que se encuentra mas a la izquierda

89
ALGORITMO :

Eliminar(dato:integer;Var ptr:pnodo)
Inicio
Si ptr = nil entonces
Mostrar "no existe el elemento"
Sino
Si dato > ptr^.inf entoces
Eliminar (dato,ptr^.der)
Sino
Si dato < ptr^.inf entonces
Eliminar(dato,ptr^.izq)
Sino
Aux =ptr
Si aux^.izq=nil entonces
Ptr =aux^.der
Sino
Si aux^.der = nil entonces
Ptr=aux^.izq
Sino
Reemplazar(aux^.izq)
Fin_si
Fin_si

Free(aux)

Fin_si
Fin_si
Fin_si
Fin.

Reemplazar(Var Ader:pnodo)
Inicio
Si Ader^.der <> nil entonces
Reeplazar(Ader^.der)
Sino
Ptr^.inf = Ader^.inf
aux = Ader
Ader = Ader^.izq
Fin_si
Fin.

BSQUEDA DE DATOS

La bsqueda de un nodo comienza en el nodo raz y sigue estos pasos:

La clave buscada se compara con la clave del nodo raz.


Si las claves son iguales, la bsqueda se detiene, o si el subrbol esta vaci.
Si la clave buscada es mayor que la clave raz, la bsqueda se reanuda en el subrbol derecho.
Si la clave buscada es menor que la clave raz, la bsqueda se reanuda en el subrbol izquierdo.

6.4 RBOLES BINARIOS DE EXPRESIONES


Los rboles binarios se utilizan para almacenar expresiones. Por ejemplo, el
arbol de la figura representa la expresin (A+B)*C. Las expresiones

90
matemticas se pueden escribir segn diversos tipos de notaciones. La notacin infija es la empleada
habitualmente y requiere el uso de parntesis, pero nicamente cuando es necesario modificar la
prioridad entre los distintos operadores.

CONSTRUCCIN A PARTIR DE UNA EXPRESIN EN NOTACIN


CONVENCIONAL

Para construir se utilizaran, como estructura de datos auxiliares, una pila de punteros a los nodos de
un rbol y otra pila de operadores para retenerlos temporalmente hasta que llegue el momento de
incorporarlos al rbol. Los pasos a seguir son lo siguientes.
1. Cuando se lee un OPERANDO se crea un rbol de un nodo y se mete el apuntador a el en
correspondiente pila.
2. Cuando se lee un OPERADOR se retiene en la pila de operadores. Los operadores se van poniendo
en esta pila hasta encontrar uno con mayor o igual prioridad, en cuyo caso se sacan los que hubiera
en la pila de mayor o igual prioridad y se coloca en ella este ultimo operador leido.
3. Cuando se lee un PARNTESIS IZQUIERDO se retiene en la pila de operadores.
4. Cuando se lee un PARNTESIS DERECHO se sacan los OPERADORES que hubiera en la pila de
operadores hasta encontrar el parntesis izquierdo.
5. El proceso termina cuando se acaba la entrada y la pila de operadores queda vaca.
Nota: Al sacar de la pila de operadores uno de ellos, extraer de la pila de punteros los dos ltimos
apuntadores. Con estos tres elementos, se forma un nuevo rbol cuya raz almacena el operador y
los punteros anteriores. El apuntador a este nuevo rbol se coloca ahora en la pila de apuntadores.

Ejemplo: Sea la expresin :


Q= 4+5^(2*3)+8

1.-

2.- El ) saca los operadores de la pila hasta el (

91
3.- El + saca de la pila todos los operadores con mayor prioridad que el y l continuacin se coloca el

4.-

5.-

6.5 RBOLES EQUILIBRADOS O AVL


Es una suavizacin de las restricciones para formar rboles perfectamente equilibrados. Un rbol AVL
(llamado as por las iniciales de sus inventores: Adelson-Velskii y Landis) es un rbol binario de

92
bsqueda en el que para cada nodo, las alturas de sus subrboles izquierdo y derecho no difieren en
ms de 1.

El algoritmo para mantener un rbol AVL equilibrado se basa en reequilibrados locales, de modo que
no es necesario explorar todo el rbol despus de cada insercin o borrado.

DEFINICIN

La definicin no slo es simple, sino que adems conduce a un procedimiento de reequilibrado


relativamente sencillo, y a una longitud de camino media prcticamente idntica a la del rbol
perfectamente equilibrado.

En un rbol AVL, se pueden realizar en O(lon n) unidades de tiempo, incluso en el peor de los casos,
las siguientes operaciones:

Encontrar un nodo con una clave dada.


Insertar un nodo con una clave dada.
Borrar un nodo con una clave dada.

Vamos a aadir un campo nuevo a la declaracin del tipo TArbol, que se llamar factor de equilibrio
(equ), este factor de equilibrio (equ) es la diferencia entre las alturas del rbol derecho y el izquierdo:

FE = altura subrbol derecho - altura subrbol izquierdo;

Por definicin, para un rbol AVL, este valor debe ser -1, 0 1.

Condiciones para variar equ:

o La insercin se hace en las hojas


o Cuando creamos un nuevo nodo el campo de equilibrio vale 0, ya que la altura del
subrbol izquierdo es igual que la del derecho.
o Cuando insertamos por la derecha incrementamos el valor del campo de equilibrio.
o Cuando insertamos por la izquierda decrementamos el valor del campo de equilibrio.

INSERCIN EN AVL

La insercin se hace siempre en las hojas, y vamos a tener un campo de equilibrio, adems una variable
global llamada crecido de tipo BOOLEAN, que en el momento de insertar lo vamos a poner a TRUE
para despus controlar si se ha desequilibrado o no.

Se sube restando o sumando 1 hasta llegar a un cero. Si a la hora de sumar o restar un uno se sale del
rango hay que reequilibrar.

DESEQUILIBRIOS Y REEQUILIBRIOS

Al insertar un nuevo nodo en un rbol equilibrado se pueden producir desequilibrios, que quedarn
representados en los casos mostrados a continuacin.

93
En las figuras, las cajas rectangulares representan subrboles, y la altura aadida por la insercin se
indica con cruces. Simples transformaciones restauran el equilibrio deseado.

DESEQUILIBRIO IZQUIERDA - IZQUIERDA SIMPLE.

Dado el siguiente Arbol Balanceado, donde se observa que el nodo B ya se encuentra crecido en 1 nivel
en su subarbol izquierdo.

Se aade al subarbol izquierdo del nodo A un nuevo dato "X", lo que causa un desequilibrio en el arbol,
ya que el subarbol izquierdo del nodo B se encuentra crecido ahora en 2 niveles.

Se corrige con la rotacin izquierda-izquierda simple, que consiste en subir el nodo A, que tendr al
final el campo de equilibrio a 0.

DESEQUILIBRIO DERECHA -DERECHA SIMPLE.

94
Se reequilibra con rotacin derecha-derecha simple. Es el reflejado del anterior.

La figura muestra la situacin antes y despus de la rotacin simple, donde el elemento X fue insertado
en E, y b corresponde al nodo N. Antes de la insercin, la altura de N es la altura de C+1. Idealmente,
para recuperar la condicin de balance se necesitaria bajar A en un nivel y subir E en un nivel, lo cual
se logra cambiando las referencias derecha de b e izquierda de d, quedando este ltimo como nueva
raz del rbol, N'.

Ntese que ahora el nuevo rbol tiene la misma altura que antes de insertar el elemento, C+1, lo cual
implica que no puede haber nodos desbalanceados ms arriba en el rbol, por lo que es necesaria una
sola rotacin simple para devolver la condicin de balance al rbol. Ntese tambin que el rbol sigue
cumpliendo con la propiedad de ser ABB.

DESEQUILIBRIO IZQUIERDO-DERECHO COMPUESTO

Dado el siguiente Arbol Balanceado, donde se observa que el nodo B ya se encuentra crecido en 1 nivel
en su subarbol izquierdo.

Se aade al subarbol derecho del nodo A un nuevo dato "X", lo que causa un desequilibrio en el arbol,
ya que el subarbol izquierdo del nodo B se encuentra crecido ahora en 2 niveles.

95
Se corrige con la rotacin izquierda-derecha compuesta. Se sube el nodo C que pasa a tener el campo
de equilibrio a 0.

DESEQUILIBRIO DERECHO - IZQUIERDO COMPUESTO

Se reequilibra con rotacin derecha-izquierdo compuesto, es el reflejado del anterior.

96
Para el caso de la figura, la altura de N antes de la insercin era G+1. Para recuperar el balance del
rbol es necesario subir C y E y bajar A, lo cual se logra realizando dos rotaciones simples: la primera
entre d y f, y la segunda entre d, ya rotado, y b, obtenindose el resultado de la figura. A este proceso
de dos rotaciones simples se le conoce como rotacin doble, y como la altura del nuevo rbol N' es la
misma que antes de la insercin del elemento, ningn elemento hacia arriba del rbol queda
desbalanceado, por lo que solo es necesaria una rotacin doble para recuperar el balance del rbol
despus de la insercin. Ntese que el nuevo rbol cumple con la propiedad de ser ABB despus de la
rotacin doble.

EJEMPLO DE INSERCIONES DE NODOS

A continuacin se simulan las inserciones de nodos en un rbol de bsqueda equilibrado, partiendo del
rbol vaci. Por comodidad se supone que el campo clave es entero. El factor de equilibrio actual de un
nodo y el nuevo al aadir un nodo se representan como superndices de los nodos. Los punteros n, nl y
n2 referencia al nodo que viola la condicin de equilibrio y a los descendientes en el camino de
bsqueda.

Insertar las claves 68-45-29:

Una vez insertado el nodo con la clave 29, al regresar por el camino de bsqueda cambia los factores de
equilibrio, as el del nodo 45 pasa a -1, y en el nodo 68 se pasa a -2. Se ha roto el criterio de equilibrio y
debe de reestructurarse. Al ser los factores de equilibrio -l y -2 deben de realizarse una rotacin de los
nodos II para rehacer el equilibrio. Los movimientos de los punteros para realizar esta rotacin II

n^.izqdo = n1^.drcho
n1^.drcho = n
n = n1

Realizada la rotacin, los factores de equilibrio sern siempre O en las rotaciones simples. El rbol
queda de la forma siguiente:

97
Insercin de las claves 75 y 90

Una vez insertado el nodo con la clave 90, a la derecha del nodo 75, y regresar por el camino de
bsqueda para as calcular los nuevos factores de equilibrio, se observa que dicho factor queda
incrementado en 1 pues la insercin ha sido por la derecha. En el nodo con clave 68 queda roto el
equilibrio. Para reestructurar se realiza una rotacin DL Los movimientos de los punteros para realizar
esta rotacin DD:

n^.Drcho = n1^. Izqdo


n1^.Izqdo = n
n = n1

Una vez realizada la rotacin, los factores de equilibrio de los nodos implicados ser 0, como ocurre en
todas las rotaciones simples, el rbol queda como sigue:

Insertamos la clave 70

98
para insertar el nodo con la clave 70 se sigue el camino : Derecha de 45 izquierda de 75 y se inserta por
la derecha al nodo 68. al regresar por el camino de bsqueda.

Queda, los factores de equilibrio se incrementan en 1 si se fue por la rama derecha, se decrementa en
si se fue por la rama izquierda. En el nodo 45 cl balanceo se ha roto. La rotacin de los nados para
reestablecer el equilibrio es DI. Los movimientos de los punteros para realizar esta rotacin DI

n1^. Izqdo = n2^. Drcho


n1^. Drcho = n1
n^. Drcho = n2^. Izqdo
n2^. Izqdo = n
n = n2

Los factores de equilibrio de los nodos implicados en la rotacin dependen del valor antes de la
insercin del nodo referenciado por n2 segn esta tabla:

si n2 ^.fe= -1 n2^.fe = 0 n2^. fe =1


n^.fe 0 0 -1
n1^.fe 1 0 0
n2^.fe 0 0 0

Con esta rotacin el rbol quedara

Insercin de la clave 34

99
El camino seguido para insertar el nodo con clave 34 ha seguido el camino de izquierda dc 68,
izquierda de 45, derecha de 29. Al regresar por el camino de bsqueda, el factor de equilibrio del nodo
29 se incrementa en 1 por seguir el camino de la rama derecha, el del nodo 45 se decrementa en 1 por
seguir la rama izquierda y pasa a ser -2, se ha roto el criterio de equilibrio. La rotacin de los nodos
para reestablecer el equilibrio es ID.

Los movimientos de los punteros para realizar esta rotacin ID

n1^. Drcho = n2^.Izqdo


n2^. Izgdo = nl
n^. Izgdo = n2^.Drcho
n2^. Drcho = n
n = n2

Los factores de equilibrio de los nodos implicados en la rotacin dependen del valor antes de la
insercin del nodo referenciado por n2, segn esta tabla:

si n2 ^.fe= -1 n2^.fe = 0 n2^. fe =1


n^.fe 1 0 0
n1^.fe 0 0 -1
n2^.fe 0 0 0

Con esta rotacin el rbol quedara

IMPLEMENTACIN DE LA INSERCIN

100
Un algoritmo que inserte y reequilibre depender en forma crtica de la forma en que se almacene la
informacin relativa al equilibrio del rbol. Una solucin consiste en mantener la informacin sobre el
equilibrio, de forma completamente implcita, en la estructura misma del rbol. En este caso, sin
embargo, el factor de equilibrio debe "averiguarse" cada vez que se encuentre afectado por una
insercin, con el consiguiente trabajo resultante.

Otra forma (la que vamos a usar) consiste en atribuir a, y almacenar con, cada nodo un factor de
equilibrio explcito. La definicin de nodo se ampla entonces a:

TYPE Nodo=RECORD
Clave:Tclave;
Info:Tinfo;
Izq,Der:^Nodo;
Equi:-1..1
END

El proceso de insercin de un nodo consta fundamentalmente de las tres partes consecutivas siguientes:

Seguir el camino de bsqueda hasta que se comprueba que la clave an no est en el rbol.
Insertar el nuevo nodo y determinar el factor de equilibrio resultante.
Volver siguiendo el camino de bsqueda y comprobar el factor de equilibrio de cada nodo.

Aunque este mtodo realiza algunas comprobaciones que son redundantes, una vez que se establece el
equilibrio, ste no necesita comprobarse en los antecesores del nodo en cuestin.

En cada paso se debe mandar informacin sobre si la altura del subrbol (en el cual se ha realizado la
insercin) ha aumentado o no. Por lo tanto se extiende la lista de parmetros del procedimiento con el
BOOLEAN Crecido, que debe ser un parmetro de tipo variable, ya que se utiliza para transmitir un
resultado.

procedure insertar (dato : word; var p : pnodo; var h : boolean);


var
p1,p2:puntero;
begin
if p = nil then
begin
new (p);
h:= true;
with p^ do
begin
inf:= dato;
izq:= nil;
der:= nil;
equi:= 0;
contador:= 1;
end;
end
else
if dato < P^.Inf Then
begin
Insertar (dato,p^.Izq,h);
if h then {la rama izq. ha crecido}

101
case p^.equi of
+1: begin
p^.equi:=0;
h:= false;
end;
0: p^.equi:=-1;
-1: begin {reequilibrar}
p1 := p^.izq;
if pl^.equi = -1 then
begin { rotacion II simple }
p^.izq := pl^.der;
p1^.der:=p;
p^.equi=0;
p := p1;
end
else
begin { rotacin ID doble}
p2 := p1^.der;
p1^.der := p2^.izq;
p2^.izq := p1;
p^.izq := p2^.der;
p2^.der := p;
if p2^.equi = -1 then p^.equi := +1 else p^.equi :=0;
if p2^.equi = +1 then p1^.equi := -1 else p1^.equi :=0;
p := p2;
end;
p^.equi := 0;
h := false;
end;
end
end
else
if dato > p^.inf then
begin
insertar (dato, p^.der, h);
if h then {la rama derecha ha crecido}
case p^.equi of
-1: begin
p^.equi:=0;
h:=false;
end;
0: p^.equi :=+1;
+1: begin {reequilibrar}
p1 := p^.der;
if p1^.equi = +1 then
begin {rotacion DD simple}
p^.der := p1^.izq;
p1^.izq := p;
p^.equi := 0;
p := p1;
end
else
begin { rotacin DI doble }
p2 := p1^.izq;
p1^.izq := p2^.der;
p2^.der := p1;
p^.der := p2^.izq;
p2^.izq := p;
if p2^.equi = +1 then p^.equi := -1 else p^.equi := 0;

102
if p2^.equi = -1 then p1^.equi := +1 else p1^.equi := 0;
p := p2;
end;
p^.equi := 0;
h := false;
end;
end
end
else
begin
p^.contador := p^.contador +1;
h:=false;
end;
end;
end;

BORRADO EN AVL

Vamos a ver solo las distintas posibilidades que se pueden dar al borrar un nodo en el lado derecho. A
la izquierda es simtrico.

EQUILIBRIOS Y DESEQUILIBRIOS

CASO 1. RAIZ.

Caso 1.1: Si alguno de los subrboles que salen de la raz est vaci, entonces el otro estar vaci o
solo tiene un nodo, por ser un rbol equilibrado.

Si solo tiene dos nodos se sube el no-borrado hacia arriba.


Si solo est el nodo a borrar, el rbol acaba vaci.

Caso 1.2: Si no hay ningn subrbol vaci se sube el nodo de ms a la derecha del subrbol izquierdo,
se intercambia los valores de la raz por los de ese nodo, y despus es borra este ltimo.

CASO 2. BORRADO EN EL SUBRBOL DERECHO.

Caso 2.1: Si el campo de equilibrio tiene un cero, los dos subrboles son iguales. Entonces lo borramos
y el campo de equilibrio pasa a -1.

Caso 2.2: Si tiene un 1, entonces el subrbol derecho tiene una altura ms que el izquierdo. Al borrar
equilibramos y pasa a ser 0 ya que restamos 1.

Se puede haber desequilibrado por la izquierda porque al borrar se ha disminuido en uno la altura del
rbol.

103
Caso 2.3: Si tiene un -1, la altura del subrbol izquierdo es mayor que la del derecho. Al borrar en el
derecho se rompe el equilibrio, que pasa a -2.Hay tres casos.

Caso 2.3.1

Caso 2.3.2

Caso 2.3.3

Que visto de otra forma, puede ser:

104
Mediante rotacin izquierda-derecha compuesta queda:

Hay otros dos casos, que el bloque 2'2 sea el ms pequeo, o que lo sea el 2'1.Tienen altura N-2 y por
lo dems se tratan igual.

EJEMPLO DE BORRADO DE NODOS

Una vez eliminado el nodo siguiendo los criterios establecidos anteriormente, se regresa por el camino
de bsqueda calculando los nuevos factores de equilibrio (Fe) de los nodos visitados. Si en alguno de
los nodos se viola el criterio de equilibrio, debe de restaurarse el equilibrio.

En el algoritmo de insercin, una vez que era efectuada una rotacin el proceso terminaba ya que los
nodos antecedentes mantenan el mismo factor de equilibrio. En la eliminacin debe de continuar el
proceso puesto que se puede producir ms de una rotacin en el retroceso realizado por el camino de
bsqueda, pudiendo llegar hasta la raz del rbol.

En los procedimientos se utiliza el argumento boolean hh, ser activado cuando la altura del subrbol
disminuya debido a que se haya eliminado un nodo, o bien porque al reestructurar haya quedado
reducida la altura del subrbol.

105
En el rbol de la figura va a ser eliminado el nodo con la clave 42: al ser un nodo hoja el borrado es
simple, se suprime el nodo. Al volver por el camino de bsqueda para determinar los Fe, resulta que el
Fe del nodo con clave 39 pasara a ser -2 ya que ha decrementado la altura de la rama derecha, es
violado el criterio de equilibrio. Hay que reestructurar el rbol de raz 39

Rotacin ii por que


N^.fe (-1-1) y
n1^.fe <=0

El rbol resultante es

Ahora se elimina el nodo con la clave 21. Al tener dos ramas, toma el nodo ms a la derecha de la rama
izquierda que es el de clave 11. Al volver por el camino de bsqueda para calcular los Fe, el factor de
equilibrio del nodo 11 pasara a ser 2 y por tanto hay reestructurar el rbol de raz II.

106
Rotacin ID por que
N^.fe (1+1) y
n1^.fe < 0

El rbol resultado es :

En estos dos ejemplos se observa que despus de realizar la eliminacin de un nodo, y cuando se
regresa por el camino de bsqueda, el factor de equilibrio del nodo visitado disminuye en 1 si la
eliminacin se hizo por su rama derecha y se incrementa en 1 si la eliminacin se hizo por su rama
izquierda. Consideremos ahora este rbol equilibrado:

Se elimina el nodo de clave 25. Como es un nodo hoja se suprime. La supresin se hace por la rama
izquierda, por lo que la altura de la rama derecha correspondiente aumenta en 1, y lo mismo ocurre con
el factor de equilibrio.

107
Los factores de equilibrio quedan:

Rotacin DD por que


N^.fe = 1+1
N1^.fe >= 1

El rbol resultante es:

Al seguir regresando por el camino de bsqueda, el nodo raz debe de incrementar su Fe con lo que
pasara a +2, por consiguiente hay que restaurar el rbol, la rotacin es derecha-izquierda ya que

N^.fe 1+1 y n1^.fe <0

El nuevo rbol queda as es

108
IMPLEMENTACIN DE LA ELIMINACIN

En el algoritmo de supresin se introducen dos procedimientos simtricos de equilibrado: Equilibrar1


se invoca cuando la altura de la rama izquierda ha disminuido y Equilibnar2 se invocar cuando la
altura de la rama derecha haya disminuido.

En el procedimiento Equilibrar1 al disminuirla altura de la rama izquierda, el factor de equilibrio se


incrementa en 1. Por lo que de violarse el factor de equilibrio la rotacin que se produce es del tipo
derecha-derecha, o derecha-izquierda.

procedure Rotaciondd (var N: Ptrae; Nl: ptrae);


begin
N^.Drcho:=N1^.Izqdo;
N1^. Izgdo:=n;
if N1^. Fe= 1 then
begin
N^.Fe:=0;
N1^.Fe:=0
end
else
begin
N^.Fe:= 1;
Nl^.Fe:= -1;
end,
N :=N1;
end;

procedure Rotaciondi (var N: Ptrae; Nl: Ptrae);


var
N2 : Ptrae;
begin
N2:=Nl^.lzqdo;
N^.Drcho:=N2^.Izqdo;
N2^.Izqdo:=N;
Nl^.lzqdo:=N2^.Drcho;
N2^.Drcho:=Nl;
if (N2^.Fe=l ) then N^.Fe=-l else N^. Fe: =0
if (N2^.Fe=-l) then N1^.Fe:=1 else Nl^.Fe:=0;
N2^.Fe:=0;
N :=N2;
end;

109
procedure Rotacionii(var N: Ftrae; N1: Ptrae);
begin
N^.Izqdo:= N1^.Drcho;
N1^.Drcho:=N;
if N1^.Fe= -1 then
begin
N^.Fe :=0;
N1^.Fe := 0;
end
else
begin
N^.Fe :=-1;
N1^.Fe := 1
end;
N := N1;
end;

procedure Rotacionid(Vat N:Ptrae; N1:Ptrae)


var
n2:ptrae;
begin
N2= N1^.drcho;
N^.Izqdo:= N2^.Drcho;
N2^.Drcho:= N;
N1^.Drcho:= N2^Izqdo;
N2^.Izqdo:= Nl;
if (N2^.f2=1) then N1^.Fe:=-1 else N1^.Fe:=O;
if (N2^.Fe=-l) then N^.Fe:=l else N^..Fe:=O;
N2^.Fe:=0;
N:= N2;
end;

procedure Equilibrarl(var N:Ptrae: var hh; bolean)


{hh: activado cuando ha disminuido en altura la rama izquierda del nodo N}
var
Nl :Ptrae:
begin
case N^.Fe of
-1: N^.Fe:= O;
O: begin
N^.Fe:= 1;
hh:= false
end;
1: begin {Hay que restaurar el equilibrio}
Nl:= N^.drcho;
{Es determinado el tipo de rotacin}
if N1^. Fe >= 0 then
begin
if N1^. Fe = 0 then
hh;= false; {No disminuye de nuevo la altura}
Rotaciondd(N, N1)
end
else
Rotaciondi(N, N1)
end;
end;
end;

110
En el procedimiento Equilibnar2 al disminuir la altura de la rama derecha, el factor de equilibrio queda
decrementado en 1. De producirse una violacin del criterio de equilibrio, la rotacin ser del tipo
izquierda-izquierda, o izquierda-derecha.

procedure Equilibrar2(var N:Ptrae: var hh; bolean)


{hh: activado cuando ha disminuido en altura la rama izquierda del nodo N}
var
Nl :Ptrae:
begin
case N^.Fe of
1: N^.Fe := 0;
0: begin
N^.Fe := -1;
hh:= false
end;
-1: begin {Hay que restaurar el equilibrio}
Nl:= N^.Izqdo;
{Es determinado el tipo de rotacin}
if N1^.Fe <= 0 then
begin
if N1^.Fe = 0 then
hh;= false; {No disminuye de nuevo la altura}
Rotacion_ii(N, N1)
end
else
Rotacion_id(N, Nl)
end;
end;
end;

A continuacin son escritos los procedimientos de borrar_balanceado y el procedimiento anidado bor.


El algoritmo que sigue es el mismo que el de borrado en los rboles de bsqueda sin criterio de
equilibrio. La principal diferencia est en que en el momento que una rama disminuye en altura es
llamado el procedimiento respectivo de equilibrar.

procedure borrar_balanceado(var R:Ptrae;var hh:boolean;X: Tipoinfo)


var
q: Ptrae;

procedure bor(var d: ptrae; var hh: boolean);


begin
if d^.Drcho<>nil then
begin
bor(d^.Drcho, hh);
if hh then {Ha disminuido rama derecha}
Equilibrar2 (d,hh)
end
else
begin
q^.info:=d^.info;
q: =d;
d:=d^.Izqdo;
hh:= true
end;
end;

begin

111
if not ArbolVacio( R ) then
if x < R^.info then
begin
borrar_balanceado(R^.lzqdo,hh , x):
if hh then
Equilibrarl.(R, hh)
end
else
if x>R^.info then begin
borrar_balanceado(R^.Drcho.,hh ,x)
if hh then
Equilibrar2(R, Hh)
end
else
begin {ha sido encontrado el nodo}
q:= R;
if q^.Drcho= nil then
begin
R:= q^.Izqdo;
hh:= true{Disminuye la altura}
end
else
if q ^.Izqdo=nil then
begin
R:=q^.drcho;
hh:= true
end
else
begin
bor(q^.Izqdo,hh);
if hh then
Equilibrar1(R, hh)
end;
dispose(q);
end;
end;

112
RBOLES BINARIOS DE EXPRESIONES

Los rboles binarios se utilizan para almacenar expresiones. Por ejemplo, el


arbol de la figura representa la expresin (A+B)*C. Las expresiones
matemticas se pueden escribir segn diversos tipos de notaciones. La
notacin infija es la empleada habitualmente y requiere el uso de parntesis,
pero nicamente cuando es necesario modificar la prioridad entre los distintos
operadores.

CONSTRUCCIN A PARTIR DE UNA EXPRESIN EN NOTACIN CONVENCIONAL

Para construir se utilizaran, como estructura de datos auxiliares, una pila de punteros a los nodos de
un rbol y otra pila de operadores para retenerlos temporalmente hasta que llegue el momento de
incorporarlos al rbol. Los pasos a seguir son lo siguientes.
6. Cuando se lee un OPERANDO se crea un rbol de un nodo y se mete el apuntador a el en
correspondiente pila.
7. Cuando se lee un OPERADOR se retiene en la pila de operadores. Los operadores se van poniendo
en esta pila hasta encontrar uno con mayor o igual prioridad, en cuyo caso se sacan los que hubiera
en la pila de mayor o igual prioridad y se coloca en ella este ultimo operador leido.
8. Cuando se lee un PARNTESIS IZQUIERDO se retiene en la pila de operadores.
9. Cuando se lee un PARNTESIS DERECHO se sacan los OPERADORES que hubiera en la pila de
operadores hasta encontrar el parntesis izquierdo.
10. El proceso termina cuando se acaba la entrada y la pila de operadores queda vaca.
Nota: Al sacar de la pila de operadores uno de ellos, extraer de la pila de punteros los dos ltimos
apuntadores. Con estos tres elementos, se forma un nuevo rbol cuya raz almacena el operador y
los punteros anteriores. El apuntador a este nuevo rbol se coloca ahora en la pila de apuntadores.

Ejemplo: Sea la expresin :


Q= 4+5^(2*3)+8

1.-

113
2.- El ) saca los operadores de la pila hasta el (

3.- El + saca de la pila todos los operadores con mayor prioridad que el y l continuacin se coloca el

4.-

5.-

114
TEMA 7

GRAFOS
OBJETIVOS

Analizar e implementar estructuras tipo malla para la representacin de sistemas. Desarrollar


algoritmos de procesamiento de una manera ptima.

CONTENIDO

7.1 Definiciones
7.2 Almacenamiento de un Grafo en Memoria
7.3 Aplicaciones

Los grafos son estructuras de datos, utilizadas comnmente en el manejo de redes, en la construccin
de circuitos elctricos, en las estrategias de ventas, en el rea de economa, cartografa y otras muchas
reas del conocimiento.

7.1 DEFINICIONES.
7.1.1 Grafo

Un grafo es una estructura de datos compuesta por vrtices y arcos. grficamente un grafo se puede ver
as:

Figura 7.1 Grafo

El conjunto de vrtices es: v = {A, B, C, D, E, F, G, H, I, J, K, L}

Un arco une dos vrtices adyacentes. Por ejemplo el arco JK o el arco EG o GE. No se puede hablar del
arco AC pero si del AB y del BC.

7.1.2 Grafo Dirigido

115
Un grafo dirigido o dgrafo, es aquel en el que sus arcos tienen una orientacin, por ejemplo:

Figura 7.2 Grafo con arcos dirigidos

El arco SERVIDOR-CONTROLADOR, es completamente vlido. En este dgrafo no existe el arco


CONTROLADOR-SERVIDOR.

El conjunto de vrtices del dgrafo anterior es:

V = { SERVIDOR, ESTACION UNO, ESTACION DOS, CONTROLADOR, DISPOSITIVO DE


SALIDA, TERMINAL BRUTA }

7.1.3 Adyacencia

Se dice que existe adyacencia entre dos vrtices si estn unidos por un arco. Tambin se dice que estos
vrtices son adjuntos. Por ejemplo para el siguiente grafo:

Figura 7.3 Adyacencia

los vrtices A y B son adyacentes. En el caso de dgrafos, la adyacencia se expresa desde o hacia.
Como en el siguiente ejemplo:

116
Figura 7.4 Adyacencia en un dgrafo

Para este caso, se dice que A es adyacente hacia B, y D es adyacente hacia E, A es adyacente desde C y
a su vez D desde B. Para simplificar se emplea la siguiente notacin:

AB: A es adyacente hacia B y B es adyacente desde A.


CA: C es adyacente hacia A y A es adyacente desde C.

7.1.4 Incidencia

Los arcos inciden en los vrtices. Un arco es incidente en un vrtice, si una de sus puntas llega a ese
vrtice. Por ejemplo:

Figura 7.5 Incidencia en un grafo

El arco a, es incidente en A y B.

Para el caso de los dgrafos:

Figura 7.6 Incidencia en un dgrafo.

El arco a es incidente en B. Este arco no es incidente en A ya que ese arco sale de A, y nunca llega a A.

7.1.5 Grafos y Digrafos Fuertemente Conectados

Un grafo est fuertemente conectado si desde cualquier vrtice se puede llegar a todos los dems; o si
desde cualquier vrtice, se pueden visitar todos los dems. Por ejemplo:

117
Figura 7.8 Grafo fuertemente conectado

De la misma manera, un dgrafo est fuertemente si desde cualquier vrtice se pueden visitar todos los
dems. Por ejemplo:

Figura 7.9 Dgrafo fuertemente conectado.

Desde los vrtices A,B, C, D y E se puede llegar a todos los otros vrtices. Por ello este dgrafo est
fuertemente conectado.

7.1.6 Grafos y Digrafos dbilmente conectados

Un grafo o dgrafo es dbilmente conectado, si por lo menos desde un vrtice no podemos llegar a los
dems. Esta propiedad la cumple el siguiente dgrafo:

Figura 7.10 Dgrafo dbilmente conectado.

En este caso desde B no se puede llegar a ningn otro nodo, por ello es un dgrafo dbilmente
conectado.

7.1.7 Camino Simple

118
Se presenta cuando a partir de cualquier vrtice, se puede recorrer la estructura, sin repetir ningn
vrtice ni ningn arco. Por ejemplo:

Figura 7.11 Camino simple

Partiendo del vrtice C, se puede recorrer todo el grafo, sin repetir vrtices ni arcos.

7.1.8 Grafo de Euler

Es un camino cerrado que recorre todos los arcos del grafo. Es decir se pueden visitar los vrtices o
nodos cuantas veces sea necesario, pero los arcos solo se pueden recorrer una vez.
Ejemplo:

Figura 7.12 Grafo de Euler

El recorrido desde el vrtice A puede ser : ACDEFGBEHDAHBA. Como se puede observar los nodos
D, E, B y H son visitados dos veces, el nodo A es visitado 3 veces pero todos los arcos son recorridos
una sola vez.

7.1.9 Circuito Hamiltoniano

Si partiendo de cualquier vrtice , se pueden recorrer todos los vrtices sin repetir ninguno, y
finalmente se llega al vrtice origen. En el grafo anterior se encuentra el siguiente circuito
Hamiltoniano : A C D E F G B H A.

Un grafo Hamiltoniano que recorre n vrtices, consiste exactamente de n arcos.

7.1.10 Grado de un vertice

Es el nmero de arcos que inciden en un vrtice. Para los dgrafos pueden existir para cada vrtice dos
tipos de grado:

GRADO DE ENTRADA

119
GRADO DE SALIDA

Los grados de entrada de un vrtice en un dgrafo, se determinan por el nmero de arcos que inciden en
el vrtice y los grados de salida se determinan por el nmero de arcos que parten del vrtice.

Figura 7.13 Grados de entrada y de salida.

Para la figura anterior, los grados de entrada y salida para cada vrtice son:

GRADO- GRADO-
VERTICE
ENTRADA SALIDA
A 2 0
B 2 0
C 1 3
D 0 3
E 2 1

7.1.11 Grafos Regulares

Un grafo se dice que es regular , si todos los vrtices tienen el mismo grado. Por ejemplo:

Figura 7.14 Grafo Regular

120
7.1.12 Arco Cclico

Un arco es cclico si parte de un vrtice y llega al mismo vrtice.

Ejemplo:

Figura 7.15 Grafo con arcos cclicos (AA y BB)

En la anterior figura se tienen dos arcos cclicos, uno en A y el otro en B.

7.1.13 Grafos Simples

Un grafo es simple, si no tiene arcos cclicos y existe un solo arco entre dos vrtices.

7.1.14 Grafos Completos

Un grafo es completo si cada vrtice tiene un grado igual a n-1, donde n es el nmero de vrtices que
componen el grafo. Por ejemplo los siguientes grafos son completos:

Figura 7.17 Grafos completos de


2, 3, 4, 5 y 6 vrtices.

121
7.2 ALMACENAMIENTO DE UN GRAFO EN MEMORIA.
Existen varias formas de almacenar estas estructuras en memoria.

COMO LISTA DE ADYACENCIA


COMO MATRIZ DE ADYACENCIA
COMO MATRIZ DE INCIDENCIA

Figura 7.18 Grafo a almacenar en memoria.

7.2.1 Lista De Adyacencia

Para almacenar un grafo en una lista de adyacencia, debemos trabajar con un arreglo de listas. Cada
una de estas listas almacena los adjuntos a un vrtice dado, comenzando por los vrtices de ms arriba
y los de ms a la izquierda como orden de prioridad.

Por ejemplo una lista tendr almacenados todos los adjuntos al vrtice E; otra lista tendr almacenados
todos los adjuntos al vrtice I, etc. Esta es la lista de adyacencia para el grafo anterior (figura 7.19):

Figura 7.19 Lista de adyacencia del


grafo de la figura 7.18

122
7.2.1.1 Almacenamiento en memoria. Grafo es un arreglo de estructuras de tipo nodo. Aqu la
estructura nodo est conformada por dos campos. El primero es el campo indice que es el identificador
de un nodo. El segundo es el campo siguiente que es un apuntador a otra estructura de tipo nodo.

La rutina Iniciar_grafo se encarga de colocar un cero en el campo de indice de cada elemento de la


estructura grafo, como tambin colocar el valor NULO para el campo siguiente, donde nv es el nmero
de vrtices del grafo.

INICIAR_GRAFO ( nv)
Inicio

i=1
Mientras ( i <= nv)
Ind[i]= 0
Sig[i]=A
i=i + 1
Fin-Mientras

Fin

El algoritmo Leer_grafo se encarga de leer el ndice de cada vrtice y sus correspondientes adjuntos
(que forman una lista) para as formar el grafo.

LEER_GRAFO(nv)
Inicio

INICIAR_GRAFO(nv)
i =1
Mientras ( i <= nv) Ejecute
nad =NumAdjuntos[i]
j =1
Mientras( j <= nad) Ejecute
ad =Lea(adjunto)
ins _ grafo (grafo, i, ad )
j=j + 1
Fin-Mientras
i =i + 1
Fin-Mientras

Fin

El algoritmo ins_grafo se encarga de crear el nodo en memoria que conformar la lista de adyacencia
para el vrtice i, dentro del arreglo grafo.

INS_GRAFO (grafo, i, ad)


Inicio

ASIGNA_NODO (nuevo, ad)


sig [i] =nuevo
q =A
p =*grafo [i].sig

Mientras (p=A) Haga

123
q =p
p = *p.sig
Fin-Mientras

Si (q = A)
*grafo [i].sig = nuevo
Sino
*q.sig = nuevo
Fin-Si

Fin

El algoritmo Recorrer_grafo ejecuta la operacin de Visita a cada nodo adjunto de todos los vrtices de
un grafo.

Recorrer_grafo (grafo, nv)


Inicio

i =1
Mientras (i<= nv)
p =grafo [i]
Visite_Vertice (p)
q =*grafo [i].sig

Mientras (q =A)
Visite_Vertice (q)
q =*q.sig
Fin-Mientras

i=i +1
Fin-Mientras

Fin

7.2.2 Matriz De Adyacencia

En este caso a cada elemento M[ i , j ], se le asigna un 0 si el vrtice i no es adjunto al vrtice j.; y un 1


en caso contrario. Para el mismo grafo (figura 7.18), la matriz de adyacencia es:

124
Figura 7.20 Matriz de adyacencia
para el grafo de la figura 7.18

Como se puede observar la matriz de adyacencia es simtrica.

7.2.2.1 Almacenamiento en memoria. Se tiene una matriz bidimensional denominada grafo. El orden
de la matriz es nv * nv, donde nv es el nmero de vrtices en el grafo. Cada elemento matriz[i,j] tiene
un valor de 0 si el nodo ( vrtice ) j es adjunto al nodo i.

Leer_grafo (grafo)
Inicio

nv =Leer_Numero_de_Vertices(grafo)
lniciar_grafo(grafo,nv)
i =1
Mientras (i <= nv)

j =Leer_adjunto(grafo[i])

Mientras (j )
matriz [i, j] =1
j =Leer_adjunto(grafo[j])
Fin-Mientras

i =i + 1

Fin-Mientras

Fin

7.2.3 Matriz De Incidencia

Esta estructura es aplicable para los dgrafos. En la matriz de incidencia cada fila representa a cada uno
de los nodos del grafo, y las columnas los posibles arcos de dicho grafo; en la casilla M [i ,j ], aparecer
un 1 cuando el nodo de la fila i es inicial, y un -1, cuando el nodo i es final. En la siguiente figura
aparece un dgrafo y su correspondiente matriz de incidencia:

Figura 7.21 Matriz de incidencia

125
7.2.3.1 Almacenamiento en memoria. Para este caso tambin se maneja una matriz bidimensional
denominada grafo, pero ahora el elemento grafo[i, j] ser igual a 1 si el nodo i es inicial, y ser igual a -
1 si es el nodo final. Tendr un valor de cero si los dos nodos, el nodo i y el nodo j no estn conectados
directamente.

Leer_grafo (grafo)
Inicio

nv =Lea numero de vrtices(grafo)


Iniciar_grafo(grafo,nv)
i =1

Mientras (i <= nv) Haga

j =Leer_nodo_de_salida(grafo[i])

Mientras (j ) Haga
grafo [i, j] = 1
j =Leer_nodo_de_salida(grafo[j])
Fin-Mientras

j =Leer nodo de entrada(grafo[i])

Mientras ( j <= nv ) Haga


grafo[i, j] = -1
j =Leer_nodo_de_entrada(grafo[j])
Fin-Mientras

i =i + 1

Fin-Mientras

Fin

7.3 APLICACIONES.
Dentro de las aplicaciones clsicas y fundamentales se encuentra el estudio de redes. En este campo se
han desarrollado tcnicas como son Clculo del Flujo Mximo y Clculo del Costo Mnimo; en ambos
casos se trata de optimizacin en redes.

Para el Flujo mximo existen 3 algoritmos conocidos:

METODO DE CORTES
METODO DE GRAFICO AUXILIAR
METODO DE FORD - FULKERSON

Para el Costo Mnimo existen 2 algoritmos conocidos:

METODO DE GRAFICOS DIRIGIDOS


METODO DE DIJKSTRA

126
7.3.1 Algoritmo De Dijkstra

Este algoritmo usado para determinar el costo mnimo, es el ms implementado en ciertos dispositivos
de Hardware. Se encarga de determinar las rutas con el menor costo, desde un nodo origen hacia todos
los otros nodos de un grafo.

El algoritmo va pasando por diferentes estados. En el estado K, las rutas ms cortas a los K nodos ms
cercanos han sido determinadas y estos nodos estn dentro de un grupo denominado M. En el estado K
+ 1, un nodo que no est en M y que tiene la ruta ms corta desde el nodo origen es incluido en M.

Al final todos los nodos estaran en M, y sus rutas desde el origen habran sido determinadas.

El algoritmo puede ser formalmente descrito como sigue:

N = nmero de nodos en el grafo( red ).


s = nodo fuente
M = grupo de nodos que han sido incorporados por el algoritmo.
dij= Costo del enlace desde el nodo i al nodo j; dii = 0 y dij =
si los dos nodos no estn directamente conectados;
dij>= 0 si los dos nodos estn directamente conectados.
Dn= costo de la ruta con el menor costo, desde el nodo s al nodo n.

El algoritmo tiene tres pasos; los pasos 2 y 3 son repetidos hasta que M = N. Es decir tales pasos son
repetidos hasta que las rutas finales han sido asignadas a todos los nodos de la red:

1. Inicializar:

M = {s}
// Al grupo de nodos M solo se incorpora el nodo origen.
Dn = dsn para n >s
// Los costos de las rutas iniciales hacia los nodos vecinos son simplemente los costos del enlace.

2. Encontrar el nodo vecino que no est en M y que tiene el enlace con menor costo desde el nodo s. El
nodo encontrado se incorpora a M.
Encontrar w M tal que Dw = min { Dj } para j M
Insertar w a M.

3. Actualizar las rutas con el costo mnimo:


Dn = min[Dn, Dw + dwm] para todo j M
S el ltimo trmino es el mnimo, la ruta de s a n es ahora la uta desde s a w concatenada con el enlace
que va de w a n.

Cada iteracin de los pasos 2 y 3 coloca un nuevo nodo en M y define la ruta con costo mnimo desde s
hasta ese nodo. Esa ruta solo pasa a travs de nodos que estn en M.

127
Figura 7.22 Dgrafo

La siguiente tabla muestra el resultado de aplicar el algoritmo sobre el grafo de la figura 7.22, usando s
=1 como nodo de origen.

La siguiente figura muestra el resultado de cada iteracin:

128
Figura 7.23 Algoritmo de Dijkstra

129