Sunteți pe pagina 1din 71

INSTITUTO POLITECNICO NACIONAL

ESCUELA SUPERIOR DE INGENIERIA MECANICA Y ELECTRICA


UNIDAD CULHUACAN

ESTRUCTURA DE DATOS

APUNTES

PROFESOR.
ING. JUAN MANUEL HERNNDEZ ESPINOSA

MATERIA: ESTRUCTURAS DE DATOS.

CONTENIDO
Tema

Pgina

Objetivo General.................................................................................................3
Introduccin........................................................................................................4
Organizacin elemental de los datos.............................................................10
Introduccin a arreglos....................................................................................28
Introduccin a pilas..........................................................................................46
Introduccin a listas enlazadas.......................................................................50
Introduccin a rboles binarios......................................................................60
Introduccin rboles generales......................................................................65
Introduccin a grafos.......................................................................................67
Bibliografa........................................................................................................74

ING. JUAN MANUEL HERNNDEZ ESPINOSA

MATERIA: ESTRUCTURAS DE DATOS.

OBJETIVO GENERAL
El objetivo por el cual fueron creadas estas notas sobre Estructura de Datos, es el establecer
un material de apoyo y consulta para ti que eres alumno de Ing. en Computacin, Lic en
Sist. Comp., Lic. en Informtica o de cualquier otra rea afn en la cual se imparta la
materia de Estructura de Datos.
Una vez que hayas terminado de revisar detenidamente este material, sers capaz de
establecer estructuras lgicas de datos que te permitan hacer un uso ms eficiente del
espacio de memoria, de minimizar los tiempos de acceso, as como de lograr formas ms
efectivas de insercin y eliminacin de datos en estructuras de almacenamiento.
Ahora que ya sabes en lo que te puede ayudar estos apuntes, puedes empezar a hacer uso de
l, consultando todas tu tareas y dudas que tengas acerca de la materia.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

MATERIA: ESTRUCTURAS DE DATOS.

INTRODUCCION
Como ya sabemos, las computadoras fueron diseadas o ideadas como una
herramienta mediante la cual podemos realizar operaciones de clculo
complicadas en un lapso de mnimo tiempo. Pero la mayora de las aplicaciones
de este fantstico invento del hombre, son las de almacenamiento y acceso de
grandes cantidades de informacin.
La informacin que se procesa en la computadora es un conjunto de datos, que
pueden ser simples o estructurados. Los datos simples son aquellos que ocupan
slo un localidad de memoria, mientras que los estructurados son un conjunto de
casillas de memoria a las cuales hacemos referencia mediante un identificador
nico.
Debido a que por lo general tenemos que tratar con conjuntos de datos y no con
datos simples (enteros, reales, booleanos, etc.) que por s solos no nos dicen
nada, ni nos sirven de mucho, es necesario tratar con estructuras de datos
adecuadas a cada necesidad.
Las estructuras de datos son una coleccin de datos cuya organizacin se
caracteriza por las funciones de acceso que se usan para almacenar y
acceder a elementos individuales de datos.
Una estructura de datos se caracteriza por lo siguiente:
-Pueden descomponerse en los elementos que la forman.
-La manera en que se colocan los elementos dentro de la estructura afectar
la forma en que se realicen los accesos a cada elemento.
-La colocacin de los elementos y la manera en que se accede a ellos puede
ser encapsulada.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

MATERIA: ESTRUCTURAS DE DATOS.

1.1 Organizacin elemental de los datos.


Toda la informacin que se maneja dentro de un computador se
encuentra almacenada en su memoria, que en trminos simples es una
secuencia de caracteres (bytes) en donde se encuentran las
instrucciones y datos a los que se accede directamente a travs del
procesador del computador.
Los sistemas o mtodos de organizacin de datos que permiten un
almacenamiento eficiente de la informacin en la memoria del
computador son conocidos como estructuras de datos. Estos mtodos de
organizacin constituyen las piezas bsicas para la construccin de
algoritmos complejos para la solucin de problemas de una manera
eficiente.

1.1.1 Descripcin de la terminologa

Dato: Es una caracterstica o atributo de una entidad (persona,


animal o cosa), se conforma por un conjunto de caracteres
interrelacionados (numricos, alfabticos y especiales). Los datos
tiene asociados un identificador, un tipo y un rango de valores.
Entidad: Una entidad es cualquier "objeto" discreto sobre el que se
tiene informacin.
Informacin: Conjunto de datos ya procesados (transformados).
til para la toma de decisiones.
Tipos de datos: Numricos, alfabticos y alfanumricos. En el
lenguaje C++ se tienen tipos de datos predefinidos: int, float,
double, char, string y boolean.
Estructura de dato: Es un conjunto de datos organizados de tal
forma que tengan asociados un conjunto de operaciones con el
objetivo de facilitar su manipulacin. La eleccin de la estructura de
datos apropiada para cada problema depende de factores como la
frecuencia y el orden en que se realiza cada operacin sobre los datos.

Archivo: Es una estructura de datos conformada por registros


almacenados en un dispositivo de memoria secundaria.
Registro, fila o tupla: Es un conjunto de campos interrelacionados
que representan un objeto nico.
Campo: Es un espacio fsico de almacenamiento que alberga un
dato.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

MATERIA: ESTRUCTURAS DE DATOS.

Grupo de elementos: Conjunto de elementos (datos) tangibles e


intangibles enfocados a un mismo objetivo tema. Ejemplos:
campos de fecha, direccin, arreglos etc.
Elemento simple: es aquel tipo de dato que no permite ser
subdividido. En los lenguajes de programacin tenemos los tipos
de datos predefinidos.
Atributos: Conjunto de caractersticas propias de las entidades u
objetos.
Rango de valores: Son los valores permitidos para los tipos de
datos. Que van desde un lmite inferir hasta un lmite superior.
Clave primaria o llave: se llama clave primaria al contenido de un
campo o a una combinacin de campos que identifica de forma
nica a una entidad u objeto.
Arreglo: Es un conjunto de datos del mismo tipo que pueden ser
referenciados a travs de un mismo nombre. La forma de
identificar a un elemento determinado es a travs de un ndice.
Listas: Consiste en una secuencia de nodos, en los que se guardan
campos de datos y una o dos referencias (punteros) al nodo
anterior y/o posterior. Una lista lineal enlazada es una de las
estructuras de datos fundamentales, y puede ser usada para
implementar otras estructuras de datos.
Colas: Es un grupo de nodos en el que los nuevos elementos se
aaden por un extremo final y se quitan por el otro extremo
frontal. En las colas el elemento que entr primero sale tambin
primero, por ello se las llama como listas FIFO (first in, first out)
"primero en entrar, primero en salir". Es una estructura lineal de
datos.
Pilas: Una pila (stack en ingls) es una estructura de datos de tipo
LIFO (del ingls Last In First Out, ltimo en entrar, primero en salir)
que permite almacenar y recuperar datos.
Arbol: es una estructura no lineal en la que cada nodo puede apuntar a
uno o varios nodos.
Grafo: es una estructura de datos no lineal que tienen una naturaleza
generalmente dinmica, su estudio podra dividirse en dos grandes
bloques; grafos dirigidos y grafos no dirigidos.

1.2 Operaciones con estructuras de datos elementales

ING. JUAN MANUEL HERNNDEZ ESPINOSA

MATERIA: ESTRUCTURAS DE DATOS.


Un dato elemental se genera a travs de una declaracin que conlleva
un tipo de dato y un identificador. El tipo de dato predefinido tiene un
rango de valores preestablecidos.
Una declaracin es una instruccin en un programa que sirve para
comunicarse con la informacin del traductor del lenguaje a cerca del
nmero y tipo de los datos objeto que se necesitan durante la ejecucin
de un programa:
Tipos de datos predefinidos en C++: int, float, double, char, string
y boolean
Investigar y reportar los dems tipos de datos predefinidos
compuestos.
Las operaciones con las estructuras de datos elementales son:

Las aritmticas (+, - ,*, /)


Concatenacin
Ordenamiento
Intercambio
Borrado
Modificacin
Recorrido
Bsqueda
Insercin
Eliminacin, etc.

1.2.1 Descripcin de las operaciones, en estructuras de


datos, ordenacin y mezcla
En una estructura de datos se define la organizacin e interrelacin
de los datos y un conjunto de operaciones que se pueden realizar sobre
ellos. Las operaciones bsicas son:

Insercin o Alta: adicionar un nuevo valor a la estructura.


Eliminacin o Baja: borrar un valor de la estructura.
Cambios: modificar algunos de los valores de la estructura
Bsqueda: encontrar un determinado valor en la estructura para
realizar una operacin con este valor. La bsqueda se puede llevar
en forma SECUENCIAL o BINARIO (siempre y cuando los datos
estn ordenados)
Recorrido: es visitar y mostrar todos los valores de la estructura

ING. JUAN MANUEL HERNNDEZ ESPINOSA

MATERIA: ESTRUCTURAS DE DATOS.


Otras operaciones que se pueden realizar son:

Ordenamiento: organizar ascendente o descendentemente los


valores de la estructura.
Mezcla: dadas dos estructuras originar una nueva que contenga a
las dos combinadas.

Notacin numrica:
En C/C++ se usan tres tipos de numeracin para la definicin de
constantes numricas, la decimal, la octal y la hexadecimal, segn se
use la numeracin en base 10, 8 16, respectivamente.
Por ejemplo, el nmero 127, se representar en notacin decimal como
127, en octal como 0177 y en hexadecimal como 0x7f.
En notacin octal se usan slo los dgitos del '0' al '7', en hexadecimal,
se usan 16 smbolos, los dgitos del '0' al '9' tienen el mismo valor que
en decimal, para los otros seis smbolos se usan las letras de la 'A' a la
'F', indistintamente en maysculas o minsculas. Sus valores son 10
para la 'A', 11 para la 'B', y sucesivamente, hasta 15 para la 'F'.
Segn el ejemplo el nmero 0x7f, donde "0x" es el prefijo que indica que
se trata de un nmero en notacin hexadecimal, sera el nmero 7F, es
decir, 7*16+15=127. Del mismo modo que el nmero 127 en notacin
decimal sera, 1*10+2*10+7=127. En octal se usa como prefijo el dgito
0. El nmero 0177 equivale a 1*8+7*8+7=127.
De este modo, cuando trabajemos con operaciones de bits, nos resultar
mucho ms sencillo escribir valores constantes usando la notacin
hexadecimal u octal. Por ejemplo, resulta ms fcil predecir el resultado
de la siguiente operacin:
Que:
A = 0xaa & 0x55;
En ambos casos el resultado es 0, pero en el primero resulta ms
evidente, ya que 0xAA es en binario 10101010 y 0x55 es 01010101, y la
operacin "AND" entre ambos nmeros es 00000000, es decir cero.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

MATERIA: ESTRUCTURAS DE DATOS.


Tambin podemos usar notacin exponencial, por ejemplo:
double x = 10e4;
double y = 4.12e2;
double pi = 3.141592e0;
El formato exponencial consiste en un nmero, llamado mantisa, que
puede ser entero o con decimales, seguido de una letra 'e' o 'E' y por
ltimo, otro nmero, este entero, que es el exponente de una potencia
de base 10.
Los valores anteriores son:
x = 10 x 104 = 100000
y = 4,12 x 102 = 412
pi = 3.141592 x 100 = 3.141592
Al igual que con los enteros, es indiferente usar los sufijos en
maysculas o minsculas, pero es preferible usar maysculas, sobre
todo con la "L", ya que la 'l' minscula puede confundirse con un uno '1'.

