Está en la página 1de 35

UNIVERSIDAD CENTRAL DEL ESTE

UCE

Facultad de Ciencias de las Ingenieras


Escuela de Ingeniera Informtica

Estructuras de datos en el lenguaje C


Tema

TRABAJO PRCTICO DE LA ASIGNATURA:


Estructura de datos

SUSTENTANTE:
Joel De Len 2014-0935

DIRECTOR:
Ing. Daro Alexander Ramos, M. Eng.

Ing. Nombre Facilitador


Ing. Francisco Santana

Ao Acadmico 2017
San Pedro de Macors, R. D.
INDICE

INTRODUCCIN ...................................................................................................................................................1
1 PILAS, COLAS Y BSQUEDAS ............................................................................................................................2
1.1 Pila .............................................................................................................................................................2
1.2 Cola ............................................................................................................................................................7
1.3 Bsquedas .............................................................................................................................................. 12
2 LISTAS ENLAZADAS Y DOBLEMENTE ENLAZADAS.......................................................................................... 18
2.1 Listas enlazadas simples ......................................................................................................................... 18
2.2 Lista doblemente enlazada..................................................................................................................... 20
3 ARCHIVOS Y/O ALMACENAMIENTO INTERNO .............................................................................................. 23
3.1 Documentacin ...................................................................................................................................... 23
3.2 Ejemplo ................................................................................................................................................... 24
3.3 Explicacin .............................................................................................................................................. 24
4 ARBOLES Y GRAFOS ....................................................................................................................................... 25
4.1 Arboles.............................................................................................................................................. 25
4.2 Grafos ............................................................................................................................................... 29
BIBLIOGRAFIA ................................................................................................................................................... 33
INTRODUCCIN

En la prctica, la mayor parte de informacin til no aparece aislada en forma de datos simples, sino
que lo hace de forma organizada y estructurada. Los diccionarios, guias, enciclopedias, etc., son
colecciones de datos que seran intiles si no estuvieran organizadas de acuerdo con unas
determinadas reglas. Adems, tener estructurada la informacin supone ventajas adicionales, al
facilitar el acceso y el manejo de los datos. Por ello parece razonable desarrollar la idea de la
agrupacin de datos, que tengan un cierto tipo de estructura y organizacin interna. Aqu es donde
hace aparicin la importancia de estructuras de datos.

Las estructuras de datos, aunque de manera similar no se manejan de igual forma en todos los
lenguajes de programacin y como estudiosos de la materia y para ponerlas en prctica cuando la
situacin lo amerite, es necesario conocer las sintaxis de los lenguajes que utilizamos que hacen
posible su uso.

En el presente trabajo se conocern y analizaran las principales estructuras de datos que son utilizadas,
todo esto enfocado al lenguaje de programacin C, con sus respectiva documentacin, ejemplos y
explicacin.

1
1 PILAS, COLAS Y BSQUEDAS

1.1 Pila
1.1.1 Documentacin
Una pila (stack) es una coleccin ordenada de elementos a los que slo se puede acceder por un nico
lugar o extremo de la pila. Los elementos de la pila se aaden o quitan (borran) de la misma slo por
su parte superior (cima) de la pila. ste es el caso de una pila de platos, una pila de libros, etc.

Una pila es una estructura de datos de entradas ordenadas tales que solo se pueden introducir
y eliminar por un extremo, llamado cima.

Poseen una propiedad especfica que es ltimo en entrar primero en salir. Se conoce a las pilas
como estructura de datos LIFO (last-in, first-out). Las operaciones usuales en la pila son Insertar y
Quitar. La operacin Insertar (push) aade un elemento en la cima de la pila y la operacin Quitar
(pop) elimina o saca un elemento de la pila. El ltimo elemento aadido a la pila es el primero que se
quita de la pila.

Una pila se puede implementar mediante armys o mediante listas enlazadas. Una implementacin
esttica se realiza utilizando un array de tamao fijo y una implementacin dinmica mediante una
lista enlazada.

En C para definir una pila con arrays se utiliza una estructura. Los miembros de la estructura pila
incluyen una lista (array) y un ndice o puntero a la cima de la pila; adems una constante con el
mximo nmero de elementos. El tipo pila junto al conjunto de operaciones de la pila se pueden
encerrar en un archivo de inclusin. AI utilizar un array para contener los elementos de la pila hay
que tener en cuenta que el tamao de la pila no puede exceder el nmero de elementos del array y la
condicin pila llena ser significativa para el diseo.

