Você está na página 1de 33

UNIVERSIDAD

AUTNOMA DEL
ESTADO DE HIDALGO


INSTITUTO DE CIENCIAS BSICAS E INGENIERA



LICENCIATURA EN SISTEMAS COMPUTACIONALES




MANUAL DE PRCTICAS


ASIGNATURA:

ESTRUCTURAS DE DATOS II





SEMESTRE: 5


Manual de prcticas de Estructuras de Datos II 2012


Pgina 2



FECHA DE ELABORACIN:

ELABORARON:

NOMBRE FIRMA

L. en Comp. Adriana Katia Lpez Hernndez
M. en C. Fabiola Martnez Jurez



Vo. Bo. PRESIDENTE DE LA ACADEMIA DE COMPUTACIN
Mtra. Gabriela Medina Njera


Vo. Bo. SECRETARIO DE LA ACADEMIA DE COMPUTACIN
L.S.C. Alberto Surez Navarrete


Vo. Bo. COORDINADOR DE LA LICENCIATURA EN SISTEMAS COMPUTACIONALES
M. en C. Luis Islas Hernndez


FECHA DE PRXIMA REVISIN:


Noviembre 2012

Manual de prcticas de Estructuras de Datos II 2012


Pgina 3






Contenido

Bsqueda secuencial y binaria ................................................................................................................................................ 4
Mtodos de ordenacin directa ............................................................................................................................................. 7
Mtodos de ordenacin recursivos ...................................................................................................................................... 11
Implementacin de rboles Binarios .................................................................................................................................... 15
Implementacin de rboles Binarios de Bsqueda. ............................................................................................................. 21
Implementacin de Grafos mediante Matriz de Adyacencia y Lista de Adyacencia ............................................................ 25


Manual de prcticas de Estructuras de Datos II 2012


Pgina 4


Bsqueda secuencial y binaria

NOMBRE DE LA PRCTICA: Bsqueda secuencial y binaria
No. DE PRCTICA: 1 No. DE SESIONES: 2
No. DE INTEGRANTES MXIMO POR EQUIPO: 1

OBJETIVO:

Implementar los algoritmos de bsqueda secuencial y binaria en arreglos unidimensionales.


MARCO TERICO:

Bsqueda en listas

Los arrays son uno de los medios principales por los cuales se almacenan los datos en programas.
Debido a esta causa, existen operaciones fundamentales cuyo tratamiento es imprescindible
conocer. Estas operaciones son: la bsqueda de elementos y la ordenacin o clasificacin de listas.

La bsqueda de un elemento dado en un array es una aplicacin muy usual en el desarrollo de
programas. Dos algoritmos tpicos que realizan esta tarea son la bsqueda secuencial o en serie y
la bsqueda binaria o dicotmica. La bsqueda secuencial es el mtodo utilizado para listas no
ordenadas, mientras que la bsqueda binaria se utiliza en arrays que ya estn ordenados.

Bsqueda secuencial

Este algoritmo busca el elemento dado, recorriendo secuencialmente el array desde un elemento al
siguiente, comenzando en la primera posicin del array y se detiene cuando se encuentra el
elemento buscado o bien se alcanza el final del array.

Por consiguiente, el algoritmo debe comprobar primero el elemento almacenado en la primera
posicin del array, a continuacin el segundo elemento y as sucesivamente, hasta que se encuentra
el elemento buscado o se termina el recorrido del array. Esta tarea repetitiva se realiza con bucles.

Algoritmo BusquedaSec

Se utiliza una variable lgica, denominada Encontrado, que indica si el elemento se encontr en la
bsqueda. La variable Encontrado se inicializa a falso y se activa a verdadero cuando se
encuentra el elemento. Se utiliza un operador and, que permita evaluar las dos condiciones de
terminacin de la bsqueda: elemento encontrado o no haya ms elementos (ndice del array excede
al ltimo valor vlido del mismo).

Cuando el bucle se termina, el elemento o bien se ha encontrado, o bien no se ha encontrado. Si el
elemento se ha encontrado, el valor de Encontrado ser verdadero y el valor del ndice ser la
posicin del array (ndice del elemento encontrado). Si el elemento no se ha encontrado, el valor de
Encontrado ser falso y se devuelve el valor -1 al programa llamador.

Manual de prcticas de Estructuras de Datos II 2012


Pgina 5


Bsqueda binaria

La bsqueda binaria consiste en dividir el intervalo de bsqueda en dos partes, comparando el
elemento buscado con el que ocupa la posicin central en el arreglo. Para el caso de que no fueran
iguales se redefinen los extremos del intervalo, segn el elemento central sea mayor o menor que el
elemento buscado, disminuyendo de esta forma el espacio de bsqueda. El proceso concluye
cuando el elemento es encontrado o cuando el intervalo de bsqueda es vaco.

El mtodo de bsqueda binaria funciona exclusivamente con arreglos ordenados. Con cada iteracin
del mtodo el espacio de bsqueda se reduce a la mitad; por lo tanto, el nmero de comparaciones a
realizar disminuye notablemente. Esta disminucin resulta significativa cuanto ms grande sea el
tamao del arreglo.

Algoritmo BusquedaBin

Se utiliza una variable lgica, denominada Encontrado, que indica si el elemento se encontr en la
bsqueda. La variable Encontrado se inicializa a falso y se activa a verdadero cuando se
encuentra el elemento. Se utilizan tren variables de tipo int, Izq, Der y Cen, las que se inicializan
con el ndice del primer elemento del array, con el ndice del ltimo elemento del array y con el centro
de estos ltimos dos, respectivamente.