1.3.1 Funciones Matemticas


Para facilitar los clculos C++ proporciona funciones pre-programadas
estndares que pueden incluirse en un programa.
Aunque antes de utilizar dichas funciones, es necesario saber:
EL nombre de la funcin matemtica deseada
Que hace la funcin matemtica
El tipo de datos requerido por la funcin matemtica
El tipo de resultado devuelto por la funcin matemtica
Como incluir la biblioteca
La biblioteca es la siguiente:
#include <cmath.h>
Se muestra a continuacin una lista de funciones matemticas. Son fciles de usar y algunas
de ellas han sido ya usadas previamente.
ING. JUAN MANUEL HERNNDEZ ESPINOSA

MATERIA: ESTRUCTURAS DE DATOS.


double abs(double x)// Devuelve el valor absoluto del nmero en punto
flotante x.

double floor(double x) //Redondea x hacia abajo al entero ms cercano.

double ceil(double x) //Redondea x hacia arriba al entero ms cercano.

double exp(double x) //Devuelve el valor de e (la base de los logaritmos


naturales) elevado a la potencia x.

double log(double x);// Devuelve el logaritmo neperiano de x.

double log10(double x) //Devuelve el logaritmo decimal de x.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

10

MATERIA: ESTRUCTURAS DE DATOS.

Algunas ms de las mencionadas:


double acos(double x) //Calcula el arco coseno de x.
double asin(double x) //Calcula el arco seno de x.
double atan(double x) //Devuelve el arco tangente en radianes.
double atan2(double y, double x) //Calcula el arco tangente de las dos
variables x e y.
double cos(double x) //devuelve el coseno de x, donde x est dado en
radianes.
double cosh(double x) //Devuelve el coseno hiperblico de x.
double fmod(double x, double y)// Calcula el resto de la divisin de x
entre y. El valor devuelto es x - n * y, donde n es el cociente de x / y.
double frexp(double x, int *exp)// Se emplea para dividir el nmero x en
una fraccin normalizada y un exponente que se guarda en exp .
long int labs(long int j)// Calcula el valor absoluto de un entero largo.
double ldexp(double x, int exp)// Devuelve el resultado de multiplicar el
nmero x por 2 elevado a exp (inversa de frexp).
double modf(double x, double *iptr)// Divide el argumento x en una parte
entera y una parte fraccional. La parte entera se guarda en iptr.
double pow(double x, double y)// Devuelve el valor de x elevado a y.
double sin(double x)// Devuelve el seno de x.
double sinh(double x)// Regresa el seno hiperblico de x.
double sqrt(double x)// Devuelve la raz cuadrada no negativa de x.
double tan(double x)// Devuelve la tangente de x.
double tanh(double x)// Devuelve la tangente hiperblica de x.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

11

MATERIA: ESTRUCTURAS DE DATOS.

1.3.2 Notacin Algortmica


Algoritmo: El termino algoritmo se utiliza en informtica para describir un mtodo de
resolucin de un problema que es adecuado para su implementacin como programa de
computadora. Los algoritmos son la <<esencia>> de la informtica 1
La primera y ms sencilla forma de describir un algoritmo es empleando
el lenguaje natural; por ejemplo, el algoritmo para encontrar las races
de una ecuacin de segundo grado podra describirse as:
Definir los coeficientes de la ecuacin de segundo grado: a, b y c.
Determinar el valor del discriminante: b2-4ac.
Si el discriminante es cero slo hay una solucin: -b/(2a).
Si el discriminante es positivo pero no cero hay dos soluciones: (bdiscr)/(2a).
Si el discriminante es negativo no hay soluciones reales.
La ventaja fundamental es la facilidad de comprensin, cualquier
persona (hispanoparlante, por supuesto) que lea dicho algoritmo podra
entenderlo y aplicarlo; sin embargo, son varios los problemas que
plantea describir un algoritmo de esta forma:
El lenguaje natural no es universal, este algoritmo sera completamente
intil para los no hispanoparlantes.
El lenguaje natural es ambiguo y, por tanto, susceptible de errores.
El lenguaje natural es demasiado amplio, lo que para una persona puede
ser una instruccin sencilla puede no serlo para otra y desde luego no lo
ser para un ordenador.

Definicin~~~Algoritmos en C++, Robert Sedgewick, PEARSON, Mxico D.F. 2000

ING. JUAN MANUEL HERNNDEZ ESPINOSA

12

MATERIA: ESTRUCTURAS DE DATOS.

Diagrama de Flujo
Diagrama de flujo: Un diagrama de flujo es la forma ms tradicional de especificar los
detalles algortmicos de un proceso. Estos diagramas utilizan una serie de smbolos con
significados especiales. Son la representacin grfica de los pasos de un proceso, que se
realiza para entenderlo mejor2

Flecha:
el
y

Indica
sentido

trayectoria
del
proceso
de
informacin o tarea.
Rectngulo:
Se
usa
para
representar un evento o proceso determinado. ste es controlado dentro
del diagrama de flujo en que se encuentra. Es el smbolo ms
comnmente utilizado. Se usa para representar un evento que ocurre de
forma automtica y del cual generalmente se sigue una secuencia
determinada.
Rombo: Se utiliza para representar una condicin. Normalmente el flujo
de informacin entra por arriba y sale por un lado si la condicin se
cumple o sale por el lado opuesto si la condicin no se cumple. El rombo
adems especifica que hay una bifurcacin.
Crculo: Representa un punto de conexin entre procesos. Se utiliza
cuando es necesario dividir un diagrama de flujo en varias partes, por
ejemplo por razones de espacio o simplicidad. Una referencia debe darse
dentro para distinguirlo de otros. La mayora de las veces se utilizan
nmeros en los mismos.

Definicin~~ http://es.wikipedia.org/wiki/Diagrama_de_flujo

ING. JUAN MANUEL HERNNDEZ ESPINOSA

13

MATERIA: ESTRUCTURAS DE DATOS.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

14

MATERIA: ESTRUCTURAS DE DATOS.

Ejemplo

La manera en que se siguen las construcciones es por orden descendente como lo


muestra la figura.

En esta otra se muestra la Iteracion (For,While,,etc) o repeticin.


Existen adems un sin fin de formas especiales para denotar las entradas, las salidas,
los almacenamientos, etctera.
De acuerdo al estndar ISO, los smbolos e incluso las flechas deben tener ciertas
caractersticas para permanecer dentro de sus lineamientos y ser considerados
sintcticamente correctos. En el caso del crculo de conexin, se debe procurar usarlo
slo cuando se conecta con un proceso contenido dentro de la misma hoja.
Existen tambin conectores de pgina, que asemejan a una "rectngulo oblicuo" y se
utilizan para unir actividades que se encuentran en otra hoja.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

15

MATERIA: ESTRUCTURAS DE DATOS.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

16

MATERIA: ESTRUCTURAS DE DATOS.

Notacin en Pseudocdigo
Pseudocdigo: Representacin de un algoritmo en lenguaje natural a
travs de las estructuras de control3
Por tanto, el pseudocdigo:
Es fcilmente comprensible para una persona que lo vea por vez
primera.
Est bien delimitado.
Elimina las ambigedades del lenguaje natural.
Se representa de una forma compacta.
De esta forma, el pseudocdigo se suele ver como un subconjunto de un
lenguaje natural que proporciona un nmero limitado de operaciones
para la construccin de algoritmos; la nica finalidad del pseudocdigo
(como de los organigramas) es la comunicacin entre seres humanos. A
continuacin se muestra un ejemplo de algoritmo descrito mediante un
pseudocdigo:
escribir Deme los coeficientes y resolver una ecuacin de
2 grado
escribir Cunto vale A?
leer a
escribir Cunto vale B?
leer b
escribir Cunto vale C?
leer c

Definicin~~~Algoritmos en C++, Robert Sedgewick, PEARSON, Mxico D.F. 2000

ING. JUAN MANUEL HERNNDEZ ESPINOSA

17

MATERIA: ESTRUCTURAS DE DATOS.

1.3.3 Estructuras de control y recursividad


Las estructuras de control de un lenguaje de programacin se refieren al
orden en que las instrucciones de un algoritmo se ejecutarn. El orden
de ejecucin de las sentencias o instrucciones determina el flujo de
control.
Estas estructuras de control son por consiguiente fundamentales en los
lenguajes de programacin y en los diseos de algoritmos
especialmente los pseudocdigos.
Las tres estructuras de control bsico son:

secuencia
seleccin
iteracin

La programacin estructurada hace los programas ms fciles de


escribir, verificar, leer y mantener, utiliza un nmero limitado de
estructuras de control que minimiza la complejidad de los problemas.
En mayo de 1996, Bhm y Jacopini demostraron que un programa propio
puede ser escrito utilizando solamente tres tipos de estructuras de
control: secuenciales, selectivas y repetitivas.
Un programa se define como propio si cumple lo siguiente:

Posee un solo punto de entrada y salida o fin para control del


programa.
Existen caminos desde la entrada hasta la salida que se pueden
seguir y que pasan por todas las partes del programa.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

18

MATERIA: ESTRUCTURAS DE DATOS.

Todas las instrucciones son ejecutadas y no existen lazos o bucles


infinitos.

En sntesis la programacin estructurada significa:

El programa completo tiene un diseo modular


Los mdulos se disean con metodologa descendente (mtodo
top-down)
Refinamientos sucesivos
Cada mdulo se codifica utilizando las 3 estructuras de control
bsicas: secuenciales, selectivas, repetitivas.
Estructuracin y modularidad son complementarios mas no iguales

Recursividad:
La recursividad es una tcnica de programacin importante. Se utiliza
para realizar una llamada a una funcin desde dentro de la misma
funcin, es decir una llamada a s misma. Como ejemplo til se puede presentar
el clculo de nmeros factoriales. l factorial de 0 es, por definicin, 1.
Los factoriales de nmeros mayores se calculan mediante la
multiplicacin de 1 * 2 *..., incrementando el nmero de 1 en 1 hasta
llegar al nmero para el que se est calculando el factorial.

1.3.4 Implementacin de factorial en forma iterativa y


recursiva
Existen muchas funciones matemticas cuyos argumentos son nmeros
naturales, que pueden definirse de manera recursiva. Esto quiere decir
que el valor de la funcin para el argumento n puede definirse en
trminos del argumento n-1 (o alguno anterior). En este tipo de
definiciones siempre existir un caso base a partir del cual parte la
definicin, el cual normalmente es el valor de la funcin en cero o en
uno, aunque no necesariamente debe ser as.
Por ejemplo, el factorial puede definirse de manera recursiva de la
siguiente manera:

ING. JUAN MANUEL HERNNDEZ ESPINOSA

19

MATERIA: ESTRUCTURAS DE DATOS.

Para definir una funcin en forma recursiva es necesario especificar:

Caso(s) base: Donde la recursividad se detiene

Paso de recursin: Como se define un elemento distinto del base,


en trminos de elementos anteriores.

Usualmente los lenguajes de programacin permiten definir funciones de