El mtodo usual de introducir elementos en una pila es definir el fondo de la pila en la posicin O del
array y sin ningn elemento en su interior, es decir, definir una pila vaca; a continuacin, se van
introduciendo elementos en el array (en la pila) de modo que el primer elemento aadido se introduce
en una pila vaca y en la posicin O, el segundo elemento en la posicin 1, el siguiente en la posicin
2 y as sucesivamente. Con estas operaciones el puntero (apuntador) que apunta a la cima de la pila se

2
va incrementando en 1 cada vez que se aade un nuevo elemento; es decir, el puntero de la pila
almacena el ndice del array que se est utilizando como cima de la pila. Los algoritmos de introducir
insertar (push) y quitar sacar (pop) datos de la pila utilizan el ndice del array como puntero de
la pila son:

Insertar (push)

1.verificar si la pila no est llena.

2.Incrementar en 1 el puntero de la pila.

3.Almacenar elemento en la posicin del puntero de la pila.

Quitar (pop)

1. Si la pila no est vaca.

2. Leer el elemento de la posicin del puntero de la pila.

3. Decrementar en 1 el puntero de la pila.

1.1.2 Ejemplo
Escribir un programa que utilice la clase Pila para comprobar si una determinada frase/palabra (cadena
de caracteres) es un palndromo. Nota. Una palabra o frase es un palndromo cuando la lectura directa
e indirecta de la misma tiene igual valor: alila, es un palndromo; cara (arac) no es un palndromo.

3
4
5
1.1.3 Explicacin
La palabra se lee carcter a carcter, de tal forma que a la vez que se aade a un strinq se inserta en
una pila de caracteres. Una vez leda la palabra, se compara el primer carcter del string con el carcter
que se extrae de la pila, si son iguales sigue la comparacin con siguiente carcter del string y de la
pila; as hasta que la pila se queda vaca o hay un carcter no coincidente. Al guardar los caracteres
de la palabra en la pila se garantiza que las comparaciones son entre caracteres que estn en orden
inverso: primero con ltimo.. . La codificacin consta de tres archivos, el archivo pilarray.h con las
declaraciones de la pila; el archivo pilarray.c con la implementacin de las operaciones de la pila y el
archivo paldromo.c para leer la palabra y comprobar con ayuda de la pila si es palndromo.

6
1.2 Cola

1.2.1 Documentacin

Una cola es una estructura de datos que almacena elementos en una lista y permite acceder a los datos
por uno de los dos extremos de la lista. Un elemento se inserta en la cola (parte final) de la lista y se
suprime o elimina por la frente (parte inicial, cabeza) de la lista. Las aplicaciones utilizan una cola
para almacenar elementos en su orden de aparicin o concurrencia.

Los elementos se eliminan (se quitan) de la cola en el mismo orden en que se almacenan y, por
consiguiente, una cola es una estructura de tipo FIFO (first-in-firs-out, primero en entrar/primero en
salir o bien primero en llegar/primero en ser servido).

Desde el punto de vista de estructura de datos, una cola es similar a una pila, en donde los datos se
almacenan de un modo lineal y el acceso a los datos slo est permitido en los extremos de la cola.
Las acciones que estn permitidas en una cola son:

Creacin de una cola vaca.


Verificacin de que una cola est vaca.
Aadir un dato al final de una cola.
Eliminacin de los datos de la cabeza de la cola.

7
8
1.2.2 Ejemplo
Una variacin del famoso problema matemtico llamado problema de Jos permite generar
nmeros de la suerte. Se parte de una lista inicial de n nmeros, esta lista se va reduciendo siguiendo
el siguiente algoritmo:

1. Se genera un nmero aleatorio n,.


2. Si n, > n fin del algoritmo.
3. Si n, <= n se quitan de la lista los nmeros que ocupan las posiciones I, I+ n,, 1+2*n,, . . . n
toma el valor del nmero de elementos que quedan en la lista.
4. Se vuelve al paso I.

9
10
1.2.3 Explicacin
El problema se va a resolver utilizando la estructura Cola. En primer lugar, se genera una lista de n
nmeros aleatorios que se almacena en una cola. A continuacin, se siguen los pasos del algoritmo,
en cada pasada se mueven los elementos de la cola a otra cola excepto aquellos que estn en las
posiciones (mltiplos de n1) + 1. Estas posiciones I se pueden expresar matemticamente:

1 modulo n1 = 1

El tipo cola y las operaciones sobre colas se agrupan en el archivo de inclusin co1a.h implementado
con estructuras dinmicas. Adems, se aade la operacin de mostrarCola para escribir los nmeros
que quedan en la lista.

11
1.3 Bsquedas
Hay muchas aplicaciones que requieren una bsqueda de un elemento en particular. La bsqueda se
refiere a encontrar si un elemento particular est presente en la lista. El mtodo que utilizamos para
esto depende de cmo estn los elementos de la lista. Si la lista es una lista desordenada, entonces
usamos la bsqueda lineal o secuencial, mientras que si la lista es una lista ordenada, utilizamos la
bsqueda binaria.

1.3.1 Bsqueda lineal o secuencial


1.3.1.1 Documentacin
Esta bsqueda procede comparando secuencialmente la clave con los elementos de la lista, y contina
hasta encontrar una coincidencia o el final de la lista se encuentra. Si encontramos una coincidencia,
la bsqueda termina con xito devolviendo el ndice del elemento que ha coincidido en la lista. Si
llega al final de la lista y no ha encontrado coincidencia, la bsqueda finaliza sin xito.

1.3.1.2 Ejemplo
#include <stdio.h>

#define MAX 10

void lsearch(int list[],int n,int element)

int i, flag = 0;

for(i=0;i<n;i++)

if( list[i] == element)

printf(" The element whose value is %d is present at position %d in list\n", element,i);

flag =1;

break;

if( flag == 0)

12
printf("The element whose value is %d is not present in the list\n", element);

void readlist(int list[],int n)

int i;

printf("Enter the elements\n");

for(i=0;i<n;i++)

scanf("%d",&list[i]);

void printlist(int list[],int n)

int i;

printf("The elements of the list are: \n");

for(i=0;i<n;i++)

printf("%d\t",list[i]);

void main()

int list[MAX], n, element;

printf("Enter the number of elements in the list max = 10\n");

scanf("%d",&n);

readlist(list,n);

printf("\nThe list before sorting is:\n");

13
printlist(list,n);

printf("\nEnter the element to be searched\n");

scanf("%d",&element);

lsearch(list,n,element);

1.3.1.3 Explicacin
1. En el mejor de los casos, el procedimiento de bsqueda finaliza despus de una sola
comparacin, mientras que, en el peor de los casos, har n comparaciones.
2. En promedio, realizar aproximadamente n / 2 comparaciones, ya que el tiempo de bsqueda
es proporcional al nmero de comparaciones que se requiere realizar.
3. La bsqueda lineal requiere un tiempo medio proporcional a O (n) para buscar un elemento.
Por lo tanto, para buscar n elementos, se requiere un tiempo proporcional a O (n^2).
4. Concluimos que esta tcnica de bsqueda es preferible cuando el valor de n es pequeo. La
razn de esto es la diferencia entre n y n^2 es pequeo para valores menores de n.

14
1.3.2 Bsqueda binaria

1.3.2.1 Documentacin
El requisito previo para usar la bsqueda binaria es que la lista debe ser una ordenada. Comparamos
el elemento a buscar con el elemento situado aproximadamente en el centro de la lista. Si se encuentra
una coincidencia, la bsqueda finaliza correctamente. De lo contrario, continuamos la bsqueda de la
clave de una manera similar ya sea en la mitad superior o en la mitad inferior. Si los elementos de la
lista estn ordenados ascendentemente, y la clave es menor que el elemento en el centro de la lista, la
bsqueda se contina en la mitad inferior. Si los elementos de la lista estn dispuestos en orden
descendente y la clave es mayor que el elemento en el centro de la lista, la bsqueda contina en la
mitad superior de la lista. Los procedimiento para la bsqueda binaria se da en el siguiente programa.

1.3.2.2 Ejemplo
#include <stdio.h>

#define MAX 10

void bsearch(int list[],int n,int element)

int l,u,m, flag = 0;

l = 0;

u = n-1;

while(l <= u)

m = (l+u)/2;

if( list[m] == element)

printf(" The element whose value is %d is present at position %d in list\n",


element,m);

flag =1;

15
break;

else

if(list[m] < element)

l = m+1;

else

u = m-1;

if( flag == 0)