Se utiliza un operador and, que permita evaluar las dos condiciones de terminacin de la bsqueda:
elemento encontrado o que no exista intervalo de bsqueda. Durante cada iteracin del ciclo, si no
se encuentra el elemento, se redefine el intervalo y el centro, es decir se modifican las variables Izq,
Der y Cen, segn sea el caso. Cuando el bucle se termina, el elemento o bien se ha encontrado, o
bien no se ha encontrado. Si el elemento se ha encontrado, el valor de Encontrado ser
verdadero.


EQUIPO Y SOFTWARE A UTILIZAR:

Equipo de cmputo con alguna versin de C++ instalada.


PROCEDIMIENTO PARA EL DESARROLLO DE LA PRCTICA:

Implementar los siguientes pseudocdigos utilizando programacin estructurada o programacin
orientada a objetos.

BusquedaSec
inicio
Poner Encontrado = falso
Poner Indice = primer ndice del array
mientras (Elemento no Encontrado) y (Incide < Ultimo) hacer
si (a[Indice] = Elemento) entonces
Poner Encontrado a Verdadero
si no
Incrementar Indice
Manual de prcticas de Estructuras de Datos II 2012


Pgina 6


fin-mientras
si (Encontrado) entonces
retorno (Indice)
si no
retorno (-1)
fin

BusquedaBin
inicio
Poner Encontrado = falso
Poner Izq = primer ndice del array
Poner Der = ltimo ndice del array
Poner Cen = Parte Entera ((Izq+Der)/2)
mientras (Izq <= Der) y (Encontrado = falso) hacer
si (X = V[Cen]) entonces
Poner Encontrado a Verdadero
si no
si (X = V[Cen]) entonces
Poner Izq en Cen + 1
si no
Poner Der en Cen 1
Poner Cen = Parte Entera ((Izq+Der)/2)
fin-mientras
si (Encontrado) entonces
Escribir la informacin est en la posicin, Cen
si no
Escribir la informacin no se encuentra en el arreglo
fin

CONCLUSIONES:




BIBLIOGRAFA:

Bsica:

- Estructuras de datos (Tercera Edicin)
Osvaldo Cair y Silvia Guardati
McGraw Hill, 2006

Complementaria:

- Programacin en C. Metodologa, algoritmos y estructuras de datos
Luis Joyanes Aguilar e Ignacio Zahonero Martnez
McGraw Hill, 2000


Manual de prcticas de Estructuras de Datos II 2012


Pgina 7


Mtodos de ordenacin directa

NOMBRE DE LA PRCTICA: Mtodos de ordenacin directa
No. DE PRCTICA: 2 No. DE SESIONES: 3
No. DE INTEGRANTES MXIMO POR EQUIPO:1

OBJETIVO:

Implementar los mtodos de ordenacin directa en arreglos unidimensionales.


MARCO TERICO:

Ordenacin

Ordenar significa reagrupar o reorganizar un conjunto de datos u objetos en una secuencia
especfica. Los procesos de ordenacin son frecuentes en nuestra vida. Vivimos en un mundo
desarrollado, automatizado, acelerado, donde la informacin representa un elemento de vital
importancia. La sociedad debe estar informada y, por lo tanto, constantemente se necesita buscar y
recuperar informacin.

Los elementos ordenados aparecen por doquier. Directorios telefnicos, registros de pacientes de un
hospital, ndices de libros de una biblioteca, son tan slo algunos ejemplos de objetos ordenados con
los que el ser humano se encuentra frecuentemente. La ordenacin es una actividad fundamental y
relevante en la vida.

Formalmente se define ordenacin de la siguiente manera:

A
1
, A
2
, A
3
, , A
n


Ordenar significa permutar estos elementos de tal forma que queden de acuerdo con una distribucin
preestablecida.

- Ascendente: A
1
A
2
A
3
A
n

- Descendente: A
1
A
2
A
3
A
n


En el procesamiento de datos a los mtodos de ordenacin se les clasifica en dos grandes
categoras, segn donde hayan sido almacenados:

- Ordenacin de arreglos
- Ordenacin de archivos

La primera categora se denomina tambin ordenacin interna, ya que los elementos o
componentes del arreglo se encuentran en la memoria principal de la computadora. La segunda
categora se llama ordenacin externa, ya que los elementos se encuentran en archivos
almacenados en dispositivos de almacenamiento secundario, como discos.

Manual de prcticas de Estructuras de Datos II 2012


Pgina 8


Ordenacin interna

Los mtodos de ordenacin interna a su vez se pueden clasificar en dos tipos:

- Mtodos directos
- Mtodos logartmicos

Los mtodos directos tienen la caracterstica de que su implementacin es relativamente sencilla y
son fciles de comprender, aunque son ineficientes cuando N el nmero de elementos del arreglo
es de tamao mediano o grande. Los mtodos logartmicos, por su parte, son ms complejos que
los directos. Su elaboracin es ms sofisticada, y al ser menos intuitivos, resultan ms difciles de
entender. Sin embargo, son ms eficientes ya que requieren de menos comparaciones y
movimientos para ordenas sus elementos.

Los mtodos directos ms conocidos son:

- ordenacin por intercambio
- ordenacin por insercin
- ordenacin por seleccin

Ordenacin por intercambio directo (burbuja)

El mtodo por intercambio directo, conocido coloquialmente como burbuja, es el ms utilizado entre
los estudiantes principiantes de computacin por su fcil comprensin y programacin. Pero es
preciso sealar que es quizs el mtodo ms ineficiente.