manera recursiva. El lenguaje C es uno de ellos. La definicin recursiva
para el factorial sera:
int factorial(int n) {
if ((n == 0) || (n == 1))
return(1);
else
return(n*factorial(n-1));
}
Normalmente las definiciones recursivas pueden expresarse en forma no
recursiva. Sin embargo, dependiendo del caso, el resultado puede ser
ms confuso. Por ejemplo, una funcin en C que calcula el factorial en
forma iterativa sera:
int factorial(int n) {
int i, fact = 1;
for (i=2; i<=n; i++)
fact = fact * i;
return(fact); }
Sin embargo, los algoritmos iterativos tienen una ventaja en cuanto al
uso de memoria, si se comparan con los iterativos. La recursividad
requiere que se guarde el estado de la ejecucin antes de cada llamado
recursivo, implicando un gasto considerable de memoria. Es probable
que, por esta razn, las versiones recursivas tengan mayores
limitaciones al ejecutarse en un computador.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

20

MATERIA: ESTRUCTURAS DE DATOS.


La aplicacin de las definiciones recursivas puede ampliarse a una
amplia gama de problemas, en los que la solucin ms natural puede ser
la que se expresa de esta forma. Por ejemplo, para buscar un nmero en
un vector podemos tener una funcin que reciba como argumento el
vector, el rango de bsqueda y el nmero buscado. El prototipo de esta
funcin sera como:
int bsqueda(int vec[], int inicio, int fin, int num);
La funcin que quiere hacer la bsqueda hara el llamado indicando los
rangos apropiados para el vector:
Resultado = bsqueda(vector, 0, N, x);

La funcin bsqueda( ) puede hacer su trabajo partiendo el vector en


dos partes y llamndose a s misma en forma recursiva, de la siguiente
manera:

res1 = bsqueda(vec, inicio, fin-inicio/2, num);


res2 = bsqueda(vec, (fin-inicio/2)+1, fin, num);

ING. JUAN MANUEL HERNNDEZ ESPINOSA

21

MATERIA: ESTRUCTURAS DE DATOS.


El caso base sera cuando el vector que recibe la funcin bsqueda( )
contiene un nico elemento. En este caso simplemente compara el
elemento con el nmero buscado y retorna el valor apropiado

1.4 Arreglos unidimensionales


Un arreglo unidimensional es un tipo de datos estructurado que est
formado de una coleccin finita y ordenada de datos del mismo tipo. Es
la estructura natural para modelar listas de elementos iguales.
El tipo de acceso a los arreglos unidimensionales es el acceso directo, es
decir, podemos acceder a cualquier elemento del arreglo sin tener que
consultar a elementos anteriores o posteriores, esto mediante el uso de
un ndice para cada elemento del arreglo que nos da su posicin relativa.
Para implementar arreglos unidimensionales se debe reservar espacio
en memoria, y se debe proporcionar la direccin base del arreglo, la cota
superior y la inferior.
Representacin en memoria:
Los arreglos se representan en memoria de la forma siguiente:
int x[5];

1.4.1 Acceso a las diferentes localidades de un arreglo de


caracteres unidimensionales.
Los arreglos son una coleccin de variables del mismo tipo que se
referencian utilizando un nombre comn. Un arreglo consta de
posiciones de memoria contigua. La direccin ms baja corresponde al
primer elemento y la ms alta al ltimo. Un arreglo puede tener una o
varias dimensiones. Para acceder a un elemento en particular de un
arreglo se usa un ndice.
El formato para declarar un arreglo unidimensional es:
tipo nombre_arr [ tamao ] ;
ING. JUAN MANUEL HERNNDEZ ESPINOSA

22

MATERIA: ESTRUCTURAS DE DATOS.


Por ejemplo, para declarar un arreglo de enteros llamado listanum con
diez elementos se hace de la siguiente forma:
int listanum[10];
En C/C++, todos los arreglos usan cero como ndice para el primer
elemento. Por tanto, el ejemplo anterior declara un arreglo de enteros
con diez elementos desde listanum[0] hasta listanum[9].
La forma como pueden ser accesados los elementos de un arreglo, es de
la siguiente forma:
listanum[2] = 15; /* Asigna 15 al 3er elemento del arreglo listanum*/
num = listanum[2]; /* Asigna el contenido del 3er elemento a la variable
num */
El lenguaje C no realiza comprobacin de contornos en los arreglos. En el
caso de que sobrepase el final durante una operacin de asignacin,
entonces se asignarn valores a otra variable o a un trozo del cdigo,
esto es, si se dimensiona un arreglo de tamao N, se puede referenciar
el arreglo por encima de N sin provocar ningn mensaje de error en
tiempo de compilacin o ejecucin, incluso aunque probablemente se
provoque el fallo del programa. Como programador se es responsable de
asegurar que todos los arreglos sean lo suficientemente grandes para
guardar lo que pondr en ellos el programa.

1.5 Matrices
Una matriz (array ) es una zona de almacenamiento contiguo, que
contiene una serie de elementos del mismo tipo.
Sintaxis:
tipo variable_matriz[N][M];

Donde N y M son el nmero de filas y de columnas respectivamente (la


dimensin de la matriz). Se ha escrito la dimensin con letras
maysculas, ya que deben ser constantes, y al igual que con vectores se
suelen definir con constantes.
Ejemplo:
#define N 4 //nmero de filas de las matrices que voy a declarar
#define M 5 //nmero de columnas de las matrices que voy a declarar
main(){
double matriz1[N][M], matriz2[N][M];
int matriz_entera[N][M];
...}

ING. JUAN MANUEL HERNNDEZ ESPINOSA

23

MATERIA: ESTRUCTURAS DE DATOS.


Al igual que con vectores, las matrices se numeran empezando por el
ndice 0, con lo cual el elemento superior izquierdo es el [0][0] y el
inferior derecho es el [N-1][M-1]. En la siguiente tabla se muestra cual
sera la forma y los elementos de una matriz a[4][5], de tamao 45.
Vase que el primer elemento del array bidimensional es el a[0][0], el
siguiente sera el a[0][1], y as, hasta llegar al elemento a[3][4].

1.6 Registros
Es un tipo de dato estructurado formado por la unin de varios
elementos bajo una misma estructura. Estos elementos pueden ser, o
bien datos elementales (entero, real, carcter,...), o bien otras
estructuras de datos. A cada uno de esos elementos se le llama campo.
Un registro se diferencia de un vector en que ste es una coleccin de
datos iguales, es decir, todos del mismo tipo, mientras que en una
estructura los elementos que la componen, aunque podran serlo, no
tiene porque ser del mismo tipo.
Sintaxis:
typedef struct TipoNodo
{
int dato;
struct TipoNodo *sig;
struct TipoNodo *ant;

ING. JUAN MANUEL HERNNDEZ ESPINOSA

24

MATERIA: ESTRUCTURAS DE DATOS.

2.1 Introduccin Arreglos

Supongamos que nos enfrentamos a un problema como este: Una empresa que cuenta con
150 empleados, desea establecer una estadstica sobre los salarios de sus empleados, y
quiere saber cual es el salario promedio, y tambin cuantos de sus empleados gana entre
$1250.00 y $2500.00.
Si tomamos la decisin de tratar este tipo de problemas con datos simples, pronto nos
percataramos del enorme desperdicio de tiempo, almacenamiento y velocidad. Es por eso
que para situaciones de este tipo la mejor solucin son los datos estructurados.
Un arreglo puede definirse como un grupo o una coleccin finita, homognea y ordenada
de elementos. Los arreglos pueden ser de los siguientes tipos:

De una dimensin.
De dos dimensiones.
De tres o ms dimensiones.

2.2 Arreglos Unidimensionales


Un arreglo unidimensional es un tipo de datos estructurado que est formado de una
coleccin finita y ordenada de datos del mismo tipo. Es la estructura natural para modelar
listas de elementos iguales.
El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir, podemos
acceder a cualquier elemento del arreglo sin tener que consultar a elementos anteriores o
posteriores, esto mediante el uso de un ndice para cada elemento del arreglo que nos da su
posicin relativa.
Para implementar arreglos unidimensionales se debe reservar espacio en memoria, y se
debe proporcionar la direccin base del arreglo, la cota superior y la inferior.
REPRESENTACION EN MEMORIA
Los arreglos se representan en memoria de la forma siguiente:
x : array[1..5] of integer

ING. JUAN MANUEL HERNNDEZ ESPINOSA

25

MATERIA: ESTRUCTURAS DE DATOS.

Para establecer el rango del arreglo (nmero total de elementos) que componen el arreglo se
utiliza la siguiente formula:
RANGO = Ls - (Li+1)

donde:
ls = Lmite superior del arreglo
li = Lmite inferior del arreglo
Para calcular la direccin de memoria de un elemento dentro de un arreglo se usa la
siguiente formula:
A[i] = base(A) + [(i-li) * w]

donde :
A = Identificador nico del arreglo
i = Indice del elemento
li = Lmite inferior
w = Nmero de bytes tipo componente
Si el arreglo en el cual estamos trabajando tiene un ndice numerativo utilizaremos las
siguientes frmulas:
RANGO = ord (ls) - (ord (li)+1)
A[i] = base (A) + [ord (i) - ord (li) * w]

ING. JUAN MANUEL HERNNDEZ ESPINOSA

26

MATERIA: ESTRUCTURAS DE DATOS.

2.3 Arreglos Bidimensionales


Este tipo de arreglos al igual que los anteriores es un tipo de dato estructurado, finito
ordenado y homogneo. El acceso a ellos tambin es en forma directa por medio de un par
de ndices.
Los arreglos bidimensionales se usan para representar datos que pueden verse como una
tabla con filas y columnas. La primera dimensin del arreglo representa las columnas, cada
elemento contiene un valor y cada dimensin representa una relacin
La representacin en memoria se realiza de dos formas : almacenamiento por columnas o
por renglones.
Para determinar el nmero total de elementos en un arreglo bidimensional usaremos las
siguientes frmulas:
RANGO DE RENGLONES (R1) = Ls1 - (Li1+1)
RANGO DE COLUMNAS (R2) = Ls2 - (Li2+1)
No. TOTAL DE COMPONENTES = R1 * R2

REPRESENTACION EN MEMORIA POR COLUMNAS

int x [N][M];
int x[3][3];

Para calcular la direccin de memoria de un elemento se usan la siguiente formula:


A[i,j] = base (A) + [((j - li2) R1 + (i + li1))*w]

REPRESENTACION EN MEMORIA POR RENGLONES

Para calcular la direccin de memoria de un elemento se usan la siguiente formula:


A[i,j] = base (A) + [((i - li1) R2 + (j + li2))*w]

donde:

ING. JUAN MANUEL HERNNDEZ ESPINOSA

27

MATERIA: ESTRUCTURAS DE DATOS.


i = Indice del rengln a calcular
j = Indice de la columna a calcular
li1 = Lmite inferior de renglones
li2 = Lmite inferior de columnas
w = Nmero de bytes tipo componente

2.4 Arreglos Multidimensionales


Este tambin es un tipo de dato estructurado, que est compuesto por n dimensiones. Para
hacer referencia a cada componente del arreglo es necesario utilizar n ndices, uno para
cada dimensin
Para determinar el nmero de elementos en este tipo de arreglos se usan las siguientes
frmulas:
RANGO (Ri) = lsi - (lii + 1)
No. TOTAL DE ELEMENTOS = R1 * R2* R3 * ...* Rn

donde:
i = 1 ... n
n = No. total de dimensiones
Para determinar la direccin de memoria se usa la siguiente formula:
LOC A[i1,i2,i3,...,in] =
li2)*R3*R2*... (in - lin)*Rn]*w