printf("The element whose value is %d is not present in the list\n",element);

void readlist(int list[],int n)

int i;

printf("Enter the elements\n");

for(i=0;i<n;i++)

scanf("%d",&list[i]);

void printlist(int list[],int n)

int i;

printf("The elements of the list are: \n");

for(i=0;i<n;i++)

16
printf("%d\t",list[i]);

void main()

int list[MAX], n, element;

printf("Enter the number of elements in the list max = 10\n");

scanf("%d",&n);

readlist(list,n);

printf("\nThe list before sorting is:\n");

printlist(list,n);

printf("\nEnter the element to be searched\n");

scanf("%d",&element);

bsearch(list,n,element);

1.3.2.3 Explicacin

En la bsqueda binaria, el nmero de comparaciones necesarias para buscar un elemento en la lista no


es ms que log2n, donde n es el tamao de la lista. Por lo tanto, el algoritmo de bsqueda binario tiene
una complejidad en el tiempo de O (n * (log2n)).

17
2 LISTAS ENLAZADAS Y DOBLEMENTE ENLAZADAS
Una lista enlazada consta de un conjunto de nodos. Un nodo consta de un campo dato y un puntero
que apunta al siguiente elemento de la lista.

2.1 Listas enlazadas simples

2.1.1 Documentacin
Un algoritmo para la creacin de una lista enlazada entraa los siguientes pasos:

Paso 1. Declarar el tipo de dato y el puntero de cabeza o primero.


Paso 2. Asignar memoria para un elemento del tipo definido anteriormente utilizando alguna
de las funciones de asignacin de memoria (malloc () , calloc (), realioc ()) y un cast para la
conversin de void* al tipo puntero a nodo; la direccin del nuevo elemento es pt r-nuevo.
Paso 3. Crear iterativamente el primer elemento (cabeza) y los elementos sucesivos de una lista
enlazada simplemente.
Paso 4. Repetir hasta que no haya ms entrada para el elemento.

2.1.2 Ejemplo
Crear una lista de nmeros aleatorios e insertar los nuevos nodos por la cabeza de la lista. Una vez
creada la lista, se ha de recorrer los nodos pura mostrar los nmeros pares.

18
2.1.3 Explicacin
La funcin InsertarCabezaLista ( ) aade un nodo a la lista, siempre como nodo cabeza. El priiner
argumento es un puntero a puntero porque tiene que modificar la variable cabeza, que es a su vez un
puntero a Nodo. La funcin NuevoNodo ( ) reserva memoria para un nodo, asigna el campo dato y
devuelve la direccin del nodo creado.

19
2.2 Lista doblemente enlazada

2.2.1 Documentacin
Hasta ahora el recorrido de una lista se realizaba en sentido directo (adelante) o, en algunos casos, en
sentido inverso (hacia atrs). Sin embargo, existen numerosas aplicaciones en las que es conveniente
poder acceder a los elementos o nodos de una lista en cualquier orden. En este caso se recomienda el
uso de una lista doblemente enlazada. En tal lista, cada elemento contiene dos punteros, aparte del
valor almacenado en el elemento. Un puntero apunta al siguiente elemento de la lista y el otro puntero
apunta al elemento anterior.

2.2.2 Ejemplo
Se va a crear una lista doblemente enlazada con nmeros enteros obtenidos aleatoriamente. Una vez
creada la lista se desea eliminarse los nodos que estn fuera de un rango determinado.

20
21
2.2.3 Explicacin
La insercin de elementos en la lista se hace por el nodo cabecera. El nmero de elementos de la lista
se pide para ser introducido por teclado. Tambin se pide por teclado el rango de valores que deben
de estar en la lista. Para eliminar los elementos se recorre la lista, los nodos que no estn dentro del
rango se borran de la lista. Para borrar los nodos se utiliza la funcin eliminar ( ) , teniendo en cuenta
que la direccin del nodo a suprimir ya se tiene.

22
3 ARCHIVOS Y/O ALMACENAMIENTO INTERNO

3.1 Documentacin
Los datos que hemos tratado hasta el momento han residido en la memoria principal. Sin embargo,
las grandes cantidades de datos se almacenan normalmente en un dispositivo de memoria secundaria.
Estas colecciones de datos se conocen como archivos (antiguamente ficheros).

Un archivo es un conjunto de datos estructurados en una coleccin de entidades elementales o bsicas