El mtodo de intercambio directo puede trabajar de dos maneras diferentes: llevando los elementos
ms pequeos hacia la parte izquierda del arreglo o trasladando los elementos ms grandes hacia
su parte derecha. La idea bsica de este algoritmo consiste en comparar pares de elementos
adyacentes e intercambiarlos entre s hasta que todos se encuentren ordenados. Se realizan (n-1)
pasadas transportando en cada una de ellas el menor o mayor de los elementos segn sea el caso
a su posicin ideal. Al final de las (n-1) pasadas los elementos del arreglo estarn ordenados.

Ordenacin por insercin

El mtodo de ordenacin por insercin directa es el que utilizan generalmente los jugadores de
cartas cuando las ordenan, de ah que tambin se conozca con el nombre de mtodo de la baraja.

La idea central de este algoritmo consiste en insertar un elemento del arreglo en su parte izquierda,
que ya se encuentra ordenada. Este proceso se repite desde el segundo hasta el n-simo
elemento.

Ordenacin por seleccin

El mtodo de ordenacin por seleccin directa es ms eficiente que los mtodos mencionados
anteriormente. Aunque su comportamiento es mejor que el de aqullos y su programacin es fcil y
comprensible, no se recomienda utilizarlo cuando el nmero de elementos del arreglo es mediano o
Manual de prcticas de Estructuras de Datos II 2012


Pgina 9


grande. La idea bsica de este algoritmo consiste en buscar el menor elemento del arreglo y
colocarlo en la primera posicin. Luego se busca el segundo elemento ms pequeo del arreglo y se
coloca en la segunda posicin. El proceso continua hasta que todos los elementos del arreglo hayan
sido ordenados.

EQUIPO Y SOFTWARE A UTILIZAR:

Equipo de cmputo con alguna versin de C++ instalada.


PROCEDIMIENTO PARA EL DESARROLLO DE LA PRCTICA:

Implementar los siguientes pseudocdigos utilizando programacin estructurada o programacin
orientada a objetos.

Pseudocdigo Burbuja: Este algoritmo transporta en cada pasada el elemento ms pequeo
hacia la parte izquierda del arreglo. A es un arreglo unidimensional de N elementos. I, J y AUX son
variables de tipo entero.

Repetir con I desde 2 hasta N
Repetir con J desde N hasta I
Si A[J-1] > A [J] entonces
Hacer AUX = A[J-1], A[J-1] = A[I] y A[I] = AUX
Fin del ciclo
Fin del ciclo

Pseudocdigo Insercin: A es un arreglo unidimensional de N elementos. I, AUX y K son
variables de tipo entero.

Repetir con I desde 2 hasta N
Hacer AUX = A[I] y K = I -1
Mientras ((K >= 1) y (AUX < A[K])) Repetir
Hacer A[K+1] = A[K] y K = K - 1
Fin del ciclo
Hacer A[K+1] = AUX
Fin del ciclo

Pseudocdigo Seleccin: A es un arreglo unidimensional de N elementos. I, MENOR, K y J son
variables de tipo entero.

Repetir con I desde 1 hasta N 1
Hacer MENOR = A[I] y K = I
Repetir con J desde I + 1 hasta N
Si (A[J] < MENOR) entonces
Hacer MENOR = A[J] y K = J
Fin del ciclo
Hacer A[K] = A[I] y A[I] = MENOR
Fin del ciclo
Manual de prcticas de Estructuras de Datos II 2012


Pgina 10


CONCLUSIONES:















BIBLIOGRAFA:

Bsica:

- Estructuras de datos (Tercera Edicin)
Osvaldo Cair y Silvia Guardati
McGraw Hill, 2006

Complementaria:

- Programacin en C. Metodologa, algoritmos y estructuras de datos
Luis Joyanes Aguilar e Ignacio Zahonero Martnez
McGraw Hill, 2000


Manual de prcticas de Estructuras de Datos II 2012


Pgina 11


Mtodos de ordenacin recursivos

NOMBRE DE LA PRCTICA: Mtodos de ordenacin recursivos
No. DE PRCTICA: 3 No. DE SESIONES: 3
No. DE INTEGRANTES MXIMO POR EQUIPO: 1

OBJETIVO:

Implementar los mtodos recursivos de ordenacin en arreglos unidimensionales.


MARCO TERICO:

Mtodos de ordenacin recursivos

Los algoritmos recursivos se caracterizan por seguir la estrategia tpica de divide y vencers. El
problema de tamao n (ordenar una lista de n elementos) se divide en dos subproblemas o tareas,
cada una de las cuales se vuelven a dividir en dos tareas, cada vez de menor tamao. Como cada
tarea realiza las mismas acciones, el algoritmo se expresa recursivamente. El caso base (condicin
de parada) es conseguir una tarea (sublista) de tamao 1. A continuacin se analizarn los dos
mtodos recursivos ms utilizados.

Mtodo de ordenacin rpida (quicksort)

El mtodo de ordenacin quicksort es actualmente el ms eficiente y veloz de los mtodos de
ordenacin interna. Es tambin conocido como mtodo rpido y de ordenacin por particin. Su
autor es C. A. Hoare y la idea central del algoritmo consiste en lo siguiente:

1. Se toma un elemento X de una posicin cualquiera del arreglo.
2. Se trata de ubicar a X en la posicin correcta del arreglo, de tal forma que todos los elementos
que se encuentren a su izquierda sean menores o iguales a X y todos los que se encuentren a
su derecha sean mayores o iguales a X.
3. Se repiten los pasos anteriores, pero ahora para los conjuntos de datos que se encuentran a
la izquierda y a la derecha de la posicin de X en el arreglo.
4. El proceso termina cuando todos los elementos se encuentran en su posicin correcta en el
arreglo.