base(A)

[(i1-li1)*R3*R4*Rn

(i2-

2.5 Operaciones Con Arreglos


Las operaciones en arreglos pueden clasificarse de la siguiente forma:

Lectura
Escritura

Asignacin

ING. JUAN MANUEL HERNNDEZ ESPINOSA

28

MATERIA: ESTRUCTURAS DE DATOS.

Actualizacin

Ordenacin

Bsqueda

a) LECTURA
Este proceso consiste en leer un dato de un arreglo y asignar un valor a cada uno de sus
componentes.
La lectura se realiza de la siguiente manera:
para i desde 1 hasta N haz
x<--arreglo[i]

b) ESCRITURA
Consiste en asignarle un valor a cada elemento del arreglo.
La escritura se realiza de la siguiente manera:
para i desde 1 hasta N haz
arreglo[i]<--x

c) ASIGNACION
No es posible asignar directamente un valor a todo el arreglo, por lo que se realiza de la
manera siguiente:
para i desde 1 hasta N haz
arreglo[i]<--algn_valor

d) ACTUALIZACION
Dentro de esta operacin se encuentran las operaciones de eliminar, insertar y modificar
datos. Para realizar este tipo de operaciones se debe tomar en cuenta si el arreglo est o no
ordenado.
Para arreglos ordenados los algoritmos de insercin, borrado y modificacin son los
siguientes:

1.- Insertar.
Si i< mensaje(arreglo contrario caso En arreglo[i]<--valor i<--i+1
entonces>

ING. JUAN MANUEL HERNNDEZ ESPINOSA

29

MATERIA: ESTRUCTURAS DE DATOS.

2.- Borrar.
Si N>=1 entonces
inicio
i<--1
encontrado<--falso
mientras i<=n y encontrado=falso
inicio
si arreglo[i]=valor_a_borrar entonces
inicio
encontrado<--verdadero
N<--N-1
para k desde i hasta N haz
arreglo[k]<--arreglo[k-1]
fin
en caso contrario
i<--i+1
fin
fin
Si encontrado=falso entonces
mensaje (valor no encontrado)

3.- Modificar.
Si N>=1 entonces
inicio
i<--1
encontrado<--falso
mientras i<=N y encontrado=false haz
inicio
Si arreglo[i]=valor entonces
arreglo[i]<--valor_nuevo
encontrado<--verdadero
En caso contrario
i<--i+1
fin
fin

2.6 Matrz Poco Densa Regular


Una matrz poco densa es aquella que est formada por elementos que en su mayora son
ceros. Este tipo de matrices son matrices cuadradas que se dividen en los siguientes tipos:

Matrz triangular superior


Matrz triangular inferior

Matrz tridiagonal

ING. JUAN MANUEL HERNNDEZ ESPINOSA

30

MATERIA: ESTRUCTURAS DE DATOS.


MATRIZ TRIANGULAR SUPERIOR
En este tipo de matrz los elementos iguales a cero se encuentran debajo de la diagonal
principal. Ejemplo:

Para evitar el desperdicio de memoria que se ocasionara al almacenar una matrz en donde
la mayora de los elementos son ceros, es conveniente traspasar a un arreglo unidimensional
todos los elementos diferentes de cero.
El arreglo con los elementos distintos de cero de la matrz anterior es el siguiente:

Una vez que hallamos vaciado la matrz, es indispensable conocer el lugar dentro del
arreglo unidimensional en el cual quedaron situados los elementos, y esto se logra con la
siguiente formula:
LOC(A[i,j])=base(A) + (n*(i-1)) - ((i-2)*(i-1))/2 + (j-1)
donde:
A=Matrz triangular superior
n=No. total de elementos
j= renglones
i=columnas

MATRIZ TRIANGULAR INFERIOR


En este tipo de matrices los elementos iguales a cero se encuentran por encima de la
diagonal principal. Ejemplo:

ING. JUAN MANUEL HERNNDEZ ESPINOSA

31

MATERIA: ESTRUCTURAS DE DATOS.

Una vez que vaciamos la matrz en un arreglo unidimensional, la formula para obtener las
posiciones de los elementos es la siguiente:

LOC(A[i,j])=base(A) + ((i-1)*i)/2 + (j-1)

MATRIZ TRIDIAGONAL
En sta, los elementos diferentes de cero se encuentran en la diagonal principal en las
diagonales por debajo encima de sta. Ejemplo:

Y el arreglo con los elementos diferentes de cero correspondiente a esta matrz es el


siguiente:

La localizacin de los elementos distintos de cero en el arreglo unidimensional se realiza


aplicando la siguiente formula:
LOC(A[i,j])=base(A) + 2*i + (j-3)

2.7 Ordenaciones en Arreglos

ING. JUAN MANUEL HERNNDEZ ESPINOSA

32

MATERIA: ESTRUCTURAS DE DATOS.


La importancia de mantener nuestros arreglos ordenados radica en que es mucho ms
rpido tener acceso a un dato en un arreglo ordenado que en uno desordenado.
Existen muchos algoritmos para la ordenacin de elementos en arreglos, enseguida veremos
algunos de ellos.

a)Seleccin Directa
Este mtodo consiste en seleccionar el elemento ms pequeo de nuestra lista para
colocarlo al inicio y as excluirlo de la lista.
Para ahorrar espacio, siempre que vayamos a colocar un elemento en su posicin correcta
lo intercambiaremos por aquel que la est ocupando en ese momento.
El algoritmo de seleccin directa es el siguiente:
i <- 1
mientras i<= N haz
min <-i
j <- i + 1
mientras j <= N haz
si arreglo[j] < [min] entonces
min <-j
j <- j + 1
intercambia(arreglo[min],arreglo[i])
i <- i +1

b)Ordenacin por Burbuja


Es el mtodo de ordenacin ms utilizado por su fcil comprensin y programacin, pero es
importante sealar que es el ms ineficiente de todos los mtodos .
Este mtodo consiste en llevar los elementos menores a la izquierda del arreglo los
mayores a la derecha del mismo. La idea bsica del algoritmo es comparar pares de
elementos adyacentes e intercambiarlos entre s hasta que todos se encuentren ordenados.
i <- 1
mientras i < N haz
j <- N
mientras j > i haz
si arreglo[j] < arreglo[j-1] entonces
intercambia(arreglo[j],arreglo[j-1])
j < j - 1
i <- i +1

c)Ordenacin por Mezcla


Este algoritmo consiste en partir el arreglo por la mitad, ordenar la mitad izquierda, ordenar
la mitad derecha y mezclar las dos mitades ordenadas en un array ordenado. Este ltimo

ING. JUAN MANUEL HERNNDEZ ESPINOSA

33

MATERIA: ESTRUCTURAS DE DATOS.


paso consiste en ir comparando pares sucesivos de elementos (uno de cada mitad) y
poniendo el valor ms pequeo en el siguiente hueco.
procedimiento mezclar(dat,izqp,izqu,derp,deru)
inicio
izqa <- izqp
dera <- derp
ind <- izqp
mientras (izqa <= izqu) y (dera <= deru) haz
si arreglo[izqa] < dat[dera] entonces
temporal[ind] <- arreglo[izqa]
izqa <- izqa + 1
en caso contrario
temporal[ind] <- arreglo[dera]
dera <- dera + 1
ind <- ind +1
mientras izqa <= izqu haz
temporal[ind] <- arreglo[izqa]
izqa <- izqa + 1
ind <- ind +1
mientras dera <= deru haz
temporal[ind] <=dat[dera]
dera <- dera + 1
ind <- ind + 1
para ind <- izqp hasta deru haz
arreglo[ind] <- temporal[ind]
fin

2.8 Bsquedas en Arreglos


Una bsqueda es el proceso mediante el cual podemos localizar un elemento con un valor
especifico dentro de un conjunto de datos. Terminamos con xito la bsqueda cuando el
elemento es encontrado.
A continuacin veremos algunos de los algoritmos de bsqueda que existen.

a)Bsqueda Secuencial
A este mtodo tambien se le conoce como bsqueda lineal y consiste en empezar al inicio
del conjunto de elementos , e ir atravez de ellos hasta encontrar el elemento indicado
hasta llegar al final de arreglo.
Este es el mtodo de bsqueda ms lento, pero si nuestro arreglo se encuentra
completamente desordenado es el nico que nos podr ayudar a encontrar el dato que
buscamos.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

34

MATERIA: ESTRUCTURAS DE DATOS.

ind <- 1
encontrado <- falso
mientras no encontrado y ind < N haz
si arreglo[ind] = valor_buscado entonces
encontrado <- verdadero
en caso contrario
ind <- ind +1

b)Bsqueda Binaria
Las condiciones que debe cumplir el arreglo para poder usar bsqueda binaria son que el
arreglo este ordenado y que se conozca el numero de elementos.
Este mtodo consiste en lo siguiente: comparar el elemento buscado con el elemento
situado en la mitad del arreglo, si tenemos suerte y los dos valores coinciden, en ese
momento la bsqueda termina. Pero como existe un alto porcentaje de que esto no ocurra,
repetiremos los pasos anteriores en la mitad inferior del arreglo si el elemento que
buscamos resulto menor que el de la mitad del arreglo, o en la mitad superior si el elemento
buscado fue mayor.
La bsqueda termina cuando encontramos el elemento o cuando el tamao del arreglo a
examinar sea cero.

encontrado <- falso


primero <- 1
ultimo <- N
mientras primero <= ultimo y no encontrado haz
mitad <- (primero + ultimo)/2
si arreglo[mitad] = valor_buscado entonces
encntrado <- verdadero
en caso contrario
si arreglo[mitad] > valor_buscado entonces
ultimo <- mitad - 1
en caso contrario
primero <- mitad + 1

c)Bsqueda por Hash


La idea principal de este mtodo consiste en aplicar una funcin que traduce el valor del
elemento buscado en un rango de direcciones relativas. Una desventaja importante de este
mtodo es que puede ocasionar colisiones.
funcion hash (valor_buscado)
inicio

ING. JUAN MANUEL HERNNDEZ ESPINOSA

35

MATERIA: ESTRUCTURAS DE DATOS.

fin

hash <- valor_buscado mod numero_primo

inicio <- hash (valor)


il <- inicio
encontrado <- falso
repite
si arreglo[il] = valor entonces
encontrado <- verdadero
en caso contrario
il <- (il +1) mod N
hasta encontrado o il = inicio

2.9 Introduccin a colas


Una cola es una estructura de almacenamiento, donde la podemos considerar como una lista
de elementos, en la que stos van a ser insertados por un extremo y sern extrados por otro.
Las colas son estructuras de tipo FIFO (first-in, first-out), ya que el primer elemento en
entrar a la cola ser el primero en salir de ella.
Existen muchsimos ejemplos de colas en la vida real, como por ejemplo: personas
esperando en un telfono pblico, nios esperando para subir a un juego mecnico,
estudiantes esperando para subir a un camin escolar, etc.

2.1.0 Representacin en Memoria


Podemos representar a las colas de dos formas :

Como arreglos
Como listas ordenadas

En esta unidad trataremos a las colas como arreglos de elementos, en donde debemos
definir el tamao de la cola y dos apuntadores, uno para accesar el primer elemento de la
lista y otro que guarde el ltimo. En lo sucesivo, al apuntador del primer elemento lo
llamaremos F, al del ltimo elemento A y MAXIMO para definir el nmero mximo de
elementos en la cola.

