Professional Documents
Culture Documents
#include"stdafx.h" #include<iostream> #include<deque> usingnamespace System; usingnamespace std; void mostrarContenido(deque<int>c) { if(!c.empty()) { int tam=c.size(); for(int i=0;i<tam;i++) cout<<c[i]<<";"; } else cout<<"la cola esta vacia"<<endl; cout<<endl; } void main() { deque<int>cola; mostrarContenido(cola); cola.push_back(1); mostrarContenido(cola); cola.push_front(2); mostrarContenido(cola); cola.push_back(3); mostrarContenido(cola); cola.pop_front(); mostrarContenido(cola); cola.pop_back(); mostrarContenido(cola); cola.pop_front(); mostrarContenido(cola); System("PAUSE"); }
Practica 2
#include"stdafx.h" #include<iostream> usingnamespace System; usingnamespace std; struct nodo { int num; nodo * siguiente; }; typedef nodo * LISTA; LISTA inicio = NULL; void push_cola (LISTA &puntero, int numero) { LISTA puntero1, puntero2; puntero1 = puntero; if (puntero1 == NULL) { puntero1 = new nodo; puntero1 ->num=numero; puntero1 ->siguiente=NULL; puntero = puntero1; } else { while (puntero1 ->siguiente !=NULL) puntero1 = puntero1 ->siguiente; puntero2 = new nodo; puntero2 ->num = numero; puntero2 ->siguiente = NULL; puntero1 ->siguiente = puntero2; } } void mostrar_cola(LISTA puntero) { if(puntero==NULL) cout<<"la cola esta vacia"<<endl; while(puntero!=NULL) { cout<<puntero->num<<","; puntero=puntero->siguiente; } } void mostrar_cola_frente(LISTA puntero) { if(puntero==NULL) cout<<"la cola esta vacia"<<endl; else { cout<<puntero->num<<endl; } } void pop_cola(LISTA &puntero) {
LISTA puntero2; puntero2=puntero; if(puntero==NULL) cout<<"la cola esta vacia"<<endl; else { if(puntero2->siguiente!=NULL) { puntero=puntero->siguiente; delete puntero2; } else { delete puntero2; puntero=NULL; } } } void main() { int op,num; do { system("CLS"); cout<<"MENU COLA"<<endl; cout<<"1 insertar elemento en la cola"<<endl; cout<<"2 sacar elemento de la cola"<<endl; cout<<"3 ver el frente de la cola"<<endl; cout<<"4 imprimir todos los elementos de la cola"<<endl; cout<<"5 salir"<<endl; cin>>op; switch(op) { case 1: cout<<"dame el numero a insertar"<<endl; cin>>num; push_cola(inicio,num); break; case 2: pop_cola(inicio); break; case 3: mostrar_cola_frente(inicio); system("PAUSE"); break; case 4: mostrar_cola(inicio); cout<<endl; system("PAUSE"); break; case 5: cout<<"saliendo del sistema"<<endl; break; default: cout<<"opcion no valida"<<endl; system("PAUSE"); } } while(op=5); system("PAUSE"); }
Practica 3
#include"stdafx.h" #include<iostream> usingnamespace System; usingnamespace std; class nodo { public: nodo (int v, nodo *sig =NULL) { valor = v; siguiente = sig; } private: int valor; nodo * siguiente; friendclass cola; }; typedef nodo * pnodo; class cola { public: cola(): primero(NULL), ultimo(NULL) {} ~cola(); void Aadir (int v); int leer(); private: pnodo primero, ultimo; }; cola::~cola() { while (primero) leer(); } void cola::Aadir (int v) { pnodo nuevo; nuevo = new nodo(v); if (ultimo) ultimo ->siguiente = nuevo; ultimo=nuevo; if (!primero) primero=nuevo; } int cola::leer() { pnodo nodo; int v; nodo=primero; if (!nodo) return 0; primero=nodo->siguiente; v=nodo->valor; delete nodo;
if (!primero) ultimo=NULL; return v; } void main() { cola Cola; Cola.Aadir(20); cout<<"Aadir(20)"<<endl; Cola.Aadir(10); cout<<"Aadir(10)"<<endl; Cola.Aadir(40); cout<<"Aadir(40)"<<endl; Cola.Aadir(30); cout<<"Aadir(30)"<<endl; cout<<"Leer:"<<Cola.leer()<<endl; cout<<"Leer:"<<Cola.leer()<<endl; Cola.Aadir(90); cout<<"Aadir(90)"<<endl; cout<<"Leer:"<<Cola.leer()<<endl; cout<<"Leer:"<<Cola.leer()<<endl; system("PAUSE"); }
Practica 4
#include"stdafx.h" #include<stdlib.h> #include<iostream> #include<time.h> usingnamespace System; usingnamespace std; struct ArbolNodo { struct ArbolNodo * izqPtr; int dato; struct ArbolNodo * derPtr; }; typedefstruct ArbolNodo ARBOLNODO; typedef ARBOLNODO * ARBOLNODOPTR; void insertarNodo (ARBOLNODOPTR*, int); void inorden(ARBOLNODOPTR); void preorden (ARBOLNODOPTR); void postorden (ARBOLNODOPTR); void main() { int i, numero; ARBOLNODOPTR raizPtr = NULL; srand (time(NULL)); cout<<"Los numeros estan colocados en el arbol "<<endl; for (i=1; i<10; i++) { numero = rand()%15; cout<<numero<<","; insertarNodo (&raizPtr, numero); } cout<<endl; cout<<"Recorrido del arbol en Preorden "<<endl; preorden(raizPtr); cout<<endl; cout<<"Recorrido del arbol en Inorden "<<endl; inorden(raizPtr); cout<<endl; cout<<"Recorrido del arbol en Postorden "<<endl; postorden(raizPtr); cout<<endl; system("PAUSE"); } void insertarNodo (ARBOLNODOPTR * arbolPtr, int valor) { if (*arbolPtr==NULL) { *arbolPtr=new ARBOLNODO; if (*arbolPtr!=NULL) { (*arbolPtr)->dato = valor; (*arbolPtr)->izqPtr = NULL; (*arbolPtr)->derPtr = NULL;
} else cout<<"No hay memoria disponible "; } else if (valor<(*arbolPtr)->dato) insertarNodo(&((*arbolPtr)->izqPtr), valor); else if (valor>(*arbolPtr)->dato) insertarNodo (&((*arbolPtr)->derPtr), valor); else cout<<"duplicado, "; } void inorden (ARBOLNODOPTR arbolPtr) { if(arbolPtr!=NULL) { inorden (arbolPtr->izqPtr); cout<<arbolPtr->dato<<","; inorden (arbolPtr->derPtr); } } void preorden (ARBOLNODOPTR arbolPtr) { if(arbolPtr!=NULL) { cout<<arbolPtr->dato<<","; preorden (arbolPtr->izqPtr); preorden (arbolPtr->derPtr); } } void postorden (ARBOLNODOPTR arbolPtr) { if(arbolPtr!=NULL) { postorden (arbolPtr->izqPtr); postorden (arbolPtr->derPtr); cout<<arbolPtr->dato<<","; } }
Practica 5
#include"stdafx.h" usingnamespace System; #include<iostream> usingnamespace std; class ArbolABB { private: ///Clase local de lista para Nodo De ArbolBinario: class Nodo { public: //constructor: Nodo(constint dat, Nodo*izq=NULL, Nodo*der=NULL): dato(dat),izquierdo(izq),derecho(der){} //miembros int dato; Nodo*izquierdo; Nodo*derecho; }; //punteros de la lista para la cabeza y nodod actual Nodo*raiz; Nodo*actual; int contador; int altura; public: //Constructor y destructor basicos: ArbolABB():raiz(NULL),actual(NULL){} ~ArbolABB(){Podar(raiz);} //Insertar en arbol ordenado void Insertar(constint dat); //Borrar un elemento del arbol; void Borrar(constint dat); //Funcion de busqueda: bool Buscar(constint dat); //Comprobar si el arbol esta vacio: bool Vacio(Nodo*r){return r==NULL;} //Comprobar se es un nodo hoja: bool EsHoja(Nodo*r){return !r->derecho&&!r->izquierdo;} //contar numero de nodos: constint NumeroNodos(); constint AlturaArbol(); //calcular altura de un int: int Altura(constint dat); //devolver referencia al int del nodo actual: int&ValorActual(){return actual->dato;} //moverse al Nodo raiz: void Raiz(){actual=raiz;} //aplicar una funcion a cada elemnto del arbool: void InOrden(void (*func)(int&),Nodo*nodo=NULL,bool r=true); void PreOrden(void (*func)(int&),Nodo*nodo=NULL,bool r=true); void PostOrden(void (*func)(int&),Nodo*nodo=NULL,bool r=true); private: //funciones auxiliares
void Podar(Nodo*&); void auxContador(Nodo*); void auxAltura(Nodo*,int); }; //Poda:borrar todos los nodods a partir de uno, incluido void ArbolABB::Podar(Nodo*&nodo) { //algoritmo recursivo,recorrido en postorden if(nodo){ Podar(nodo->izquierdo);//podar izquierdo Podar(nodo->derecho);//podar derecho delete nodo; //eliminar nodo nodo=NULL; } } //Insertar un int en el arbol ABB void ArbolABB::Insertar(constint dat) { Nodo*padre =NULL; actual=raiz; //Buscar el int en el arbol, manteniendo un puntero al nodo padre while(!Vacio(actual)&&dat!=actual->dato){ padre=actual; if(dat>actual->dato)actual=actual->derecho; elseif(dat<actual->dato)actual=actual->izquierdo; } //si se ha encontrado el elemento, regresar sin insertar if(!Vacio(actual))return; //si padre es null, entonces el arbol esta vacio, el nuevo nodo sera //el nodo raiz if(Vacio(padre))raiz= new Nodo(dat); //si el int es menor que el que contiene el nodo padre, lo insertamos //en la rama izquierda elseif(dat<padre->dato)padre->izquierdo=new Nodo(dat); //si el int es mayor que el que contiene el nodo padre, lo insertamos //en la rama derecha elseif(dat>padre->dato)padre->derecho=new Nodo(dat); } //eliminar un elemento de un arbol ABB void ArbolABB::Borrar(constint dat) { Nodo*padre=NULL; Nodo*nodo; int aux; actual=raiz; //mientras sea posible que el valor estte en el arbol while(!Vacio(actual)){ if(dat==actual->dato){//si el valor esta en el nodo actual if(EsHoja(actual)){//si ademas es un nodo hoja:lo borramos if(padre)//si tiene padre(no es el nodo raiz) //Anular el puntero que le hacemos referencia
if(padre->derecho==actual)padre>derecho=NULL; elseif(padre->izquierdo == actual)padre>izquierdo = NULL; delete actual;//Borrar el nodo actual=NULL; return; } else{//si el valor esta en el nodo actual, pero no es hoja //buscar nodo padre=actual; //buscar nodo mas izquierdode rama derecha if(actual->derecho){ nodo=actual->derecho; while(nodo->izquierdo){ padre=nodo; nodo=nodo->izquierdo; } } //o buscar nodo mas derecho de rama izquierdo else{ nodo=actual->izquierdo; while(nodo->derecho){ padre=nodo; nodo=nodo->derecho; } } //intercambiar valores de no a borrar un nodo encontradao //y continuar,cerrando el bucle.El nodo encontrado no tiene //por que ser un nodo hoja,cerrando el bulce nos aseguramos //de que solo se elimine nodos hoja. aux=actual->dato; actual->dato=nodo->dato; nodo->dato=aux; actual=nodo; } } else{//todavia no hemos encontrado el valor,seguir buscandolo padre=actual; if(dat>actual->dato)actual=actual->derecho; elseif (dat<actual->dato)actual=actual->izquierdo; } } } //recorrido de arbol en inorden, aplicamos la funcion func,que tiene //el prototipo //void func(int&) void ArbolABB::InOrden(void(*func)(int&),Nodo*nodo,bool r) { if(r)nodo=raiz; if(nodo->izquierdo)InOrden(func,nodo->izquierdo,false); func(nodo->dato); if(nodo->derecho)InOrden(func,nodo->derecho,false); } //recorrido de arbol en preorden, aplicamos la funcion fun,que tiene //el prototipo
//void func(int&) void ArbolABB::PreOrden(void(*func)(int&),Nodo*nodo,bool r) { if(r)nodo=raiz; func(nodo->dato); if(nodo->izquierdo)PreOrden(func,nodo->izquierdo,false); if(nodo->derecho)PreOrden(func,nodo->derecho,false); } //recorrido de arbol en postorden, aplicamos la funcion fun,que tiene //el prototipo //void func(int&) void ArbolABB::PostOrden(void(*func)(int&),Nodo*nodo,bool r) { if(r)nodo = raiz; if(nodo->izquierdo)PostOrden(func,nodo->izquierdo,false); if(nodo->derecho)PostOrden(func,nodo->derecho,false); func(nodo->dato); } //Buscar un valor en el arbol bool ArbolABB::Buscar(constint dat) { actual = raiz; //Todavia puede aparecer, ya que quedan nodos por mirar while(!Vacio(actual)){ if(dat==actual->dato)returntrue;//int encontrado elseif(dat>actual->dato)actual=actual->derecho;//seguir elseif(dat<actual->dato)actual=actual->izquierdo; } returnfalse;//No esta en arbol } //Calcular la altura del nodo que contiene el int dat int ArbolABB::Altura(constint dat) { int altura=0; actual=raiz; //todavia puede aparecer , ya que quedan nodos por mirar while(!Vacio(actual)){ if(dat==actual->dato)return altura; //int encontrado else{ altura++;//incrementamos la altura, seguimos buscando if(dat>actual->dato)actual=actual->derecho; elseif(dat<actual->dato)actual=actual->izquierdo; } } return -1;//No esta en arbol } //contar el numeor de nodos constint ArbolABB::NumeroNodos() { contador=0; auxContador(raiz);//Funcion auxiliar return contador; } //funcion auxiliar para contar nodos.Funcion recursiva de recorrido en //preorden, el proceso es aumentar el contador void ArbolABB::auxContador(Nodo*nodo) {
contador ++;//otro nodo //continuar recorrido if(nodo->izquierdo)auxContador(nodo->izquierdo); if(nodo->derecho)auxContador(nodo->derecho); } //calcular la altura del alrbol, que es la alatura del nodo de mayor altura. constint ArbolABB::AlturaArbol() { altura=0; auxAltura(raiz,0);//Funcion Auxiliar return altura; } //funcion auxiliar para calculara la altura.Funcion recursiva de recorrido en //postorden, el procesoes actualizar la altura solo en nodos hojas de mayor //altura de la maxima actual void ArbolABB::auxAltura(Nodo*nodo,int a) { //recorrido postorden if(nodo->izquierdo)auxAltura(nodo->izquierdo,a+1); if(nodo->derecho)auxAltura(nodo->derecho,a+1); //proceso,si es un nodo hoja y su altura es mayor que la actual del //arbol, actualizamos la altura actual del arbol if(EsHoja(nodo)&& a > altura)altura=a; } //funcion de prueba para recorridos del arbol void Mostrar(int&d) { cout<<d<<","; } int main() { //Un arbol de enteros ArbolABB Arbollnt; //insercion de nodos en arbol: Arbollnt.Insertar(10); Arbollnt.Insertar(5); Arbollnt.Insertar(12); Arbollnt.Insertar(4); Arbollnt.Insertar(7); Arbollnt.Insertar(3); Arbollnt.Insertar(6); Arbollnt.Insertar(9); Arbollnt.Insertar(8); Arbollnt.Insertar(11); Arbollnt.Insertar(14); Arbollnt.Insertar(13); Arbollnt.Insertar(2); Arbollnt.Insertar(1); Arbollnt.Insertar(15); Arbollnt.Insertar(10); Arbollnt.Insertar(17); Arbollnt.Insertar(18); Arbollnt.Insertar(16); cout<<"ALTURA DE ARBOL "<<Arbollnt.AlturaArbol()<<endl;
//mostrar el arbol en tres ordenes distintos: cout<<"Inorden:"; Arbollnt.InOrden(Mostrar); cout<<endl; cout<<"PreOrden: "; Arbollnt.PreOrden(Mostrar); cout<<endl; cout<<"PostOrden: "; Arbollnt.PostOrden(Mostrar); cout<<endl; //Borraremos algunos elementos: cout<<"N nodos : "<<Arbollnt.NumeroNodos()<<endl; Arbollnt.Borrar(5); cout<<"Borrar 5 : "; Arbollnt.InOrden(Mostrar); cout<<endl; Arbollnt.Borrar(8); cout<<"Borrar 8 : "; Arbollnt.InOrden(Mostrar); cout<<endl; Arbollnt.Borrar(15); cout<<"Borrar 15 : "; Arbollnt.InOrden(Mostrar); cout<<endl; Arbollnt.Borrar(245); cout<<"Borrar 245 : "; Arbollnt.InOrden(Mostrar); cout<<endl; Arbollnt.Borrar(4); cout<<"Borrar 4 : "; Arbollnt.InOrden(Mostrar); Arbollnt.Borrar(17); cout<<endl; cout<<"Borrar 17 : "; Arbollnt.InOrden(Mostrar); cout<<endl; //Veamos algun parametro cout<<"N nodos :"<<Arbollnt.NumeroNodos()<<endl; cout<<"Altura de 1"<<Arbollnt.Altura(1)<<endl; cout<<"Altura de 10"<<Arbollnt.Altura(10)<<endl; cout<<"Altura de arbol "<<Arbollnt.AlturaArbol()<<endl; cin.get(); return 0; }