Documente Academic
Documente Profesional
Documente Cultură
PROGRAMACION II
ESTRUCTURAS DE DATOS
EC-4210444
Roque Solis
8-798-6
Miguel Pinto
8-8751805
INDICE
INTRODUCIN.............................................................................................
...........................3
ARREGLO....................................................................................................
............................4
ARREGLO
UNIMENSIONALES......................................................................................
5
EJEMPLO......................................................................................................
...6
ARREGLO
MULTIDIMENSIONALES..............................................................................7
EJEMPLO......................................................................................................
...8
PILA.............................................................................................................
...........................8
OPERACIONES.............................................................................................
................9
EJEMPLO......................................................................................................
...............9
COLA...........................................................................................................
..........................12
OPERACIONES
...12
EJEMPLO
...12
LISTA
.15
LISTAS SIMPLEMENTE
ENLAZADA.....16
CARACTERISTICA
...16
EJEMPLO
.....17
LISTAS DOBLEMENTE
ENLAZADAS...................................22
EJEMPLO......................................................................................................
.25
LISTAS
CIRCULARES...............................................................................................
...28
EJEMPLOS....................................................................................................
.28
ARBOLES.....................................................................................................
..........................31
CARACTERISTICAS Y
FUNCIONAMENTO...................................................................32
TIPOS DE
ARBOLES...................................................................................................3
3
ARBOL
BINARIO......................................................................................................
..33
EJEMPLO......................................................................................................
.34
GRAFOS......................................................................................................
..........................39
FORMAS DE
REPRESENTACION................................................................................39
GENERADORES...........................................................................................
..............40
CONSTRUCTORES.......................................................................................
..............40
SELECTORES...............................................................................................
...............41
EJEMPLO......................................................................................................
.............41
METDOS DE
ORDENAMIENTO.........................................................................................
..44
ORDENAMIENTO DE
BURBUJA.................................................................................45
EJEMPLO......................................................................................................
.45
ORDENAMIENTO
SHELL............................................................................................46
EJEMPLO......................................................................................................
.46
ORDENAMIENTO POR
INSERCCIN..........................................................................47
EJEMPLO......................................................................................................
.47
ORDENAMIENTO POR
SELECCIN............................................................................48
EJEMPLO......................................................................................................
.49
1. INTRODUCIN
Una de las aplicaciones ms interesantes y potentes de la memoria dinmica y de los
punteros son, sin duda, las estructuras dinmicas de datos. Las estructuras bsicas
disponibles en C y C++ (structs y arrays) tienen una importante limitacin: no pueden
cambiar de tamao durante la ejecucin. Losarrays estn compuestos por un
determinado nmero de elementos, nmero que se decide en la fase de diseo, antes
de que el programa ejecutable sea creado.
En muchas ocasiones se necesitan estructuras que puedan cambiar de tamao durante
la ejecucin del programa. Por supuesto, podemos crear arraysdinmicos, pero una
vez creados, tu tamao tambin ser fijo, y para hacer que crezcan o disminuyan de
tamao, deberemos reconstruirlos desde el principio.
Las estructuras dinmicas nos permiten crear estructuras de datos que se adapten a las
necesidades reales a las que suelen enfrentarse nuestros programas. Pero no slo eso,
como veremos, tambin nos permitirn crear estructuras de datos muy flexibles, ya sea
en cuanto al orden, la estructura interna o las relaciones entre los elementos que las
componen.
Las estructuras de datos estn compuestas de otras pequeas estructuras a las que
llamaremos nodos o elementos, que agrupan los datos con los que trabajar nuestro
programa y adems uno o ms punteros autoreferenciales, es decir, punteros a objetos
del mismo tipo nodo.
2. ARREGLO
Un arreglo o array es una coleccin de variables relacionadas a las que
se hace referencia por medio de un nombre comn. Otra definicin
vlida es que un arreglo es un conjunto de datos que se almacenan en
memoria de manera contigua con el mismo nombre y para diferenciar
los elementos de un arreglo se utiliza un ndice. En el lenguaje C++ un
arreglo se le conoce como un tipo de dato compuesto. Los arreglos
pueden tener una o varias dimensiones.
ARREGLOS UNIDIMENSIONALES
ARREGLOS MULTIDIMENSIONALES
2.2.1 EJEMPLO
ALGORITIMO: Arreglo de dos dimensiones de orden 2x3.
char m[2][3] ;
Declaracin
char m[2][3]; // forma una tabla de dos filas y tres columnas
// cada fila es un arreglo de una dimensin
// la declaracin indica que hay dos arreglos de una dimensin
Nombre del grupo
m indica la localizacin del grupo en la memoria
Nombre de las filas
m[0] primera fila indica la localizacin de la fila dentro del
grupo
m[1] segunda fila indica la localizacin de la fila dentro del
grupo
Nombre de los elementos
m[0][0] primer elemento
m[0][1] segundo elemento
m[0][2] tercer elemento
OPERACIONES
EJEMPLO:
ALGORITMO
Pila_vacia
si (tope=0)
ban=0
ban=0
si no
fin si
Pila_llena
si (tope=max)
ban=0
si no
ban=1
fin si
Insertar_pila
Si (ban=1
tope tope+1;
pila[tope]=dato;
si no
Imprimir Pila llena
fin si
Eliminar_pila
si (ban=1)
del_dato lista[tope];
tope tope-1;
si no
Imprimir Pila vacia;
fin si
CODIGO C++
include <stdio.h>
#include <stdlib.h>
#define max 3
int dato[max];
int tope=0;
int op;
void mostrar(void){
printf("\n");
for(int temp=tope-1;temp >=0 ;temp--)
{
printf("Em la posicion %d tenemos %d\n",temp,dato[temp]);
}
printf("\n");
system("PAUSE");
}
void insertar(void){
if (tope==max){
printf("La pila esta llena, OverFlow\n");
}
else {
printf("Digite el valor para entrar em la pila: \n");
scanf("%d",&dato[tope]);
topo++;
}
mostrar();
}
void eliminar(void){
if (tope==0){
printf("\nLa pila esta vacia\n");
}
else {
printf("\Sacado el valor %d de la pila\n",dato[tope-1]);
tope--;
}
exibir();
}
int menu(){
printf(" Para insertar digite
1\n");
printf(" Para eliminar digite
2\n");
printf(" Para mostrar digite
3\n\n");
printf(" Para salir
4\n");
scanf("%d",&op);
switch (op){
case 1 : insertar();
break;
case 2 : eliminar();
break;
case 3 : mostrar();
break;
}
return 0;
}
int main(){
while (op!=4){
system("cls");
menu();
}
return 0;
}
4. COLA
Una cola es una estructura de datos de acceso restrictivo a sus
elementos. Un ejemplo sencillo es la cola del cine o del autobs, el
primero que llegue ser el primero en entrar, y afortunadamente en un
sistema informtico no se cuela nadie salvo que el programador lo diga.
Las colas ofrecen dos operaciones fundamentales, que son encolar (al
final de la cola) y desencolar (del comienzo de la cola). Al igual que con
las pilas, la implementacin de las colas suele encapsularse, es decir,
basta con conocer las operaciones de manipulacin de la cola para
poder usarla, olvidando su implementacin interna.
OPERACIONES
Limpiar Cola
Cola Vaca
Cola Llena
Insertar Cola
Eliminar Cola
4.2
EJEMPLOS
ALGORITMO
INSERTAR
insertar (cola, max, final, frente, dato)
si (final<max)
final <- final+1
cola[final] <- dato
si (final=1) //insertar en primero elemento
frente<-1
fin_si
si no
imprimir cola desbordamiento
fin_si
ELIMINAR
eliminar (cola, frente, final, dato)
si (frente!=0)
//tiene elemento
dato <- cola[frente]
si (frente=final) //hay um solo elemento
frente <- 0
final <- 0 //cola vacia
si no
frente <- frente+1
fin_si
si no
imprimir Cola vacia
fin_si
COLA VACIA
cola_vacia (cola, frente, band)
si (frente=0)
band <- 1
si no
band <- 0
fin_si
COLA LLENA
cola_llena (cola, final, max, band)
si (final=max)
band <- 1
si no
band <- 0
fin_si
CODIGO EN C++
#include <stdio.h>
#define MAX 20
int pila[MAX], cola[MAX],ind=0,idxc=0;
int borrar(){
if (ind==0) printf("Error Pila esta vacia");
else {
ind--;
return pila[ind];
}
}
int borrar_cola(){
int m,n;
if (idxc==0) printf("Error Cola esta vacia");
else {
m = cola[0]; // elemento que sale
for (n=0;n<idxc-1;n++)
cola[n]=cola[n+1];
idxc--;
return m;
}
}
void insertar(int d){
if (ind==MAX) {
printf("Error Pila llena ");
getch();
}
else {
pila[ind]=d;
ind++;
}
}
void insertar_c(int d){
if (idxc==MAX) printf("Error Cola llena ");
else {
cola[idxc]=d;
idxc++;
}
}
int main()
{
int x=1,y,z,j;
while (x!=0) {
system("cls");
printf("1. insertar pila \n");
printf("2. borrar en pila \n");
printf("3. listar pila \n");
printf("4. insertar en cola \n");
printf("5. borrar en cola \n");
printf("6. listar cola \n");
printf("0. Salir \n");
scanf("%d",&x);
switch(x)
{
case 1: printf("digite su dato: ");
scanf("%d",&z);
insertar(z);
break;
case 2: printf("dato borrado: %d",borrar());
getch();
break;
case 3: for (j=0;j<=ind-1; j++) printf("%d - ",pila[j]);
getch();
break;
case 4: printf("digite su dato: ");
scanf("%d",&z);
insertar_c(z);
break;
case 5: printf("dato borrado: %d",borrar_cola());
getch();
break;
case 6: for (j=0;j<=idxc -1; j++) printf("%d - ",cola[j]);
getch();
break;
}
}
}
5. LISTAS
5.1.1 CARACTERISTICAS
5.1.2 EJEMPLO
#include <iostream>
#include <stdlib.h>
using namespace std;
struct nodo{
int nro;
// en este caso es un numero entero
struct nodo *sgte;
};
typedef struct nodo *Tlista;
void insertarInicio(Tlista &lista, int valor)
{
Tlista q;
q = new(struct nodo);
q->nro = valor;
q->sgte = lista;
lista = q;
}
"<<endl;
"<<endl;
{
int x = insertarAntesDespues();
t = lista;
for(i=1; t!=NULL; i++)
{
if(i==pos+x)
{
q->sgte = t->sgte;
t->sgte = q;
return;
}
t = t->sgte;
}
}
cout<<" Error...Posicion no encontrada..!"<<endl;
}
void buscarElemento(Tlista lista, int valor)
{
Tlista q = lista;
int i = 1, band = 0;
while(q!=NULL)
{
if(q->nro==valor)
{
cout<<endl<<" Encontrada en posicion "<< i <<endl;
band = 1;
}
q = q->sgte;
i++;
}
if(band==0)
cout<<"\n\n Numero no encontrado..!"<< endl;
}
void reportarLista(Tlista lista)
{
int i = 0;
while(lista != NULL)
{
cout <<' '<< i+1 <<") " << lista->nro << endl;
lista = lista->sgte;
i++;
}
}
}
else
{
ant = q;
q = q->sgte;
}
}// fin del while
cout<<"\n\n Valores eliminados..!"<<endl;
}
void menu1()
{
cout<<"\n\t\tLISTA ENLAZADA SIMPLE\n\n";
cout<<" 1. INSERTAR AL INICIO
"<<endl;
cout<<" 2. INSERTAR AL FINAL
"<<endl;
cout<<" 3. INSERTAR EN UNA POSICION
"<<endl;
cout<<" 4. REPORTAR LISTA
"<<endl;
cout<<" 5. BUSCAR ELEMENTO
"<<endl;
cout<<" 6. ELIMINAR ELEMENTO 'V'
"<<endl;
cout<<" 7. ELIMINAR ELEMENTOS CON VALOR 'V' "<<endl;
cout<<" 8. SALIR
"<<endl;
cout<<"\n INGRESE OPCION: ";
}
/*
Funcion Principal
---------------------------------------------------------------------*/
int main()
{
Tlista lista = NULL;
int op;
// opcion del menu
int _dato; // elemenento a ingresar
int pos; // posicion a insertar
system("color 0b");
do
{
menu1(); cin>> op;
switch(op)
{
case 1:
cout<< "\n NUMERO A INSERTAR: "; cin>> _dato;
insertarInicio(lista, _dato);
break;
case 2:
cout<< "\n NUMERO A INSERTAR: "; cin>> _dato;
insertarFinal(lista, _dato );
break;
case 3:
cout<< "\n NUMERO A INSERTAR: ";cin>> _dato;
cout<< " Posicion : ";
cin>> pos;
insertarElemento(lista, _dato, pos);
break;
case 4:
cout << "\n\n MOSTRANDO LISTA\n\n";
reportarLista(lista);
break;
case 5:
cout<<"\n Valor a buscar: "; cin>> _dato;
buscarElemento(lista, _dato);
break;
case 6:
cout<<"\n Valor a eliminar: "; cin>> _dato;
eliminarElemento(lista, _dato);
break;
case 7:
cout<<"\n Valor repetido a eliminar: "; cin>> _dato;
eliminaRepetidos(lista, _dato);
break
}
cout<<endl<<endl;
system("pause"); system("cls");
}while(op!=8);
system("pause");
return 0;
}
5.2
Una lista doblemente enlazada es una lista lineal en la que cada nodo
tiene dos enlaces: uno apunta al nodo anterior, o apunta al valor NULL o a
la lista vaca si es el primer nodo; y otro que apunta al siguiente nodo
siguiente, o apunta al valor NULL o a la lista vaca si es el ltimo nodo.
plista->siguiente = nuevo;
if(nuevo->siguiente) nuevo->siguiente->anterior = nuevo;
}
}
void lista::Borrar(int v) {
pnodo nodo;
nodo = plista;
while(nodo && nodo->valor < v) nodo = nodo->siguiente;
while(nodo && nodo->valor > v) nodo = nodo->anterior;
if(!nodo || nodo->valor != v) return;
// Borrar el nodo
if(nodo->anterior) // no es el primer elemento
nodo->anterior->siguiente = nodo->siguiente;
if(nodo->siguiente) // no el el ltimo nodo
nodo->siguiente->anterior = nodo->anterior;
delete nodo;
}
void lista::Mostrar(int orden) {
pnodo nodo;
if(orden == ASCENDENTE) {
Primero();
nodo = plista;
while(nodo) {
cout << nodo->valor << "-> ";
nodo = nodo->siguiente;
}
}
else {
Ultimo();
nodo = plista;
while(nodo) {
cout << nodo->valor << "-> ";
nodo = nodo->anterior;
}
}
cout << endl;
}
void lista::Siguiente() {
if(plista) plista = plista->siguiente;
}
void lista::Anterior() {
if(plista) plista = plista->anterior;
}
void lista::Primero() {
while(plista && plista->anterior) plista = plista->anterior;
}
void lista::Ultimo() {
while(plista && plista->siguiente) plista = plista->siguiente;
}
int main() {
lista Lista;
Lista.Insertar(20);
Lista.Insertar(10);
Lista.Insertar(40);
Lista.Insertar(30);
Lista.Mostrar(ASCENDENTE);
Lista.Mostrar(DESCENDENTE);
Lista.Primero();
cout << "Primero: " << Lista.ValorActual() << endl;
Lista.Ultimo();
cout << "Ultimo: " << Lista.ValorActual() << endl;
Lista.Borrar(10);
Lista.Borrar(15);
Lista.Borrar(45);
Lista.Borrar(40);
Lista.Mostrar(ASCENDENTE);
Lista.Mostrar(DESCENDENTE);
return 0;
}
5.3
LISTAS CIRCULARES
direccin hasta que se regrese hasta el nodo original. Desde otro punto
de vista, las listas enlazadas circulares pueden ser vistas como listas sin
comienzo ni fin. Este tipo de listas es el ms usado para dirigir buffers
para ingerir datos, y para visitar todos los nodos de una lista a partir
de uno dado.
A todos los efectos, las listas circulares son como las listas abiertas en
cuanto a las operaciones que se pueden realizar sobre ellas:
Borrar elementos.
Cada una de estas operaciones podr tener varios casos especiales, por
ejemplo, tendremos que tener en cuenta cuando se inserte un nodo en
una lista vaca, o cuando se elimina el nico nodo de una lista.
5.3.1 EJEMPLO
#include <iostream>
using namespace std;
class nodo {
public:
nodo(int v, nodo *sig = NULL) {
valor = v;
siguiente = sig;
}
private:
int valor;
nodo *siguiente;
friend class lista;
};
typedef nodo *pnodo;
class lista {
public:
lista() { actual = NULL; }
~lista();
void Insertar(int v);
void Borrar(int v);
bool ListaVacia() { return actual == NULL; }
void Mostrar();
void Siguiente();
bool Actual() { return actual != NULL; }
int ValorActual() { return actual->valor; }
private:
pnodo actual;
};
lista::~lista() {
pnodo nodo;
// Mientras la lista tenga ms de un nodo
while(actual->siguiente != actual) {
// Borrar el nodo siguiente al apuntado por lista
nodo = actual->siguiente;
actual->siguiente = nodo->siguiente;
delete nodo;
}
// Y borrar el ltimo nodo
delete actual;
actual = NULL;
}
void lista::Insertar(int v) {
pnodo Nodo;
// Creamos un nodo para el nuevo valor a insertar
Nodo = new nodo(v);
// Si la lista est vaca, la lista ser el nuevo nodo
// Si no lo est, insertamos el nuevo nodo a continuacin del apuntado
// por lista
if(actual == NULL) actual = Nodo;
else Nodo->siguiente = actual->siguiente;
// En cualquier caso, cerramos la lista circular
actual->siguiente = Nodo;
}
void lista::Borrar(int v) {
pnodo nodo;
nodo = actual;
// Hacer que lista apunte al nodo anterior al de valor v
do {
if(actual->siguiente->valor != v) actual = actual->siguiente;
} while(actual->siguiente->valor != v && actual != nodo);
// Si existe un nodo con el valor v:
if(actual->siguiente->valor == v) {
// Y si la lista slo tiene un nodo
if(actual == actual->siguiente) {
// Borrar toda la lista
delete actual;
actual = NULL;
}
else {
// Si la lista tiene ms de un nodo, borrar el nodo de valor v
nodo = actual->siguiente;
actual->siguiente = nodo->siguiente;
delete nodo;
}
}
}
void lista::Mostrar() {
pnodo nodo = actual;
do {
cout << nodo->valor << "-> ";
nodo = nodo->siguiente;
} while(nodo != actual);
cout << endl;
}
void lista::Siguiente() {
if(actual) actual = actual->siguiente;
}
int main() {
lista Lista;
Lista.Insertar(20);
Lista.Insertar(10);
Lista.Insertar(40);
Lista.Insertar(30);
Lista.Insertar(60);
Lista.Mostrar();
cout << "Lista de elementos:" << endl;
Lista.Borrar(10);
Lista.Borrar(30);
Lista.Mostrar();
cin.get();
return 0;
}
6. ARBOLES
El rbol es una estructura de datos fundamental en la informtica, muy
utilizada en todos sus campos, porque se adapta a la representacin
natural de informaciones homogneas organizadas y de una gran
comodidad y rapidez de manipulacin.
Las estructuras tipo rbol se usan principalmente para representar datos
con una relacin jerrquica entre sus elementos, como son rboles
genealgicos, tablas, etc.
La definicin de un rbol implica una estructura recursiva. Esto es, la
definicin del rbol se refiere a otros rboles. Un rbol con ningn nodo
es un rbol nulo; no tiene raz.
RAIZ: Todos los rboles que no estn vacos tienen un nico nodo raz.
Todos los dems elementos o nodos derivan o descienden de el. El nodo
Raz no tiene Padre es decir no es hijo de ningn elemento
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.
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.
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: Son los Vrtices o elementos del rbol.
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.
Equivale al nivel ms alto de los nodos ms 1.
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.
rboles Binarios
rboles AVL
rboles Rojo-Negro
rbol AA
rbol de segmento
rboles Multicamino
rboles B
rbol-B+
rbol-B*
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
CODIGO EN C++
#include <iostream.h>
#include <conio.h>
struct arbol
{
int dato;
arbol *i,*d;
}*elemento, *aux, *cabecera, *ant, *aux2, *ant2;
int dato;
int buscar(void);
void insertar(void);
void buscarmenmay(void);
void buscarmaymen(void);
void eliminar(void);
void main(void)
{
int y,opc;
do
{
clrscr();
y=10;
gotoxy(10,y++);
cout<<"0 - Salir";
gotoxy(10,y++);
cout<<"1 - Buscar";
gotoxy(10,y++);
cout<<"2 - Insertar";
gotoxy(10,y);
cout<<"3 - Borrar";
gotoxy(10,y+=5);
cout<<"Cual es su opcion: ";
cin>>opc;
switch(opc)
{
case 0: break;
case 1: cout<<"\n\nDato a buscar: ";
cin>>dato;
if(buscar())
cout<<"\n\nDato existe";
else
cout<<"\n\nDato inexistente";
break;
case 2:
cout<<"\n\nDato a insertar: ";
cin>>dato;
insertar();
cout<<"\n\nDato Insertado";
break;
case 3:
cout<<"\n\nDato a borrar: ";
cin>>dato;
eliminar();
break;
default:
cout<<"\n\nOpcion incorrecta";
}
if(opc) getch();
}while(opc);
}
int buscar(void)
{
if(!cabecera)
{
cout<<"No hay arbol";
return(0);
}
ant=NULL;
aux=cabecera;
while(aux)
{
if (dato==aux->dato)
return(1);
else
{
ant=aux;
if (dato>aux->dato)
aux=aux->d;
else
aux=aux->i;
}
}
return(0);
}
void insertar(void)
{
if(!cabecera){
cabecera=new(arbol);
cabecera->dato=dato;
cabecera->d=NULL;
cabecera->i=NULL;
return;
}
if (!buscar()) {
aux=new(arbol);
aux->dato=dato;
aux->i=NULL;
aux->d=NULL;
if(dato>ant->dato)
ant->d=aux;
else
ant->i=aux;
}
else
cout<<"\n\nDato existente";
}
void buscarmenmay(void){
aux2=aux->d;
ant2=aux;
while(aux2->i)
{
ant2=aux2;
aux2=aux2->i;
}
aux->dato=aux2->dato;
if(aux2->d)
ant2->i=aux2->d;
delete(aux2);
ant2->d=NULL;
}
void buscarmaymen(void){
aux2=aux->i;
ant2=aux;
while(aux2->d)
{
ant2=aux2;
aux2=aux2->d;
}
aux->dato=aux2->dato;
if(aux2->i)
ant2->d=aux2->i;
delete(aux2);
ant2->i=NULL;
}
void eliminar(void) {
if(!buscar()) {
cout<<"\n\nElemento no encontrado.";
return;
}
7 GRAFOS
(tambin llamado digrafo) porque las relaciones entre los nodos tienen
una direccin. En caso contrario el grafo es no dirigido.
En cualquiera de los dos casos, bien sea que se utilicen lneas o flechas,
a estas relaciones se les puede llamar simplemente aristas.
Frecuentemente las aristas tambin tienen algn tipo de informacin
asociada (distancia, costo, confiabilidad, etc.), en cuyo caso estamos en
presencia de un grafo pesado. Las secuencias de aristas forman caminos
o ciclos. Un ciclo es un camino que termina en el mismo nodo donde
comenz. Si el camino recorre todos los nodos del grafo es llamado tour.
El nmero de aristas en un camino es la longitud del camino.
Lista de adyacencias: se asocia a cada nodo del grafo una lista que
contenga todos aquellos nodos que sean adyacentes a l.
7.3 GENERADORES
Aadir una arista: Dado un grafo, aade una relacin entre dos nodos de
dicho grafo.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
void ingresar_grafo();
void imprimir_grafo();
int w =0, n;
typedef struct nodo{
int dato;struct nodo *sgte;
}nodo;
nodo *vector[20], *actual;
main(){
int opcion;
do{
system("CLS");
printf("\n\t\t\t\t***MENU***\n");
printf("\n\n Diagrama De Pert\n");
printf("\n * Solo trabajar con numeros *\n\n");
printf("\n 1.- Ingresar Nodos");
printf("\n 2.- Imprimir Diagrama:");
printf("\n 3.- SALIR");
printf("\n\n Ingrese una opcion: ");
cin>>opcion;
if(opcion>3 || opcion<0){
printf("\n Opcion NO VALIDA");
printf("\n\n ** PRESIONE CUALQUIER TECLA PARA VOLVER AL
MENU **");
getch();
}
switch(opcion){
case 1:ingresar_grafo();
break;
case 2:
imprimir_grafo();
break;
case 3:opcion=0;
}
}while(opcion!=0);
getch();
}
void ingresar_grafo(){
int i,m,j,valor, x[20],y[20];
printf( "Ingrese n: ");
cin>>n;
for (i=0; i<n; i++)
adyacente:
{
y[i]=i+1;
if(i==n-1){
printf("\n\nNodo final\n");
}
printf("Ingrese numero de vertices adyacentes a %d:",i+1);
cin>>m;
if(i==n-1){
m=0;
printf("No Se Puede Poner Un Nodo Adyacente Al NodoFinal\n\n");
getch();
}
if(m==0 && i!=n-1){
printf("Debe Sealar a Un Nodo\n\n");
getch();
goto adyacente;
}
For (j=0; j<m; j++){
intenta:
printf("Ingrese vertice:");
cin>>valor;
if(valor==i+1){
printf("No Puedes Apuntar Al MismoNodo\n\n");
goto intenta;
}
x[j]=valor;
if(valor==1){
printf("No Puedes Apuntar Al NodoInicio\n\n");
goto intenta;
}
if(valor>n||valor<1){
printf("No Puedes Crear Mas Nodos De Los Preestablecidos\n\n");
goto intenta;
}
for(int h=0 ;h!=j;h++){
if(x[h]==x[j]){
printf("No Puedes Apuntar 2veces A Un Nodo\n\n");
goto intenta;
}
}
if(i>2){
for(int h=i ;h>2;h--){
for(int hh=0;hh!=j;h++){
if(y[h]==x[hh]){
printf("No Puedes Apuntar A Un Nodo Que Y Haya
Sealado A Este\n\n");
goto intenta;
}
}
}
}
actual = (nodo *) malloc(sizeof(nodo));
actual->dato = valor;
actual->sgte = vector[i];vector[i] = actual;
}
}
w=n;
}
void imprimir_grafo(){
int i;
for (i=0; i<w; i++){
printf("\nAdyacente al nodo %d: ",i+1);
actual=vector[i];
while(actual != NULL){
printf("% d", actual->dato);
getch();
actual = actual->sgte;
}
}
}
8 METODOS DE ORDENAMIENTO
Debido a que las estructuras de datos son utilizadas para almacenar
informacin, para poder recuperar esa informacin de manera eficiente
es deseable que aquella est ordenada. Existen varios mtodos para
ordenar
las
diferentes
estructuras
de
datos
bsicas.
En general los mtodos de ordenamiento no son utilizados con
frecuencia, en algunos casos slo una vez. Hay mtodos muy simples de
implementar que son tiles en los casos en dnde el nmero de
elementos a ordenar no es muy grande (ej, menos de 500 elementos).
Por otro lado hay mtodos sofisticados, ms difciles de implementar
pero que son ms eficientes en cuestin de tiempo de ejecucin.
Los mtodos sencillos por lo general requieren de aproximadamente n x
n pasos para ordenar n elementos.
Los mtodos simples son: insertion sort (o por insercin directa)
selection sort, bubble sort, y shellsort, en dnde el ltimo es una
extensn al insertion sort, siendo ms rpido. Los mtodos ms
complejos son el quick-sort, el heap sort, radix y address-calculation
sort. El ordenar un grupo de datos significa mover los datos o sus
referencias para que queden en una secuencia tal que represente un
orden, el cual puede ser numrico, alfabtico o incluso alfanumrico,
ascendente
o
descendente.
Se ha dicho que el ordenamiento puede efectuarse moviendo los
registros con las claves. El mover un registo completo implica un costo,
el cual se incrementa conforme sea mayor el tamao del registro. Es por
ello que es deseable evitar al mximo el movimiento de los registros.
Una alternativa es el crear una tabla de referencias a los registros y
mover las referencias y no los datos. A continuacin se mostrarn los
mtodos de ordenamiento empezando por el ms sencillo y avanzando
hacia los mas sofisticados.
La eficiencia de los algoritmos se mide por el nmero de comparaciones
e intercambios que tienen que hacer, es decir, se toma n como el
nmero de elementos que tiene el arreglo a ordenar y se dice que un
algoritmo realiza O(n2) comparaciones cuando compara n veces los n
elementos, n x n = n2.
8.1 ORDENAMIENTO DE BURBUJA
La Ordenacin
de
burbuja (Bubble
Sort en
ingls)
es
un
sencillo algoritmo de ordenamiento. Funciona revisando cada elemento
de la lista que va a ser ordenada con el siguiente, intercambindolos de
posicin si estn en el orden equivocado. Es necesario revisar varias
veces toda la lista hasta que no se necesiten ms intercambios, lo cual
significa que la lista est ordenada. Este algoritmo obtiene su nombre de
la forma con la que suben por la lista los elementos durante los
intercambios, como si fueran pequeas "burbujas". Tambin es conocido
como el mtodo del intercambio directo. Dado que solo usa
comparaciones para operar elementos, se lo considera un algoritmo de
comparacin, siendo el ms sencillo de implementar.
8.2.1 EJEMPLO C++
#include<stdio.h>
#include<conio.h>
int a[3]={3,2,1};
int i,j,aux,n=3;
void main(){
clrscr();
for(i=0;i<=n;i++){
for(j=0;j<n-1;j++){
if(a[j]>a[j+1]){
aux=a[j];
a[j]=a[j+1];
a[j+1]=aux;
}
}
}
for(i=0;i<3;i++)
{
printf("%d",a);
}
getch();
}
8.3 ORDENAMIENTO SHELL
El ordenamiento Shell (Shell sort en ingls) es un algoritmo de
ordenamiento. El mtodo se denomina Shellen honor de su
inventor Donald Shell. Su implementacin original, requiere O(n2)
comparaciones e intercambios en el peor caso. Un cambio menor
presentado en el libro de V. Pratt produce una implementacin con un
rendimiento de O(n log2 n) en el peor caso. Esto es mejor que las O(n2)
comparaciones requeridas por algoritmos simples pero peor que el
ptimo O(n log n). Aunque es fcil desarrollar un sentido intuitivo de
cmo funciona este algoritmo, es muy difcil analizar su tiempo de
ejecucin. El algoritmo Shell sort mejora el ordenamiento por insercin
comparando elementos separados por un espacio de varias posiciones.
Esto permite que un elemento haga "pasos ms grandes" hacia su
posicin esperada. Los pasos mltiples sobre los datos se hacen con
tamaos de espacio cada vez ms pequeos. El ltimo paso del Shell
Y en
}
}
temp=x[minimo];
x[minimo]=x;
x=temp;
}
for(i=0;i<n;i++)
{
printf("%d",x);
}
getch();
}