2.1.1 Cola Lineal

ING. JUAN MANUEL HERNNDEZ ESPINOSA

36

MATERIA: ESTRUCTURAS DE DATOS.


La cola lineal es un tipo de almacenamiento creado por el usuario que trabaja bajo la
tcnica FIFO (primero en entrar primero en salir). Las colas lineales se representan
grficamente de la siguiente manera:

Las operaciones que podemos realizar en una cola son las de inicializacin, insercin y
extraccin. Los algoritmos para llevar a cabo dichas operaciones se especifican ms
adelante.
Las condiciones a considerar en el tratamiento de colas lineales son las siguientes:

Overflow (cola llena), cuando se realice una insercin.


Underflow(cola vaca), cuando se requiera de una extraccin en la cola.

Vacio.

ALGORITMO DE INICIALIZACIN
F < -- 1
A <-- 0

ALGORITMO PARA INSERTAR


Si A=mximo entonces
mensaje (overflow)
en caso contrario
A<-- A+1
cola[A]<-- valor

ALGORITMO PARA EXTRAER


Si A&ltF entonces
mensaje (underflow)
en caso contrario
F <-- F+1
x <-- cola[F]

2.1.2 Cola Circular


ING. JUAN MANUEL HERNNDEZ ESPINOSA

37

MATERIA: ESTRUCTURAS DE DATOS.

Las colas lineales tienen un grave problema, como las extracciones slo pueden realizarse
por un extremo, puede llegar un momento en que el apuntador A sea igual al mximo
nmero de elementos en la cola, siendo que al frente de la misma existan lugares vacos, y
al insertar un nuevo elemento nos mandar un error de overflow (cola llena).
Para solucionar el problema de desperdicio de memoria se implementaron las colas
circulares, en las cuales existe un apuntador desde el ltimo elemento al primero de la cola.
La representacin grfica de esta estructura es la siguiente:

La condicin de vaco en este tipo de cola es que el apuntador F sea igual a cero.
Las condiciones que debemos tener presentes al trabajar con este tipo de estructura son las
siguientes:

Over flow, cuando se realice una insercin.


Under flow, cuando se requiera de una extraccin en la cola.

Vacio

ALGORITMO DE INICIALIZACIN
F < -- 0
A<-- 0

ALGORITMO PARA INSERTAR


Si (F+1=A) (F=1 y A=mximo) entonces
mensaje (overflow)
en caso contrario
inicio
si A=mximo entonces
A<--1
cola[A]<-- valor
en caso contrario
A <--A+1
cola[A]<-- valor
si F=0 entonces

ING. JUAN MANUEL HERNNDEZ ESPINOSA

38

MATERIA: ESTRUCTURAS DE DATOS.

fin

F <-- 1

ALGORITMO PARA EXTRAER


Si F=0 entonces
mensaje (underflow)
en caso contrario
x <-- cola[F]
si F=A entonces
F <-- 0
A<-- 0
en caso contrario
si F=mximo entonces
F <--1 en caso contrario F <-- F+1

2.1.3 Doble Cola


Esta estructura es una cola bidimensional en que las inserciones y eliminaciones se pueden
realizar en cualquiera de los dos extremos de la bicola. Grficamente representamos una
bicola de la siguiente manera:

Existen dos variantes de la doble cola:

Doble cola de entrada restringida.


Doble cola de salida restringida.

La primer variante slo acepta inserciones al final de la cola, y la segunda acepta


eliminaciones slo al frente de la cola

ING. JUAN MANUEL HERNNDEZ ESPINOSA

39

MATERIA: ESTRUCTURAS DE DATOS.

ALGORITMOS DE ENTRADA RESTRINGIDA

Algoritmo de Inicializacin
F < -- 1
A <-- 0

Algoritmo para Insertar


Si A=mximo entonces
mensaje (overflow)
en caso contrario
A <--A+1
cola[A]<-- valor

Algoritmo para Extraer


Si F&gtA entonces
mensaje (underflow)
en caso contrario
mensaje (frente/atrs)
si frente entonces
x <-- cola[F]
F <-- F+1
en caso contrario
x <-- cola[A]
A <-- A-1

ALGORITMOS DE SALIDA RESTRINGIDA

Algoritmo de Inicializacin
F <--1
A <-- 0

Algoritmo para Insertar


Si F&gtA entonces
mensaje (overflow)
en caso contrario
mensaje (Frente/Atrs)
si Frente entonces

ING. JUAN MANUEL HERNNDEZ ESPINOSA

40

MATERIA: ESTRUCTURAS DE DATOS.


cola[F] <--valor
en caso contrario
A <-- A+1
cola[A] <--valor

Algoritmo para Extraer


Si F=0 entonces
mensaje (underflow)
en caso contrario
x <--cola[F]
F <-- F+1

2.1.4 Cola de Prioridades


Esta estructura es un conjunto de elementos donde a cada uno de ellos se les asigna una
prioridad, y la forma en que son procesados es la siguiente:
1. Un elemento de mayor prioridad es procesado al principio.
2. Dos elementos con la misma prioridad son procesados de acuerdo al orden en que
fueron insertados en la cola.

Algoritmo para Insertar


x <--1
final<--verdadero
para i desde 1 hasta n haz
Si cola[i]&gtprioridad entonces
x <--i
final <--falso
salir
si final entonces
x <--n+1
para i desde n+1 hasta x+1
cola[i] <--prioridad
n <-- n+1

Algoritmo para Extraer


Si cola[1]=0 entonces
mensaje(overflow)
en caso contrario
procesar <--cola[1]
para i desde 2 hasta n haz
cola[i-1] <--cola[1]

ING. JUAN MANUEL HERNNDEZ ESPINOSA

41

MATERIA: ESTRUCTURAS DE DATOS.


n <-- n-1

2.1.5 Operaciones en Colas


Las operaciones que nosotros podemos realizar sobre una cola son las siguientes:

Insercin.
Extraccin.

Las inserciones en la cola se llevarn a cabo por atrs de la cola, mientras que las
eliminaciones se realizarn por el frente de la cola (hay que recordar que el primero en
entrar es el primero en salir).

ING. JUAN MANUEL HERNNDEZ ESPINOSA

42

MATERIA: ESTRUCTURAS DE DATOS.

3.1 Introduccin a pilas


Las pilas son otro tipo de estructura de datos lineales, las cuales presentan restricciones en
cuanto a la posicin en la cual pueden realizarse las inserciones y las extracciones de
elementos.
Una pila es una lista de elementos en la que se pueden insertar y eliminar elementos slo
por uno de los extremos. Como consecuencia, los elementos de una pila sern eliminados
en orden inverso al que se insertaron. Es decir, el ltimo elemento que se meti a la pila
ser el primero en salir de ella.
En la vida cotidiana existen muchos ejemplos de pilas, una pila de platos en una alacena,
una pila de latas en un supermercado, una pila de papeles sobre un escritorio, etc.
Debido al orden en que se insertan y eliminan los elementos en una pila, tambin se le
conoce como estructura LIFO (Last In, First Out: ltimo en entrar, primero en salir).

3.2 Representacin en Memoria


Las pilas no son estructuras de datos fundamentales, es decir, no estn definidas como tales
en los lenguajes de programacin. Las pilas pueden representarse mediante el uso de :

Arreglos.
Listas enlazadas.

Nosotros ahora usaremos los arreglos. Por lo tanto debemos definir el tamao mximo de la
pila, adems de un apuntador al ltimo elemento insertado en la pila el cual denominaremos
SP. La representacin grfica de una pila es la siguiente:

ING. JUAN MANUEL HERNNDEZ ESPINOSA

43

MATERIA: ESTRUCTURAS DE DATOS.


Como utilizamos arreglos para implementar pilas, tenemos la limitante de espacio de
memoria reservada. Una vez establecido un mximo de capacidad para la pila, ya no es
posible insertar ms elementos.
Una posible solucin a este problema es el uso de espacios compartidos de memoria.
Supongase que se necesitan dos pilas , cada una con un tamao mximo de n elementos. En
este caso se definir un solo arreglo de 2*n elementos, en lugar que dos arreglos de n
elementos.
En este caso utilizaremos dos apuntadores: SP1 para apuntar al ltimo elemento insertado
en la pila 1 y SP2 para apuntar al ltimo elemento insertado en la pila 2. Cada una de las
pilas insertar sus elementos por los extremos opuestos, es decir, la pila 1 iniciar a partir
de la localidad 1 del arreglo y la pila 2 iniciar en la localidad 2n. De este modo si la pila 1
necesita ms de n espacios (hay que recordar que a cada pila se le asignaron n localidades)
y la pila 2 no tiene ocupados sus n lugares, entonces se podrn seguir insertando elementos
en la pila 1 sin caer en un error de desbordamiento.

3.3 Notacin Infija, Postfija y Prefija


Las pilas son estructuras de datos muy usadas para la solucin de diversos tipos de
problemas. Pero tal vez el principal uso de estas estructuras es el tratamiento de expresiones
matemticas.

ALGORITMO PARA CONVERTIR EXPRESIONES INFIJAS EN POSTFIJAS


(RPN)
1. Incrementar la pila
2. Inicializar el conjunto de operaciones
3. Mientras no ocurra error y no sea fin de la expresin infija haz
o Si el carcter es:
1. PARENTESIS IZQUIERDO. Colocarlo en la pila
2. PARENTESIS DERECHO. Extraer y desplegar los valores hasta
encontrar parntesis izquierdo. Pero NO desplegarlo.
3. UN OPERADOR.
Si la pila esta vaca o el carcter tiene ms alta prioridad que
el elemento del tope de la pila insertar el carcter en la pila.
En caso contrario extraer y desplegar el elemento del tope de
la pila y repetir la comparacin con el nuevo tope.
4. OPERANDO. Desplegarlo.
4. Al final de la expresin extraer y desplegar los elementos de la pila hasta que se
vace.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

44

MATERIA: ESTRUCTURAS DE DATOS.

ALGORITMO PARA EVALUAR UNA EXPRESION RPN


1. Incrementar la pila
2. Repetir
o Tomar un caracter.
o Si el caracter es un operando colocarlo en la pila.
o Si el caracter es un operador entonces tomar los dos valores del tope de la
pila, aplicar el operador y colocar el resultado en el nuevo tope de la pila.
(Se produce un error en caso de no tener los 2 valores)
3. Hasta encontrar el fin de la expresin RPN.

3.4 Recursin
Podemos definir la recursividad como un proceso que se define en trminos de s mismo.
El concepto de recursin es difcil de precisar, pero existen ejemplos de la vida cotidiana
que nos pueden servir para darnos una mejor idea acerca de lo que es recursividad. Un
ejemplo de esto es cuando se toma una fotografa de una fotografa, o cuando en un
programa de televisin un periodista transfiere el control a otro periodista que se encuentra
en otra ciudad, y este a su vez le transfiere el control a otro.
Casos tpicos de estructuras de datos definidas de manera recursiva son los rboles binarios
y las listas enlazadas.
La recursin se puede dar de dos formas:

DIRECTA. Este tipo de recursin se da cuando un subprograma se llama


directamente a s mismo.
INDIRECTA Sucede cuando un subprograma llama a un segundo subprograma, y
este a su vez llama al primero, es decir el subproceso A llama al B, y el B invoca al
subproceso A.