denominadas registros que son de igual tipo y constan a su vez de diferentes entidades de nivel ms
bajos denominadas campos.

En c, un archivo es un concepto lgico que puede aplicarse a muchas cosas desde archivos de disco
hasta terminales o una impresora. Se asocia una secuencia con un archivo especifico realizando una
operacin de apertura. Una vez que el archivo est abierto, la informacin puede ser intercambiada
entre este y el programa.

Se puede conseguir la entrada y la salida de datos a un archivo a travs del uso de la biblioteca de
funciones; C no tiene palabras claves que realicen las operaciones de E/S. La siguiente tabla da un
breve resumen de las funciones que se pueden utilizar. Se debe incluir la librera STDIO.H. Observe
que la mayora de las funciones comienzan con la letra F, esto es un vestigio del estndar C de Unix.

Nombre Funcin

fopen() Abre un archivo.

fclose() Cierra un archivo.

fgets() Lee una cadena de un archivo.

fputs() Escribe una cadena en un archivo

fseek() Busca un byte especifico de un archivo.

fprintf() Escribe una salida con formato en el archivo.

fscanf() Lee una entrada con formato desde el archivo.

23
feof() Devuelve cierto si se llega al final del archivo.

ferror() Devuelve cierto si se produce un error.

rewind() Coloca el localizador de posicin del archivo al principio del mismo.

remove() Borra un archivo.

fflush() Vaca un archivo.

3.2 Ejemplo

3.3 Explicacin
El programa anterior maneja las cadenas de caracteres en un archivo. Se introducen las instrucciones
fgets y fputs para la lectura y escritura de cadenas de caracteres, respectivamente.

24
4 ARBOLES Y GRAFOS

4.1 Arboles

4.1.1 Documentacin
Un rbol binario es un rbol en el que ningn nodo puede tener ms de dos subrboles. binario, cada
nodo puede tener, cero, uno o dos hijos (subrboles). Se conoce el nodo de como hijo izquierdo y el
nodo de la derecha como hijo derecho.

Un rbol binario es una estructura recursiva. Cada nodo es el raz de su propio subrbol y tiene hijos,
que son races de rboles llamados los subrboles derecho e izquierdo del nodo, respectivamente.

Una vez que se tiene creado un rbol binario, se pueden realizar diversas operaciones sobre l. El
hacer uso de una operacin u otra depender de la aplicacin que se le quiera dar al rbol. Algunas de
las operaciones tpicas que se realizan en rboles binarios son:

Determinar su altura.
Determinar su nmero de elementos.
Hacer una copia.
Visualizar el rbol binario en pantalla o en impresora.
Determinar si dos rboles binarios son idnticos.
Borrar (eliminar el rbol).
Si es un rbol de expresin', evaluar la expresin.
Si es un rbol de expresin, obtener la forma de parntesis de la expresin.

Todas estas operaciones se pueden realizar recorriendo el rbol binario de un modo sistemtico. El
recorrido de un rbol es la operacin de visita al rbol, o lo que es lo mismo, la visita a cada nodo del
rbol una vez y slo una. La visita de un rbol es necesaria en muchas ocasiones, por ejemplo, si se
desea imprimir la informacin contenida en cada nodo. Existen diferentes formas de visitar o recorrer
un rbol que se estudiarn ms tarde

25
4.1.2 Ejemplo
Con los registros de estudiantes formar un rbol binario de bsqueda, ordenado respecto al campo
clave nummat. El programa debe de tener las opciones de mostrar los registros ordenados y eliminar
un registro dando el nmero de matrcula.

26
27
4.1.3 Explicacin
Cada registro tiene slo dos campos de informacin: nombre y nummat. Adems, los campos de
enlace con el subrbol izquierdo y derecho. rboles 533 Las operaciones que se van a implementar
son las de insertar, eliminar, buscar y visualizar el rbol. Los algoritmos de las tres primeras
operaciones ya estn descritos anteriormente. La operacin de visual izar va a consistir en un recorrido
en inorden, cada vez que se visite el nodo raz se escribe los datos del estudiante.

28
4.2 Grafos

4.2.1 Documentacin
Los grafos son una estructura de datos que consiste en dos componentes:

1. Un conjunto finito de vrtices tambin llamados como nodos.