Se debe seleccionar, entonces, un elemento X cualquiera. En este caso se seleccionar A[1]. Se
empieza a recorrer el arreglo de derecha a izquierda comparando si los elementos son mayores o
iguales a X. Si un elemento no cumple con esta condicin, se intercambian aquellos y se almacena
en una variable la posicin del elemento intercambiado se acota el arreglo por la derecha . Se
inicia nuevamente el recorrido, pero ahora de izquierda a derecha, comparando si los elementos son
menores o iguales a X.

Si un elemento no cumple esta condicin, entonces se intercambian aquellos y se almacena en otra
variable la posicin del elemento intercambiado se acota el arreglo por la izquierda . Se repiten
los pasos anteriores hasta que el elemento X encuentra su posicin correcta en el arreglo.
Manual de prcticas de Estructuras de Datos II 2012


Pgina 12



Mtodo de ordenacin por mezclas (merge sort)

Este mtodo se basa en dividir el problema de ordenar un arreglo de n elementos en dos problemas
ms pequeos, de la mitad del tamao, y una vez resuelto cada problema combinar la solucin
(mezclar) para as resolver el problema original.

El planteamiento con ms detalle:
- se ordena la primera mitad del arreglo.
- se ordena la segunda mitad del arreglo.
- una vez ordenados su mezcla da lugar a un arreglo de elementos ordenado.

A su vez, la ordenacin del subarreglo mitad sigue los mismos pasos:
- ordenar la primera mitad.
- ordenar la segunda mitad.
- mezclar.


EQUIPO Y SOFTWARE A UTILIZAR:

Equipo de cmputo con alguna versin de C++ instalada.


PROCEDIMIENTO PARA EL DESARROLLO DE LA PRCTICA:

Implementar los siguientes pseudocdigos utilizando programacin estructurada o programacin
orientada a objetos.

Pseudocdigo quicksort: A es un arreglo unidimensional de N elementos. Para su
funcionamiento se requiere de otro algoritmo, reduce_recursivo.

inicio quicksort
llamar al algoritmo reduce_recursivo con 1 y N
fin quicksort

inicio reduce_recursivo
hacer izq = ini, der = fin, pos = ini y bandera = verdadero
mientras bandera = verdadero repetir
hacer bandera = falso
mientras ( A[pos]<=A[der] y pos der ) repetir
hacer der = der - 1
fin del ciclo
si (pos der) entonces
hacer aux = A[pos], A[pos] = A[der],
A[der] = aux y pos = der
mientras ( A[pos]>=A[izq] y pos izq ) repetir
hacer izq = izq + 1
Manual de prcticas de Estructuras de Datos II 2012


Pgina 13


fin del ciclo
si (pos izq) entonces
hacer bandera = verdadero, aux = A[pos], A[pos] = A[izq],
A[izq] = aux y pos = izq
fin del ciclo
si (pos - 1 > ini) entonces
regresar a reduce_recursivo con ini y (pos 1)
si (fin > pos + 1) entonces
regresar a reduce_recursivo con (pos + 1) y fin
fin reduce_recursivo

Pseudocdigo mergesort: A, A1 y A2 son arreglos unidimensionales. x y y son variables de
tipo entero. Para su funcionamiento se requiere de otro algoritmo, merge.

inicio mergesort(A[x..y])
si ((y-x) > 0)entonces
A1 = mergesort(A[x..(parte entera de ( x+y / 2))])
A2 = mergesort(A[parte entera de(1+(x+y / 2))..y])
llamada a merge(A1, A2)
si no
retornar A
fin de mergesort

inicio merge(A1[0..n1], A2[0..n2])
hacer p1 = 0
hacer p2 = 0
R[0..(n1 + n2 + 2)]
mientras (p1 <= n1 y p2 <= n2)repetir
si (p1 <= n1 y A1[p1] <= A2[p2])entonces
R[p1 + p2] = A1[p1]
p1 = p1 + 1
si no
si (p2 <= n2 y A1[p1] > A2[p2])entonces
R[p1 + p2] = A2[p2]
p2 = p2 + 1
retornar R
fin de merge


CONCLUSIONES:








Manual de prcticas de Estructuras de Datos II 2012


Pgina 14


BIBLIOGRAFA:

Bsica:

- Estructuras de datos (Tercera Edicin)
Osvaldo Cair y Silvia Guardati
McGraw Hill, 2006

Complementaria:

- Programacin en C. Metodologa, algoritmos y estructuras de datos
Luis Joyanes Aguilar e Ignacio Zahonero Martnez
McGraw Hill, 2000


Manual de prcticas de Estructuras de Datos II 2012


Pgina 15


Implementacin de rboles Binarios

NOMBRE DE LA PRCTICA: Implementacin de rboles Binarios
No. DE PRCTICA: 4 No. DE SESIONES: 4
No. DE INTEGRANTES MXIMO POR EQUIPO: 1

OBJETIVO:

Implementar rboles binarios utilizando variables de tipo puntero y estructuras dinmicas.


MARCO TERICO:

rboles

Los rboles representan las estructuras no lineales y dinmicas de datos ms importantes en
computacin. Dinmicas, puesto que la estructura de rbol puede cambiar durante la ejecucin del
programa. No lineales, puesto que a cada elemento del rbol pueden seguirle varios elementos.