3.5 Implementar Recursin Usando Pilas


Otra de las aplicaciones en las que podemos utilizar las pilas es en la implementacin de la
recursividad. A continuacin se mostrarn algunos ejemplos.
|
|
Factorial

1 ,

N=0

<

ING. JUAN MANUEL HERNNDEZ ESPINOSA

45

MATERIA: ESTRUCTURAS DE DATOS.


|
|

N*(n-1)!,

N&gt0

sp <--0
mientras n <> 1 haz
push(pila,n)
n<--n-1
mientras sp <> 0 haz
factorial<--factorial*pop(pila)

<

|
|
|
|

Q(a-b,b)+1,

si a < b
si a<=b

sp<--0
Q<--0
lee(a), lee(b)
mientras a>=b haz
push(pila,1)
a<--a-b
mientras sp< > 0 haz
Q<-- Q + pop(pila)

3.6 Operaciones en Pilas


Las principales operaciones que podemos realizar en una pila son:

Insertar un elemento (push).


Eliminar un elemento (pop).

Los algoritmos para realizar cada una de estas operaciones se muestran a continuacin. La
variable mximo para hacer referencia al mximo nmero de elementos en la pila.

Insercin (Push)
si sp=mximo entonces
mensaje (overflow)
en caso contrario
sp<-- sp+1
pila[sp]<-- valor

Eliminacin (Pop)
ING. JUAN MANUEL HERNNDEZ ESPINOSA

46

MATERIA: ESTRUCTURAS DE DATOS.

si sp=0 entonces
mensaje (underflow)
en caso contrario
x<--pila[sp]
sp<--sp-1

4.1 Introducin a listas enlazadas


Una lista enlazada o encadenada es una coleccin de elementos nodos, en donde cada uno
contiene datos y un enlace o liga.
Un nodo es una secuencia de caracteres en memoria dividida en campos (de cualquier
tipo). Un nodo siempre contiene la direccin de memoria del siguiente nodo de informacin
si este existe.
Un apuntador es la direccin de memoria de un nodo
La figura siguiente muestra la estructura de un nodo:

El campo liga, que es de tipo puntero, es el que se usa para establecer la liga con el
siguiente nodo de la lista. Si el nodo fuera el ltimo, este campo recibe como valor NIL
(vaco).
A continuacin se muestra el esquema de una lista :

4.2 Operaciones en Listas Enlazadas


Las operaciones que podemos realizar sobre una lista enlazada son las siguientes:

Recorrido. Esta operacin consiste en visitar cada uno de los nodos que forman la
lista . Para recorrer todos los nodos de la lista, se comienza con el primero, se toma
el valor del campo liga para avanzar al segundo nodo, el campo liga de este nodo
nos dar la direccin del tercer nodo, y as sucesivamente.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

47

MATERIA: ESTRUCTURAS DE DATOS.

Insercin. Esta operacin consiste en agregar un nuevo nodo a la lista. Para esta
operacin se pueden considerar tres casos:
o Insertar un nodo al inicio.
o Insertar un nodo antes o despus de cierto nodo.
o Insertar un nodo al final.
Borrado. La operacin de borrado consiste en quitar un nodo de la lista,
redefiniendo las ligas que correspondan. Se pueden presentar cuatro casos:
o Eliminar el primer nodo.
o Eliminar el ltimo nodo.
o Eliminar un nodo con cierta informacin.
o Eliminar el nodo anterior o posterior al nodo cierta con informacin.
Bsqueda. Esta operacin consiste en visitar cada uno de los nodos, tomando al
campo liga como puntero al siguiente nodo a visitar.

4.3 Listas Lineales


En esta seccin se mostrarn algunos algoritmos sobre listas lineales sin nodo de cabecera y
con nodo de cabecera.
Una lista con nodo de cabecera es aquella en la que el primer nodo de la lista contendr en
su campo dato algn valor que lo diferencie de los dems nodos (como : *, -, +, etc). Un
ejemplo de lista con nodo de cabecera es el siguiente:

En el caso de utilizar listas con nodo de cabecera, usaremos el apuntador CAB para hacer
referencia a la cabeza de la lista.
Para el caso de las listas sin nodo de cabecera, se usar la expresin TOP para referenciar al
primer nodo de la lista, y TOP(dato), TOP(liga) para hacer referencia al dato almacenado y
a la liga al siguiente nodo respectivamente.
Algoritmo de Creacin
top<--NIL
repite
new(p)
leer(p(dato))
si top=NIL entonces
top<--p
en caso contrario

ING. JUAN MANUEL HERNNDEZ ESPINOSA

48

MATERIA: ESTRUCTURAS DE DATOS.


q(liga)<--p
p(liga)<--NIL
q<--p
mensaje('otro nodo?')
leer(respuesta)
hasta respuesta=no

Algoritmo para Recorrido


p<--top
mientras p<>NIL haz
escribe(p(dato))
p<--p(liga:)

Algoritmo para insertar al final


p<--top
mientras p(liga)<>NIL haz
p<--p(liga)
new(q)
p(liga)<--q
q(liga)<--NIL

Algoritmo para insertar antes/despus de 'X' informacin


p<--top
mensaje(antes/despues)
lee(respuesta)
si antes entonces
mientras p<>NIL haz
si p(dato)='x' entonces
new(q)
leer(q(dato))
q(liga)<--p
si p=top entonces
top<--q
en caso contrario
r(liga)<--q
p<--nil
en caso contrario
r<--p
p<--p(link)
si despues entonces
p<--top
mientras p<>NIL haz
si p(dato)='x' entonces
new(q)
leer(q(dato))
q(liga)<--p(liga)
p(liga)<--q
p<--NIL

ING. JUAN MANUEL HERNNDEZ ESPINOSA

49

MATERIA: ESTRUCTURAS DE DATOS.


en caso contrario
p<--p(liga)
p<--top
mientras p(liga)<>NIL haz
p<--p(liga)
new(q)
p(liga)<--q
q(liga)<--NIL

4.4 Listas Dobles


Una lista doble , doblemente ligada es una coleccin de nodos en la cual cada nodo tiene
dos punteros, uno de ellos apuntando a su predecesor (li) y otro a su sucesor(ld). Por medio
de estos punteros se podr avanzar o retroceder a travs de la lista, segn se tomen las
direcciones de uno u otro puntero.
La estructura de un nodo en una lista doble es la siguiente:

Existen dos tipos de listas doblemente ligadas:

Listas dobles lineales. En este tipo de lista doble, tanto el puntero izquierdo del
primer nodo como el derecho del ltimo nodo apuntan a NIL.
Listas dobles circulares. En este tipo de lista doble, el puntero izquierdo del primer
nodo apunta al ltimo nodo de la lista, y el puntero derecho del ltimo nodo apunta
al primer nodo de la lista.

Debido a que las listas dobles circulares son ms eficientes, los algoritmos que en esta
seccin se traten sern sobre listas dobles circulares.
En la figura siguiente se muestra un ejemplo de una lista doblemente ligada lineal que
almacena nmeros:

En la figura siguiente se muestra un ejemplo de una lista doblemente ligada circular que
almacena nmeros:

ING. JUAN MANUEL HERNNDEZ ESPINOSA

50

MATERIA: ESTRUCTURAS DE DATOS.

A continuacin mostraremos algunos algoritmos sobre listas enlazadas. Como ya se


mencion, llamaremos li al puntero izquierdo y ld al puntero derecho, tambin usaremos el
apuntador top para hacer referencia al primer nodo en la lista, y p para referenciar al nodo
presente.

Algoritmo de creacin
top<--NIL
repite
si top=NIL entonces
new(p)
lee(p(dato))
p(ld)<--p
p(li)<--p
top<--p
en caso contrario
new(p)
lee(p(dato))
p(ld)<--top
p(li)<--p
p(ld(li))<--p
mensaje(otro nodo?)
lee (respuesta)
hasta respuesta=no

Algoritmo para recorrer la lista

--RECORRIDO A LA DERECHA.
p<--top
repite
escribe(p(dato))
p<--p(ld)
hasta p=top
--RECORRIDO A LA IZQUIERDA.
p<--top
repite
escribe(p(dato))
p<--p(li)
hasta p=top(li)

ING. JUAN MANUEL HERNNDEZ ESPINOSA

51

MATERIA: ESTRUCTURAS DE DATOS.

Algoritmo para insertar antes de 'X' informacin


p<--top
mensaje (antes de ?)
lee(x)
repite
si p(dato)=x entonces
new(q)
leer(q(dato))
si p=top entonces
top<--q
q(ld)<--p
q(li)<--p(li)
p(ld(li))<--q
p(li)<--q
p<--top
en caso contrario
p<--p(ld)
hasta p=top

Algoritmo para insertar despues de 'X' informacin


p<--top
mensaje(despues de ?)
lee(x)
repite
si p(dato)=x entonces
new(q)
lee(q(dato))
q(ld)<--p(ld)
q(li)<--p
p(li(ld))<--q
p(ld)<--q
p<--top
en caso contrario
p<--p(ld)
hasta p=top

Algoritmo para borrar un nodo


p<--top
mensaje(Valor a borrar)
lee(valor_a_borrar)
repite
si p(dato)=valor_a_borrar entonces
p(ld(li))<--p(ld)
p(li(ld))<--p(li)

ING. JUAN MANUEL HERNNDEZ ESPINOSA

52

MATERIA: ESTRUCTURAS DE DATOS.


si p=top entonces
si p(ld)=p(li) entonces
top<--nil
en caso contrario
top<--top(ld)
dispose(p)
p<--top
en caso contrario
p<--p(ld)
hasta p=top

4.5 Listas Circulares


Las listas circulares tienen la caracterstica de que el ltimo elemento de la misma apunta al
primero
La siguiente figura es una representacin grfica de una lista circular.

Enseguida se mostrarn los algoritmos ms comunes en listas circulares. Al igual que en las
secciones anteriores, utilizaremos el apuntador top para hacer referencia al primer nodo en
la lista.
Algoritmo de creacin
repite

new(p)
lee(p(dato))
si top=nil entonces
top<--p
q<--p
en caso contrario
q(liga)<--p
q<--p
p(liga)<--top
mensaje (otro nodo ?)
lee(respuesta)
hasta respuesta=no

Algoritmo para recorrer la lista


p<--top

ING. JUAN MANUEL HERNNDEZ ESPINOSA

53

MATERIA: ESTRUCTURAS DE DATOS.


repite

escribe(p(dato))
p<--p(liga)
hasta p=top

Algoritmo para insertar antes de 'X' informacin


new(p)
lee(p(dato))
si top=nil entonces
top<--p
p(liga)<--top
en caso contrario
mensaje(antes de ?)
lee(x)
q<--top
r<--top(liga)
repite
si q(dato)=x entonces
p(liga)<--q
r(liga)<--p
si p(liga)=top entonces
top<--p
q<--q(liga)
r<--r(liga)
hasta q=top

Algoritmo para insertar despus de 'X' informacin


new(p)
lee(p(dato))
mensaje(despus de ?)
lee(x)
q<--top
r<--top(liga)
repite
si q(dato)=x entonces
q(liga)<--p
p(liga)<--r
q<--q(liga)
r<--r(liga)
hasta q=top

Algoritmo para borrar


mensaje(valor a borrar )
lee(valor_a_borrar)
q<--top
r<--top
p<--top
mientras q(liga)<>top haz
q<--q(liga)
repite