2. Un conjunto finito de pares ordenados de la forma (u, v) llamada borde. El par se ordena
porque (u, v) no es el mismo que (v, u) en el caso del grafo dirigido (di-grfico). El par de
forma (u, v) indica que hay un borde desde el vrtice u al vrtice v. Los bordes pueden contener
peso / valor / costo.

Los grafos se utilizan para representar muchas aplicaciones de la vida real: Los grficos se utilizan
para representar redes. Las redes pueden incluir caminos en una ciudad o red telefnica o red de
circuito. Los grficos tambin se utilizan en redes sociales como linkedIn, facebook. Por ejemplo, en
facebook, cada persona se representa con un vrtice (o nodo). Cada nodo es una estructura y contiene
informacin como id de persona, nombre, gnero y lugar.

Estas dos son las representaciones ms utilizadas del grafo.

1. Matriz de Adyacencia
2. Lista de Adjacencia

4.2.2 Ejemplo
El siguiente es un cdigo en c de la representacin de una lista de adjacencia de un grafo no dirigido.

// A C Program to demonstrate adjacency list representation of graphs

#include <stdio.h>
#include <stdlib.h>

// A structure to represent an adjacency list node


struct AdjListNode
{
int dest;
struct AdjListNode* next;

29
};

// A structure to represent an adjacency list


struct AdjList
{
struct AdjListNode *head; // pointer to head node of list
};

// A structure to represent a graph. A graph is an array of adjacency lists.


// Size of array will be V (number of vertices in graph)
struct Graph
{
int V;
struct AdjList* array;
};

// A utility function to create a new adjacency list node


struct AdjListNode* newAdjListNode(int dest)
{
struct AdjListNode* newNode =
(struct AdjListNode*) malloc(sizeof(struct AdjListNode));
newNode->dest = dest;
newNode->next = NULL;
return newNode;
}

// A utility function that creates a graph of V vertices


struct Graph* createGraph(int V)
{
struct Graph* graph = (struct Graph*) malloc(sizeof(struct Graph));
graph->V = V;

// Create an array of adjacency lists. Size of array will be V


graph->array = (struct AdjList*) malloc(V * sizeof(struct AdjList));

// Initialize each adjacency list as empty by making head as NULL

30
int i;
for (i = 0; i < V; ++i)
graph->array[i].head = NULL;

return graph;
}

// Adds an edge to an undirected graph


void addEdge(struct Graph* graph, int src, int dest)
{
// Add an edge from src to dest. A new node is added to the adjacency
// list of src. The node is added at the begining
struct AdjListNode* newNode = newAdjListNode(dest);
newNode->next = graph->array[src].head;
graph->array[src].head = newNode;

// Since graph is undirected, add an edge from dest to src also


newNode = newAdjListNode(src);
newNode->next = graph->array[dest].head;
graph->array[dest].head = newNode;
}

// A utility function to print the adjacenncy list representation of graph


void printGraph(struct Graph* graph)
{
int v;
for (v = 0; v < graph->V; ++v)
{
struct AdjListNode* pCrawl = graph->array[v].head;
printf("\n Adjacency list of vertex %d\n head ", v);
while (pCrawl)
{
printf("-> %d", pCrawl->dest);
pCrawl = pCrawl->next;
}
printf("\n");
}

31
}

// Driver program to test above functions


int main()
{
// create the graph given in above fugure
int V = 5;
struct Graph* graph = createGraph(V);
addEdge(graph, 0, 1);
addEdge(graph, 0, 4);
addEdge(graph, 1, 2);
addEdge(graph, 1, 3);
addEdge(graph, 1, 4);
addEdge(graph, 2, 3);
addEdge(graph, 3, 4);

// print the adjacency list representation of the above graph


printGraph(graph);

return 0;
}

4.2.3 Explicacin

Pros: Ahorra espacio O (| V | + | E |). En el peor de los casos, puede haber C (V, 2) nmero de aristas
en un grfico consumiendo as el espacio O (V ^ 2). Agregar un vrtice es ms fcil.

Contras: Las consultas como si hay un borde desde el vrtice u al vrtice v no son eficientes y se
pueden hacer O (V).

32
BIBLIOGRAFIA

Deshpande, P. S., Kakde O. G. (2004). C & Data Structures. Massachusetts: CHARLES


RIVER MEDIA, INC.
Joyanes, L., Zahonero, I. (2006). PROGRAMACION EN C Metodologa, algoritmos y
estructura de datos. Madrid: McGraw-Hill

33

También podría gustarte