Un rbol 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, ancestro, etc.
Las aplicaciones de los rboles son variadas, por ejemplo se pueden usar:

Estructura estticas Estructuras dinmicas
Arreglos
Registros
Conjuntos
Listas.
rboles

Estructura Lineales Estructuras No Lneales
Arreglos
Registros
Conjuntos.
Pilas.
Colas.
LIstas
rboles

Manual de prcticas de Estructuras de Datos II 2012


Pgina 16


- Para representar frmulas matemticas
- Para organizar adecuadamente la informacin
- Para registrar la historia de un campeonato de tenis.
- Para construir un rbol genealgico.
- Para el anlisis de circuitos elctricos.
- Para numerar captulos y secciones de un libro, etc.

Caractersticas y propiedades de los rboles

Todo rbol que no es vaco, tiene un nico nodo raz.
Un nodo X es descendiente directo de un nodo Y, si el nodo X es apuntado por el nodo Y. En
este caso es comn utilizar la expresin X es padre de Y.
Un nodo X es antecesor directo de un nodo Y, si el nodo X apunta al nodo Y. En este caso es
comn utilizar la expresin X es padre de Y.
Se dice que todos los nodos que son descendientes directos, (hijos) de un mismo nodo
(padre), son hermanos.
Todo nodo que no tiene ramificaciones (hijos), se conoce con el nombre de terminal u hoja.
Todo nodo que no es raz, ni terminal u hoja se conoce con el nombre de interior.
Grado es el nmero de descendientes directos de un determinado nodo. Grado del rbol es
el mximo grado de todos los no
Nivel es el nmero de arcos que deben ser recorridos para llegar a un determinado nodo. Por
definicin la raz tiene nivel 1.
Altura del rbol es el mximo nmero de niveles de todos los nodos del rbol.

Ejemplo:



Dado el rbol general de la figura anterior, se hacen sobre l las siguientes consideraciones:

1. A es la raz del rbol.

2. B es hijo de A
C es hijo de A
D es hijo de B.
Manual de prcticas de Estructuras de Datos II 2012


Pgina 17


E es hijo de B.

3. A es padre de B.
B es padre de D.
D es padre de I.
C es padre de G.
H es padre de L.

4. B y C son hermanos
D,E y F son hermanos.
G y H son hermanos.
J y K son hermanos.

5. I,E,J,K,G Y L son nodos terminales u hojas.

6. B,D,F,C Y H son nodos interiores

7. El grado del nodo A es 2.
El grado del nodo B es 3.
El grado del nodo C es 2.
El grado del nodo D es 1.
El grado del nodo E es 0.
El grado del rbol es 3.

8. El nivel del nodo A es 1.
El nivel del nodo B es 2.
El nivel del nodo D es 3.
El nivel del nodo C es 2.
El nivel del nodo L es 4.

9. La altura del rbol es 4.

Operaciones con rboles

OPERACIN
REPRESENTACIN CON
ARREGLOS
REPRESENTACIN CON
MEMORIA DINMICA
info(p) que devuelve el contenido
del nodo apuntado por p.
#define numNodes 500
Struct nodeType{
int info;
int left;
int right;
int father;
};
structnodeTypenode[numNodes];

structnodeType{
int info;
structnodeType *left;
structnodeType *right;
structnodeType *father;
};
structnodeType *nodePtr;

left(p) devuelve un apuntador al
hijo izquierdo del nodo apuntado
por p, o bien, devuelve NULL si el
nodo apuntado por p es una hoja.
right(p) devuelve un apuntador al
hijo derecho del nodo apuntado por
p, o bien, devuelve NULL si el nodo
apuntado por p es una hoja.
father(p) devuelve un apuntador al
padre del nodo apuntado por p, o
bien, devuelve NULL si el nodo
apuntado por p es la raz.
Manual de prcticas de Estructuras de Datos II 2012


Pgina 18


brother(p) devuelve un apuntador
al hermano del nodo apuntado por
p, o bien, devuelve NULL si el nodo
apuntado por p no tiene hermano.



EQUIPO Y SOFTWARE A UTILIZAR:

Equipo de cmputo con alguna versin de C++ instalada.


PROCEDIMIENTO PARA EL DESARROLLO DE LA PRCTICA:

Declaracin y representacin de un rbol binario

Se definir el rbol con una clave de tipo entero (puede ser cualquier otro tipo de datos), y dos hijos:
izquierdo (izq) y derecho (der) para representar los enlaces con los hijos se utilizan punteros. El rbol
vaco se representar con un puntero nulo. En C un rbol binario puede declararse de la siguiente
manera:

typedef struct tarbol
{
int clave;
struct tarbol *izq, *der;
} tarbol;

Recorridos sobre rboles binarios

Recorrido en preorden (preorder): consiste en visitar el nodo actual (visitar puede ser simplemente
mostrar la clave del nodo por pantalla), y despus visitar el subrbol izquierdo y una vez visitado,
visitar el subrbol derecho. Es un proceso recursivo por naturaleza. Para la figura ejemplo las visitas
seran en el orden siguiente: a, b, d, c, e, f.





Manual de prcticas de Estructuras de Datos II 2012


Pgina 19


La codificacin en C es la siguiente:

void preorden(tarbol *a)
{
if (a != NULL)
{
visitar(a);
preorden(a->izq);
preorden(a->der);
}
}

Recorrido en inorden u orden central (inorder): se visita el subrbol izquierdo, el nodo actual, y
despus se visita el subrbol derecho. En el ejemplo de la figura las visitas seran en este orden: b,
d, a, e, c, f. La codificacin en C es la siguiente:

void inorden(tarbol *a)
{
if (a != NULL)
{
inorden(a->izq);
visitar(a);
inorden(a->der);
}
}

Recorrido en postorden (postorder): se visitan primero el subrbol izquierdo, despus el subrbol
derecho, y por ltimo el nodo actual. En el ejemplo de la figura el recorrido quedara as: d, b, e, f, c,
a. La codificacin en C es la siguiente:

void postorden(arbol *a)
{
if (a != NULL)
{
postorden(a->izq);
postorden(a->der);
visitar(a);
}
}


CONCLUSIONES:






Manual de prcticas de Estructuras de Datos II 2012


Pgina 20



BIBLIOGRAFA:

Bsica:

- Estructuras de datos (Tercera Edicin)
Osvaldo Cair y Silvia Guardati
McGraw Hill, 2006

Complementaria:

- Programacin en C. Metodologa, algoritmos y estructuras de datos
Luis Joyanes Aguilar e Ignacio Zahonero Martnez
McGraw Hill, 2000


Manual de prcticas de Estructuras de Datos II 2012


Pgina 21


Implementacin de rboles Binarios de Bsqueda.

NOMBRE DE LA PRCTICA: Implementacin de rboles Binarios de Bsqueda.
No. DE PRCTICA: 5 No. DE SESIONES: 4
No. DE INTEGRANTES MXIMO POR EQUIPO: 1

OBJETIVO:

Implementar arboles binarios de bsqueda mediante punteros.


MARCO TERICO:

rboles binarios de bsqueda

Al definir el tipo de datos que representa la clave de un nodo dentro de un rbol binario de bsqueda
es necesario que en dicho tipo se pueda establecer una relacin de orden. Por ejemplo, suponer que
el tipo de datos de la clave es un puntero (da igual a lo que apunte).

En el ejemplo de la figura las claves son nmeros enteros: dada la raz 4, las claves del subrbol
izquierdo son menores que 4, y las claves del subrbol derecho son mayores que 4. Esto se cumple
tambin para todos los subrboles. Si se hace el recorrido de este rbol en orden central se obtiene
una lista de los nmeros ordenada de menor a mayor.

Una ventaja fundamental es que son en general mucho ms rpidos para localizar un elemento que
una lista enlazada. Son ms rpidos para insertar y borrar elementos. Si el rbol est perfectamente
equilibrado (la diferencia entre el n de nodos del subrbol izquierdo y el n de nodos del subrbol
derecho es a lo sumo 1, para todos los nodos): el nmero de comparaciones necesarias para
localizar una clave es aproximadamente log n en el peor caso.

El algoritmo de insercin en un rbol binario de bsqueda tiene la ventaja (sobre los arrays
ordenados, donde se empleara bsqueda dicotmica para localizar un elemento) de que no necesita
hacer una reubicacin de los elementos de la estructura para que esta siga ordenada despus de la
insercin.

Dicho algoritmo funciona avanzando por el rbol escogiendo la rama izquierda o derecha en funcin
de la clave que se inserta y la clave del nodo actual, hasta encontrar su ubicacin: insertar la clave 7
en el rbol de la figura requiere avanzar por el rbol hasta llegar a la clave 8, e introducir la nueva
clave en el subrbol izquierdo a 8. El algoritmo de borrado en rboles es algo ms complejo, pero
ms eficiente que el de borrado en un array ordenado.

Operaciones bsicas sobre rboles binarios de bsqueda

Bsqueda

Si el rbol no es de bsqueda, es necesario emplear uno de los recorridos anteriores sobre el rbol
para localizarlo. El resultado es idntico al de una bsqueda secuencial. Aprovechando las
Manual de prcticas de Estructuras de Datos II 2012


Pgina 22


propiedades del rbol de bsqueda se puede acelerar la localizacin: hay que descender a lo largo
del rbol a izquierda o derecha dependiendo del elemento que se busca.

Insercin

La insercin resulta prcticamente idntica a la bsqueda. Cuando se llega a un rbol vaco se crea
el nodo en el puntero que se pasa como parmetro por referencia, de esta manera los nuevos
enlaces mantienen la coherencia. Si el elemento a insertar ya existe entonces no se hace nada.

Borrado

La operacin de borrado resulta ser algo ms complicado. El rbol debe seguir siendo de bsqueda
tras el borrado. Una vez encontrado el nodo a borrar pueden darse tres casos:
el nodo no tiene descendientes: simplemente se borra.
el nodo tiene al menos un descendiente por una sola rama: se borra dicho nodo y su primer
descendiente se asigna como hijo del padre del nodo borrado. En el rbol de la figura se borra
el nodo cuya clave es 1, resultando el siguiente rbol:



El nodo tiene al menos un descendiente por cada rama: al borrar dicho nodo es necesario
mantener la coherencia de los enlaces y la estructura de un rbol binario de bsqueda. La
solucin consiste en sustituir la informacin del nodo que se borra por la de una de las hojas y
borrar a continuacin dicha hoja: debe ser la hoja que contenga una de estas dos claves:

la mayor de las claves menores al nodo que se borra: si se quiere borrar el nodo 4 del
rbol de la figura ejemplo se sustituir la clave 4 por la clave 2.

la menor de las claves mayores al nodo que se borra: si se quiere borrar el nodo 4 del
rbol de la figura ejemplo se sustituir la clave 4 por la clave 5.


EQUIPO Y SOFTWARE A UTILIZAR:

Equipo de cmputo con alguna versin de C++ instalada.