ING. JUAN MANUEL HERNNDEZ ESPINOSA

54

MATERIA: ESTRUCTURAS DE DATOS.


si p(dato)=valor_a_borrar entonces
si p=top entonces
si top(liga)=top entonces
top<--NIL
en caso contrario
top<--top(liga)
q(liga)<--top
en caso contrario
r(liga)<--p(liga)
dispose(p)
p<--top
en caso contrario
r<--p
p<--p(liga)
hasta p=top

4.6 Listas Ortogonales


En este tipo de lista se utiliza para representar matrices. Los nodos contienen cuatro
apuntadores. Uno para apuntar al nodo izquierdo (li),otro para apuntar al derecho(ld), otro
al nodo inferior(lb) y por ltimo un apuntador al nodo superior(la).

Creacin de una lista ortogonal


top<--nil
mensaje(nmero de renglones)
lee(nmreo_renglones)
mensaje(nmero de columnas)
lee(nmero_columnas)
desde y=1 hasta nmero_renglones haz
new(p)
lee(p(dato))
p(li)<--p
p(ld)<--p
si top=NIL entonces
top<--p
top(lb)<--p
en caso contrario
p(la)<--top(la)
p(lb(la))<--p
p(lb)<--top
top(la)<--p
q<--top
desde y=1 hasta nmero_columnas-1 haz
s<--NIL
desde j=1 hasta nmero_renglones haz
new(q)
p(ld)<--q

ING. JUAN MANUEL HERNNDEZ ESPINOSA

55

MATERIA: ESTRUCTURAS DE DATOS.


p(li)<--q(li)
p(ld(li))<--p
q(li)<--p
si s=NIL entonces
s<--p
p(la)<--p
p(lb)<--p
en caso contrario
p(la)<--s(la)
p(lb(la))<--p
p(lb)<--s
s(la)<--p
q<--q(lb)

Algoritmo para recorrer una lista ortogonal


q<--top
repite
p<--q
repite
escribe(p(dato))
p<--p(ld)
hasta p=q
q<--q(lb)
hasta q=top

Borrado en listas ortogonales


q<--top
mensaje(valor a borrar)
lee(valor_a_borrar)
repite
p<--q
repite
si p(dato)=valor_a_borrar entonces
si p=top entonces
p(dato)<-- -999
en caso contrario
aux<--p
p(ld(li))<--p(ld)
p(li(ld))<--p(li)
p(la(lb))<--p(la)
p(lb(la))<--p(lb)
dispose(aux)
p<--q
en caso contrario
p<--p(ld)
hasta p=q
q<--q(lb)
hasta q=top

ING. JUAN MANUEL HERNNDEZ ESPINOSA

56

MATERIA: ESTRUCTURAS DE DATOS.

5.1 Introduccin a rboles binarios


A los arboles ordenados de grado dos se les conoce como arboles binarios ya que cada nodo
del rbol no tendr ms de dos descendientes directos. Las aplicaciones de los arboles
binarios son muy variadas ya que se les puede utilizar para representar una estructura en la
cual es posible tomar decisiones con dos opciones en distintos puntos.
La representacin grfica de un rbol binario es la siguiente:

5.2 Representacin en Memoria


Hay dos formas tradicionales de representar un rbol binario en memoria:

Por medio de datos tipo punteros tambin conocidos como variables dinmicas o
listas.
Por medio de arreglos.

Sin embargo la ms utilizada es la primera, puesto que es la ms natural para tratar este tipo
de estructuras.
Los nodos del rbol binario sern representados como registros que contendrn como
mnimo tres campos. En un campo se almacenar la informacin del nodo. Los dos
restantes se utilizarn para apuntar al subarbol izquierdo y derecho del subarbol en
cuestin.
Cada nodo se representa grficamente de la siguiente manera:

ING. JUAN MANUEL HERNNDEZ ESPINOSA

57

MATERIA: ESTRUCTURAS DE DATOS.


El algoritmo de creacin de un rbol binario es el siguiente:
Procedimiento crear(q:nodo)
inicio
mensaje("Rama izquierda?")
lee(respuesta)
si respuesta = "si" entonces
new(p)
q(li) <-- nil
crear(p)
en caso contrario
q(li) <-- nil
mensaje("Rama derecha?")
lee(respuesta)
si respuesta="si" entonces
new(p)
q(ld)<--p
crear(p)
en caso contrario
q(ld) <--nil
fin
INICIO
new(p)
raiz<--p
crear(p)
FIN

5.3 Clasificacin de Arboles Binarios


Existen cuatro tipos de rbol binario:.

A. B. Distinto.
A. B. Similares.
A. B. Equivalentes.
A. B. Completos.

A continuacin se har una breve descripcin de los diferentes tipos de rbol binario as
como un ejemplo de cada uno de ellos.

A. B. DISTINTO
Se dice que dos rboles binarios son distintos cuando sus estructuras son diferentes.
Ejemplo:

ING. JUAN MANUEL HERNNDEZ ESPINOSA

58

MATERIA: ESTRUCTURAS DE DATOS.

A. B. SIMILARES
Dos arboles binarios son similares cuando sus estructuras son idnticas, pero la informacin
que contienen sus nodos es diferente. Ejemplo:

A. B. EQUIVALENTES
Son aquellos arboles que son similares y que adems los nodos contienen la misma
informacin. Ejemplo:

A. B. COMPLETOS
Son aquellos arboles en los que todos sus nodos excepto los del ultimo nivel, tiene dos
hijos; el subarbol izquierdo y el subarbol derecho.

5.4 Recorrido de un Arbol Binario


Hay tres manera de recorrer un rbol : en inorden, preorden y postorden. Cada una de ellas
tiene una secuencia distinta para analizar el rbol como se puede ver a continuacin:
1. INORDEN
o Recorrer el subarbol izquierdo en inorden.
o Examinar la raz.
o Recorrer el subarbol derecho en inorden.
2. PREORDEN
o Examinar la raz.
o Recorrer el subarbol izquierdo en preorden.
o recorrer el subarbol derecho en preorden.
ING. JUAN MANUEL HERNNDEZ ESPINOSA

59

MATERIA: ESTRUCTURAS DE DATOS.


3. POSTORDEN
o Recorrer el subarbol izquierdo en postorden.
o Recorrer el subarbol derecho en postorden.
o Examinar la raz.
A continuacin se muestra un ejemplo de los diferentes recorridos en un rbol binario.

Inorden: GDBHEIACJKF
Preorden: ABDGEHICFJK
Postorden: GDHIEBKJFCA

5.5 Arboles Enhebrados


Existe un tipo especial de rbol binario llamado enhebrado, el cual contiene hebras que
pueden estar a la derecha o a la izquierda. El siguiente ejemplo es un rbol binario
enhebrado a la derecha.

ARBOL ENHEBRADO A LA DERECHA. Este tipo de rbol tiene un apuntador a


la derecha que apunta a un nodo antecesor.
ARBOL ENHEBRADO A LA IZQUIERDA. Estos arboles tienen un apuntador a
la izquierda que apunta al nodo antecesor en orden.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

60

MATERIA: ESTRUCTURAS DE DATOS.

5.6.- Control de Acceso a los Elementos de un Arreglo


En C++, el acceso a los elementos de un arreglo tiene que ser controlado por el
programador, ya que el lenguaje no restringe la posibilidad de accesar a
posiciones de memoria que estn ms abajo de la ltima posicin reservada
para el arreglo. Lo mismo sucede cuando se manejan cadenas, donde el
programador tiene la responsabilidad de controlar el acceso a los caracteres
de la cadena, tomando como lmite el terminador nulo. En el listado 5.6 se
presenta un ejemplo de acceso a los 5 bytes colocados abajo del terminador
nulo de una cadena dada por el usuario.
#include
#include
#include

// Para gets() y puts()


// Para clrscr() y gotoxy()
// Para strlen()

void main()
{
char nombre[31];
clrscr();
gotoxy(10,1);
puts(" Cul es tu nombre ? ");
gotoxy(35,1);
gets(nombre);
clrscr();
gotoxy (10,1);
puts("ELEMENTO
CARACTER DIRECCION");
for( int x=0 ; (x < x,nombre[x],nombre[x],&nombre[x]); u?, c="%4d"
printf(?nombre[%2d] gotoxy(10,x+2); x++) x

Listado 5.6.- Colocacin de los elementos de una cadena en


memoria RAM.

5.7 Arboles en Montn


Esta seccin consiste en transformar un bosque en un rbol binario. Entenderemos como
bosque a un conjunto normalmente ordenado de dos o ms rboles generales.
La serie de pasos que debemos seguir para lograr la conversin de un bosque en un rbol
binario es la siguiente:
1. Enlazar horizontalmente las races de los distintos rboles generales.
ING. JUAN MANUEL HERNNDEZ ESPINOSA

61

MATERIA: ESTRUCTURAS DE DATOS.


2. Enlazar los hijos de cada nodo en forma horizontal (los hermanos).
3. Enlazar verticalmente el nodo padre con el hijo que se encuentra ms a la izquierda.
Adems debe eliminarse el vnculo de ese padre con el resto de sus hijos.
4. Debe rotarse el diagrama resultante aproximadamente 45 grados hacia la izquierda y
as se obtendr el rbol binario correspondiente.

5.8 Arboles binarios de busqueda


Un rbol de bsqueda binaria es una estructura apropiada para muchas de las aplicaciones
que se han discutido anteriormente con listas. La ventaja especial de utilizar un arbol es que
se facilita la bsqueda.
Un rbol binario de bsqueda es aquel en el que el hijo de la izquierda (si existe) de
cualquier nodo contiene un valor ms pequeo que el nodo padre, y el hijo de la derecha (si
existe) contiene un valor ms grande que el nodo padre.
Un ejemplo de arbol binario de bsqueda es el siguiente:

6.1 Introduccin
Los rboles representan las estructuras no lineales y dinmicas de datos ms importantes en
computacin. Dinmicas porque las estructuras de rbol pueden cambiar durante la
ejecucin de un programa. No lineales, puesto que a cada elemento del rbol pueden
seguirle varios elementos.
Los rboles pueden ser construidos con estructuras estticas y dinmicas. Las estticas son
arreglos, registros y conjuntos, mientras que las dinmicas estn representadas por listas.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

62

MATERIA: ESTRUCTURAS DE DATOS.


La definicin de rbol es la siguiente: es una estructura jerrquica aplicada sobre una
coleccin de elementos u objetos llamados nodos; uno de los cuales es conocido como raz.
adems se crea una relacin o parentesco entre los nodos dando lugar a trminos como
padre, hijo, hermano, antecesor, sucesor, ansestro, etc.. Formalmente se define un rbol de
tipo T como una estructura homognea que es la concatenacin de un elemento de tipo T
junto con un nmero finito de arboles disjuntos, llamados subarboles. Una forma particular
de rbol puede ser la estructura vaca.
La figura siguiente representa a un rbol general.

Se utiliza la recursin para definir un rbol porque representa la forma ms apropiada y


porque adems es una caracterstica inherente de los mismos.
Los arboles tienen una gran variedad de aplicaciones. Por ejemplo, se pueden utilizar para
representar frmulas matemticas, para organizar adecuadamente la informacin, para
construir un rbol genealgico, para el anlisis de circuitos elctricos y para numerar los
captulos y secciones de un libro.

6.2 Terminologa
La terminologa que por lo regular se utiliza para el manejo de arboles es la siguiente:

HIJO. X es hijo de Y, s y solo s el nodo X es apuntado por Y. Tambin se dice que


X es descendiente directo de Y.
PADRE. X es padre de Y s y solo s el nodo X apunta a Y. Tambin se dice que X
es antecesor de Y.
HERMANO. Dos nodos sern hermanos si son descendientes directos de un mismo
nodo.
HOJA. Se le llama hoja o terminal a aquellos nodos que no tienen ramificaciones
(hijos).
NODO INTERIOR. Es un nodo que no es raz ni terminal.
GRADO. Es el nmero de descendientes directos de un determinado nodo.
GRADO DEL ARBOL Es el mximo grado de todos los nodos del rbol.
NIVEL. Es el nmero de arcos que deben ser recorridos para llegar a un
determinado nodo. Por definicin la raz tiene nivel 1.
ALTURA. Es el mximo nmero de niveles de todos los nodos del rbol.

ING. JUAN MANUEL HERNNDEZ ESPINOSA

63

MATERIA: ESTRUCTURAS DE DATOS.

PESO. Es el nmero de nodos del rbol sin contar la raz.


LONGITUD DE CAMINO. Es el nmero de arcos que deben ser recorridos para
llegar desde la raz al nodo X. Por definicin la raz tiene longitud de camino 1, y
sus descendientes directos longitud de camino 2 y as sucesivamente.

6.3 Transformacin de un Arbol Gral. en un Arbol Binario.


En esta seccin estableceremos los mecanismos necesarios para convertir un rbol general
en un rbol binario. Para esto, debemos seguir los pasos que se describen a continuacin:
1. Enlazar los hijos de cada nodo en forma horizontal (los hermanos).
2. Enlazar en forma vertical el nodo padre con el nodo hijo que se encuentra ms a la
izquierda. Adems, debe eliminarse el vnculo de ese padre con el resto de sus hijos.
3. Rotar el diagrama resultante aproximadamente 45 grados hacia la izquierda, y as se
obtendr el rbol binario correspondiente.

7.1 Introduccin a grafos


Un grafo dirigido G consiste en un conjunto de vrtices V y un conjunto de arcos o aristas
A. Los vrtice se denominan tambin nodos o puntos.
Un arco, es un par ordenado de vrtices(V,W) donde V es el vrtice inicial y W es el vrtice
terminal del arco. Un arco se expresa como: V-->W y se representa de la siguiente manera:

Los vrtice de un grafo pueden usarse para representar objetos. Los arcos se utilizan para
representar relaciones entre estos objetos.
Las

aplicaciones

ms

importantes

de

los

grafos

son

las

siguientes:

Rutas entre ciudades.


Determinar tiempos mximos y mnimos en un proceso.
Flujo y control en un programa.

7.2 Terminologa
ING. JUAN MANUEL HERNNDEZ ESPINOSA

64

MATERIA: ESTRUCTURAS DE DATOS.

La terminologa que manejaremos regularmente para el uso de grafos es la siguiente:

CAMINO.Es una secuencia de vrtices V1, V2, V3, ... , Vn, tal que
cada uno de estos V1-&gtV2, V2-&gtV3, V1-&gtV3.
LONGITUD DE CAMINO. Es el nmero de arcos en ese camino.
CAMINO SIMPLE. Es cuando todos sus vrtices, excepto tal vez el
primero y el ltimo son distintos.
CICLO SIMPLE. Es un camino simple de longitud por lo menos de uno
que empieza y termina en el mismo vrtice.
ARISTAS PARALELAS. Es cuando hay ms de una arista con un vrtice
inicial y uno terminal dados.
GRAFO CICLICO. Se dice que un grafo es cclico cuando contiene por
lo menos un ciclo.
GRAFO ACICLICO. Se dice que un grafo es aciclco cuando no contiene
ciclos.
GRAFO CONEXO. Un grafo G es conexo, si y solo si existe un camino
simple en cualesquiera dos nodos de G.
GRAFO COMPLETO FUERTEMENTE CONEXO.Un grafo dirigido G es completo
si para cada par de nodos (V,W) existe un camino de V a W y de W a
V (forzosamente tendrn que cumplirse ambas condiciones), es decir
que cada nodo G es adyacente a todos los dems nodos de G.
GRAFO UNILATERALMENTE CONEXO.Un grafo G es unilateralmente conexo
si para cada par de nodos (V,W) de G hay un camino de V a W o un
camino de W a V.
GRAFO PESADO ETIQUETADO. Un grafo es pesado cuando sus aristas
contienen datos (etiquetas). Una etiqueta puede ser un nombre,
costo un valor de cualquier tipo de dato. Tambin a este grafo se
le denomina red de actividades, y el nmero asociado al arco se le
denomina factor de peso.
VERTICE ADYACENTE. Un nodo o vrtice V es adyacente al nodo W si
existe un arco de m a n.
GRADO DE SALIDA.El grado de salida de un nodo V de un grafo G, es
el nmero de arcos o aristas que empiezan en V.
GRADO DE ENTRADA.El grado de entrada de un nodo V de un grafo G, es
el nmero de aristas que terminan en V.
NODO FUENTE.Se le llama as a los nodos que tienen grado de salida
positivo y un grado de entrada nulo.
NODO SUMIDERO.Se le llama sumidero al nodo que tiene grado de
salida nulo y un grado de entrada positivo.

7.3 Representacin En Memoria Secuencial


Los grafos se representan en memoria secuencial mediante matrices de adyacencia.
Una matrz de adyacencia, es una matrz de dimensin n*n, en donde n es el nmero de
vrtices que almacena valores booleanos, donde matrz M[i,j] es verdadero si y solo si
existe un arco que vaya del vrtice y al vrtice j.
ING. JUAN MANUEL HERNNDEZ ESPINOSA

65

MATERIA: ESTRUCTURAS DE DATOS.


Veamos el siguiente grafo dirigido:

La matrz de adyacencia, que se obtuvo a partir del grafo anterior es la siguiente:

7.4 Representacin en Memoria Enlazada


Los grafos se representan en memoria enlazada mediante listas de adyacencia.
Una lista de adyacencia, se define de la siguiente manera: Para un vrtice i es una lista en
cierto orden formada por todos los vrtices adyacentes [a,i]. Se puede representar un grafo
por medio de un arreglo donde cabeza de i es un apuntador a la lista de adyacencia al
vrtice i.
Veamos el siguiente grafo dirigido:

ING. JUAN MANUEL HERNNDEZ ESPINOSA

66

MATERIA: ESTRUCTURAS DE DATOS.


La lista de adyacencia, que se obtuvo a partir del grafo anterior es la siguiente:

7.5 Operaciones Sobre Grafos


En esta seccin analizaremos algunas de las operaciones sobre grafos, como :
Creacin.
Insercin.
Bsqueda.
Eliminacin.

En esta seccin, continuaremos utilizando los apuntadores que se usaron en las secciones
anteriores. TOP para hacer referencia al primer nodo, LD para indicar liga derecha y LA
para indicar liga abajo, por ltimo usaremos los apuntadores P y Q para hacer referencia a
los nuevos nodos que vayan a ser usados.
ALGORITMO DE CREACION.
repite
si top=NIL entonces
new(top)
top(la)<--NIL
top(ld)<--NIL
lee(top(dato))
q<--top
en caso contrario
new(p)
p(ld)<--NIL
p(la)<--NIL
q(la)<--p
lee(p(dato))
q<--p
mensaje(otro vertice ?)
lee(respuesta)
hasta repuesta=no
p<--top
mientras p<>NIL haz
mensaje(tiene vrtices adyacentes p(dato) ?)

ING. JUAN MANUEL HERNNDEZ ESPINOSA

67

MATERIA: ESTRUCTURAS DE DATOS.


lee(respuesta)
si respueta=si entonces
repite
new(q)
lee(q(dato))
q(ld)<--p(ld)
p(ld)<--q
mensaje(otro vrtice ?)
lee(respuesta2)
hasta respuesta2=no
p<--p(la)

ALGORITMO DE INSERCION
mensaje(valor a insertar ?)
lee(valor_a_insertar)
si top<>NIL entonces
p<--top
mientras p(la)<>NIL haz
p<--p(la)
new(q)
lee(q(dato))
p(la)<--q
q(la)<--NIL
mensaje(Hay vrtices adyacentes?)
lee(respuesta)
si respuesta=si entonces
mensaje(Cuantos vrtices?)
lee(nmero_vrtices)
desde i=1 hasta nmero_vrtices haz
new(p)
lee(p(dato))
q(ld)<--p
q<--q(ld)
en caso contrario
mensaje(no existe lista)

ALGORITMO DE BUSQUEDA
mensaje(vrtice a buscar)
lee(vrtice_a_buscar)
p<--top
repite
si p(dato)=vrtice_a_buscar entonces
repite
p<--p(ld)
escribe(p(dato))
hasta p(ld)=NIL
en caso contrario
p<--(la)
hasta p=NIL

ALGORITMO DE BORRADO
mensaje(vrtice a borrar ?)

ING. JUAN MANUEL HERNNDEZ ESPINOSA

68

MATERIA: ESTRUCTURAS DE DATOS.


lee(vrtice_a_borrar)
p&Lt--top
r<--p
q<--p
sw<--falso
repite
si p(dato)=vrtice_a_borrar entonces
si p=top entonces
top<--top(la)
r<--top
sw<--verdadero
en caso contrario
r(la)<--p(la)
repite
p<--p(ld)
dispose(q)
q<--p
hasta p=NIL
si sw=verdadero entonces
p<--r
q<--p
en caso contrario
p<--r(la)
q<--p
en caso contrario
r<--p
repite
q<--p(ld)
si q(dato)=vrtice_a_borrar entonces
p(ld)<--q(ld)
dispose(q)
q<--p
en caso contrario
p<--p(ld)
hasta p=NIL

7.6 Camino Mnimo


Se denomina camino mnimo entre dos vrtices V y W, al camino ptimo entre ambos
vrtices.Para determinar el camino mnimo entre dos vrtices se utiliza el siguiente
algoritmo:
desde i=1 hasta nmero_vrtices haz
desde j=1 hasta nmero_vrtices haz
si w[i,j]=0 entonces
q[[i,j]<--infinito
en caso contrario
q[i,j]<--w[i,j]
desde k=1 hasta nmero_vrtices haz
desde i=1 hasta nmero_vrtices haz
desde j=1 hasta nmero_vrtices haz

ING. JUAN MANUEL HERNNDEZ ESPINOSA

69

MATERIA: ESTRUCTURAS DE DATOS.


q[i,j]<--min(q[i,j], q[i,k] + q[k,j])

ING. JUAN MANUEL HERNNDEZ ESPINOSA

70

MATERIA: ESTRUCTURAS DE DATOS.


BIBLIOGRAFA
Aho, V.; Hopcroft, j.; y Ullman j.: Estructura de datos y algoritmos.
Addison Weslwy, 1983.
Joyanes, L.; Zahonero, L.: Estructura de datos. Algoritmos,
abstraccin y objetos. McGraw-Hill, 1998.
Martnez, R.; Quiroga, E.: Estructura de datos. Referencia prctica
con orientacin a objetos

ING. JUAN MANUEL HERNNDEZ ESPINOSA

71

S-ar putea să vă placă și