Manual de prcticas de Estructuras de Datos II 2012


Pgina 23



PROCEDIMIENTO PARA EL DESARROLLO DE LA PRCTICA:

Crear una estructura rbol e implementar los procedimientos de bsqueda, insercin y borrado.

El algoritmo de borrado que se muestra a continuacin realiza la sustitucin por la mayor de las
claves menores, para lo cual es necesario:

descender primero a la izquierda del nodo que se va a borrar.
avanzar siempre a la derecha hasta encontrar un nodo hoja.

A continuacin se muestra grficamente el proceso de borrar el nodo de clave 4:



La codificacin en C es la siguiente, donde el procedimiento sustituir es el que desciende por el
rbol cuando se da el caso del nodo con descendientes por ambas ramas:

void borrar(tarbol **a, int elem)
{
void sustituir(tarbol **a, tarbol **aux);
tarbol *aux;
if (*a == null) /* no existe la clave */
return;
if ((*a)->clave < elem)
borrar(&(*a)->der, elem);
else if ((*a)->clave > elem)
borrar(&(*a)->izq, elem);
else if ((*a)->clave == elem) {
aux = *a;
if ((*a)->izq == null)
*a = (*a)->der;
else if ((*a)->der == null)
*a = (*a)->izq;
else sustituir(&(*a)->izq, &aux);
/* se sustituye por la mayor de las menores */
free(aux);
}

Manual de prcticas de Estructuras de Datos II 2012


Pgina 24



CONCLUSIONES:




















BIBLIOGRAFA:

Bsica:

- Estructuras de datos (Tercera Edicin)
Osvaldo Cair y Silvia Guardati
McGraw Hill, 2006

Complementaria:

- Programacin en C. Metodologa, algoritmos y estructuras de datos
Luis Joyanes Aguilar e Ignacio Zahonero Martnez
McGraw Hill, 2000


Manual de prcticas de Estructuras de Datos II 2012


Pgina 25


Implementacin de Grafos mediante Matriz de Adyacencia y Lista de Adyacencia

NOMBRE DE LA PRCTICA: Implementacin de Grafos mediante Matriz de Adyacencia
y Lista de Adyacencia
No. DE PRCTICA: 6 No. DE SESIONES: 4
No. DE INTEGRANTES MXIMO POR EQUIPO: 1

OBJETIVO:

Implementar grafos mediante matrices de adyacencia y listas de adyacencia.


MARCO TERICO:

Grafos

Los grafos son estructuras de datos que representan relaciones entre objetos. Estas relaciones son
arbitrarias, es decir, no jerrquicas.



Definicin Formal

- Un grafo G = (V,A)

V, el conjunto de vrtices o nodos
Representan los objetos
A, el conjunto de arcos
Representan las relaciones




1 4
5
7 9

V = {1, 4, 5, 7, 9}
A= {(1,4), (5,1), (7,9), (7,5), (4,9),
(4,1), (1,5), (9,7), (5, 7), (9,4)}
Manual de prcticas de Estructuras de Datos II 2012


Pgina 26



Tipos de Grafos

Grafos dirigidos
Si los pares de nodos que forman arcos
Son ordenados. Ej.: (u->v)

Grafos no dirigidos
Si los pares de nodos de los arcos

No son ordenados Ej.: u-v


Arista
Es un arco de un grafo no dirigido
Vrtices adyacente
Vrtices unidos por un arco
Factor de Peso
Valor que se puede asociar con un arco
Depende de lo que el grafo represente
Si los arcos de un grafo tienen F.P.
Grafo valorado


Grados de un nodo

En Grafo No Dirigido
Grado(V)
Numero de aristas que contiene a V












En Grafo Dirigido
Grado de entrada, Graden(V)
Numero de arcos que llegan a V
Grado de Salida, Gradsal(V)
Numero de arcos que salen de V


1 4
5
7 9
C E
D
F
H
Grado(Guayaquil) = 3
Gradoent(D) = 1 y Gradsal(D) = 1
Manual de prcticas de Estructuras de Datos II 2012


Pgina 27






Caminos

Definicin
Un camino P en un grafo G, desde V0 a Vn
Es la secuencia de n+1 vrtices
Tal que (V
i
, V
i+1
) e A para 0s i s n
Longitud de camino
El nmero de arcos que lo forman
Camino Simple
Todos los nodos que lo forman son distintos

Ciclo
Camino simple cerrado
Camino simple cerrado de long. >= 2
Donde V0 = Vn

Conectividad

Grafo No Dirigido
Conexo
Existe un camino entre cualquier par de nodos
Grafo Dirigido
Fuertemente Conexo
Existe un camino entre cualquier par de nodos
Conexo
Existe una cadena entre cualquier par de nodos



Guayaquil Quito
Cuenca
Ambato
Riobamba
5
5
7
9
8
7
A B C
D E F
Manual de prcticas de Estructuras de Datos II 2012


Pgina 28





















TDA GRAFO

Datos
Vrtices y
Arcos(relacion entre vrtices)
Operaciones
void AadirVrtice(Grafo G, Vrtice V)
Aadir un nuevo vrtice
void BorrarVrtice(Grafo G, Generico clave)
Eliminar un vrtice existente
void Union(Grafo G, Vrtice V1, Vrtice V2)
Unir dos vrtices
Void BorrarArco(Grafo G, Vrtice V1, Vrtice V2)
Eliminar un Arco
bool EsAdyacente(Grafo G, Vrtice V1, Vrtice V2)
Conocer si dos vrtices son o no adyacentes

Representacin

Dos posibles representaciones

Esttica: Matriz de Adyacencia
Los vrtices se representan por indices(0n)
Las relaciones de los vrtices se almacenan en una Matriz
Dinmica: Lista de Adyacencia
Los vrtices forman una lista
Cada vrtice tiene una lista para representar sus relaciones(arcos)


3
9
5
7
2
4
5
6
8
H
A
B
D
Manual de prcticas de Estructuras de Datos II 2012


Pgina 29



Matriz de adyacencia

Dado un Grafo G = (V, A)
Sean los Vrtices V = {V0, V1, Vn}
Se pueden representar por ordinales 0,1,..n
Como representar los Arcos?
Estos son enlaces entre vrtices
Puede usarse una matriz





















EQUIPO Y SOFTWARE A UTILIZAR:

Equipo de cmputo con alguna versin de C++ instalada.


PROCEDIMIENTO PARA EL DESARROLLO DE LA PRCTICA:

Implementar la TDA Grafo.

Los Vrtices
Se definen en un Arreglo
Los Arcos
Se definen en una Matriz

#define MAX 20
typedef int [MAX][MAX] MatrizAdy;
typdef Generico[MAX] Vrtices;

) , ( arco hay no si , 0
) , ( arco hay si , 1
Vj Vi
Vj Vi
a
ij
(
(
(
(
(
(
(
(

0 1 0 0 0 0
1 0 0 0 0 0
0 0 0 1 0 0
0 0 1 0 1 0
0 0 0 1 0 1
0 0 0 0 1 0
5
4
3
2
1
0
5 4 3 2 1 0
V
V
V
V
V
V
V V V V V V
4 7
9 6
10
1
1
V0
V1 V2
V3
V4
V5
4

9 6
1
1
Manual de prcticas de Estructuras de Datos II 2012


Pgina 30


typedef struct Grafo
{
Vrtices V;
MatrizAdy A;
int nvrtices;
bool Dirigido;
};

Unir vrtice

void Union(Grafo G, int v1, int v2){
G->A[v1][v2] = 1;
if(!G->dirigido)
G->A[v2][v1] = 1;
}

Lista de adyacencia

Si una matriz
Tiene muchos vrtices y
Pocos arcos
La Matriz de Adyacencia
Tendr demasiados ceros
Ocupar mucho espacio
Los vrtices
Pueden formar una lista, no un vector
Los arcos
Son relaciones entre vrtices
Se pueden representar con una lista x cada vrtice


El tipo de dato

Cada vrtice tiene
Contenido
Siguiente
Una lista de adyacencia
Cada nodo en la lista de adyacencia
Peso del arco
Siguiente
Una referencia al vertice(arco)

typedef struct Vertice{
Generico contenido;
LSE *LA;
};
typedef Vertice *Arco;
typedef struct Grafo{
Manual de prcticas de Estructuras de Datos II 2012


Pgina 31


LSE LVertices;
bool dirigido;
};

Implementaciones

void Union(Grafo G, Vertice V1, Vertice V2){
LSE_InsertarNodoFin(V1->Larcos, LSE_CrearNodo(V2));
if(!G->dirigido)
LSE_InsertarNodoFin(V2->Larcos,
LSE_CrearNodo(V1);
}

Recorridos del grafo

Se busca
Visitar todos los nodos posibles
Desde un vrtice de partida D
Cualquiera
Existe dos posibles recorridos
En Anchura y
En Profundidad

Recorridos de anchura

Encolar vrtice de partida
Marcarlo como visitado
Mientras la cola no este vaca
Desencolar vrtice W
Mostrarlo
Marcar como visitados
Los vrtices adyacentes de W
Que no hayan sido ya visitados
Encolarlos















6
9
7
10
11
6

9
11
10
9
7
A
T
H
B
D
C
R
D
Cola
Se Muestra:
D
B C
B C
C H H R
H
R A
R A

Manual de prcticas de Estructuras de Datos II 2012


Pgina 32



Implementacion

LSE *RecorrerEnAnchura(Grafo G, Vertice V){
LSE *L;
LSE_nodo *sacado, *parco;
Vertice *vsacado, *varco;
Cola Q;
L = malloc(sizeof(LSE));
LSE_Inicializar(L);
Cola_Inicializar(&Q);
V.visitado = TRUE;
EnColar(&Q, LSE_NodoCrear(&V));
while(!Cola_EstaVacia(Q)){
sacado = DesEnColar(&Q);
vsacado = Generico_ObtenerVertice(sacado->G);
LSE_InsertarNodoFin(L, LSE_NodoCrear(vsacado));
for(parco = vsacado->LArcos->header; parco!=NULL;
parco = parco->sig){
varco = Generico_ObtenerVertice(parco->G);
if(!varco->visitado){
varco->visitado = TRUE;
EnColar(&Q, LSE_NodoCrear(varco));
}
}
}
return L;
}

Recorridos en profundidad

Marcar vrtice origen V como visitado
Recorrer en Profundidad
Cada vrtice adyacente de V
Que no haya sido visitado
Ejemplo












Manual de prcticas de Estructuras de Datos II 2012


Pgina 33



CONCLUSIONES:


















BIBLIOGRAFA:

Bsica:

- Estructuras de datos (Tercera Edicin)
Osvaldo Cair y Silvia Guardati
McGraw Hill, 2006

Complementaria:

- Programacin en C. Metodologa, algoritmos y estructuras de datos
Luis Joyanes Aguilar e Ignacio Zahonero Martnez
McGraw Hill, 2000