lunes, 15 de julio de 2013

Agenda Electrónica con árbol AVL en C++

Hola amig@s en esta vez les traigo como hacer una agenda electrónica implementando un árbol AVL las opciones de la agenda son agregar  un nuevo contacto, buscar, eliminar, mostrar, mostrar el numero de contactos y salir.

Capturas:



Codigo:

ArbolAVL.cpp

#include 
#include 
#include 
#include 
#include "ArbolAVL.h"
using namespace std;

int main()
{

  arbol A;
  tarbol b;
  char nombre[50];
  char telefono[10];
  char direccion[50];
  char email[50];
  char op;
  int t;
 
  do{
   fflush(stdin);
      system("cls");
   cout<<"\tMenu\n\n";
   cout<<"\t1- Agregar\n";
   cout<<"\t2- Buscar\n";
   cout<<"\t3- Eliminar\n";
   cout<<"\t4- Mostrar\n";
   cout<<"\t5- Estadistica\n";
   cout<<"\t6- Salir\n\n";
   cout<<"Ingrese la opcion: ";
   cin>>op;
   fflush(stdin);
   switch(op)
   {
  case '1': {
   fflush(stdin);
      system("cls");
   cout<<"\nIngrese Nombre: ";
   gets(nombre);
   fflush(stdin);
   do{
   cout<<"\nIngrese Telefono 0000-0000: ";
   gets(telefono);
   fflush(stdin);
   t=strlen(telefono);
     }while(t!=9);
   cout<<"\nIngrese Direccion: ";
   gets(direccion);
   fflush(stdin);
   cout<<"\nIngrese Email: ";
   gets(email);
   fflush(stdin);
   A.insertar(A.miarbolito,nombre,telefono,direccion,email);
   break;
     }
  case '2':{
   fflush(stdin);
   system("cls");
   cout<<"\nNombre: ";
   gets(nombre);
   fflush(stdin);
   b=A.buscar(A.miarbolito,nombre);
   if(b!=NULL)
   {
   fflush(stdin);
   system("cls");
   cout<<"\nContacto encontrado:";
   cout<<"\n\nNombre: "<nombre;
   cout<<"\nTelefono: "<telefono;
   cout<<"\nEmail: "<email;
   cout<<"\nDireccion: "<direccion;
   system("pause");
   }
     break;
        }
  case '3':{
   system("cls");fflush(stdin);
   cout<<"\nNombre: ";
   gets(nombre);
   fflush(stdin);
   A.borrar(A.miarbolito,nombre);
   system("pause");
   break;
     }
  case '4':{
   system("cls");
            cout<<"\n\n";
   A.IDN(A.miarbolito);system("pause");
   break; 
        }
  case '5':{
      system("cls");
            A.pe=0;
   cout<<"\nNumero de contactos: "<nombre)<0 data-blogger-escaped-aux-="" data-blogger-escaped-insertar="">Izdo,nom,tel,dir,em); 
   }
   else 
   { if(strcmpi(nom,aux->nombre)>0)
    {
    insertar(aux->Dcho,nom,tel,dir,em);
    }
   }
 }
}
tarbol arbol::buscar(tarbol aux,char nom[50])
{  
 if (aux==NULL)
 {  
  return NULL;
 }
 else
 {
  if (strcmpi(nom,aux->nombre)==0)
  {
   return aux;
  }
  else
  { if (strcmpi(nom,aux->nombre)<0 data-blogger-escaped-aux-="" data-blogger-escaped-buscar="" data-blogger-escaped-return="">Izdo, nom);
   }
   else
   {
    return buscar(aux->Dcho, nom);
   }
  }
 }
}
void arbol::borrar(tarbol &aux,char nom[50])
{
 if (aux==NULL)
 {
  cout<<"contacto no encontrado no encontrado !!\n\n";
 }
 else
 {if (strcmpi(nom,aux->nombre)<0 data-blogger-escaped-aux-="" data-blogger-escaped-borrar="">Izdo, nom);
   }
    else 
    {
     if (strcmpi(nom,aux->nombre)>0)
     {
    borrar(aux->Dcho,nom);
     }
    else
    { 
    tarbol temp=aux;
    if (aux->Izdo== NULL)
     {
     aux = aux->Dcho;
     }
     else 
     {
      if (aux->Dcho == NULL)
      {
        aux = aux->Izdo;
      }
      else 
      {
       actualizar(temp,temp->Izdo);
      }
      delete  temp;
     
     }
    }
   }
 }
}
void arbol::actualizar(tarbol &temp, tarbol &aux)
{ 
 if(aux->Dcho!=NULL)
 {
  actualizar(temp,aux->Dcho);}

 else
 {
  strcpy(temp->nombre,aux->nombre);
  strcpy(temp->telefono,aux->telefono);
  strcpy(temp->email,aux->email);
  strcpy(temp->direccion,aux->direccion);
     temp=aux;
  aux=temp->Izdo;
 }
}
void arbol::IDN( tarbol aux)
{
     if(aux!=NULL)
  { 
          IDN(aux->Izdo);
          if(strcmpi(aux->nombre,"M")!=0)
    {
              cout<<"Nombre: "<< aux->nombre<<" "<telefono<<" "<email<<" "<direccion<<" "<Dcho);
      }
}

int arbol::Peso( tarbol aux)
{
    if(aux!=NULL)
 {
  pe++; 
  Peso(aux->Izdo); 
  Peso(aux->Dcho);
  return  pe;
 }
 else
 {
  return -1;
    }
}
int arbol::maximo(int a, int b)
{ 
 if(a > b)
 return a;
 else return b;
}
int arbol::altura(tarbol &aux)
{
 if(aux)
 return aux->eq;
 else return -1;    
}
void arbol::balance (tarbol &aux, char nom[50])
{ 
  if (aux)
 {       
  if (strcmpi(nom,(aux)->nombre)>0)
  {balance(aux->Dcho,nom);
  }
  else {if (strcmpi(nom,(aux)->nombre)<0 data-blogger-escaped-aux-="" data-blogger-escaped-balance="">Dcho,nom);
    }
    }
        int fe=altura(aux->Dcho)-altura(aux->Izdo);
  switch (fe)
  {
  case -2:
   {
    if (altura(aux->Izdo->Izdo) > altura(aux->Izdo->Dcho))
    RII(aux);
    else RID(aux);
    break;
   }
  case 2:
   {
   if (altura(aux->Dcho->Dcho) > altura(aux->Dcho->Izdo))
    RDD(aux);
   else 
      RDI(aux);
   break;
   }
  default:
   aux->eq = maximo(altura(aux->Izdo),altura(aux->Dcho)) +1;
  }
 }
}
void arbol::RII(tarbol &aux){
        tarbol n1=aux->Izdo;
  aux->Izdo=n1->Dcho;
  n1->Dcho=aux;
  aux=n1;
  n1 = aux->Dcho;
  if(n1)
  n1->eq = maximo(altura(n1->Izdo),altura(n1->Dcho))+1;
  aux->eq = maximo(altura(aux->Izdo),altura(aux->Dcho))+1; 
}
void arbol::RDD(tarbol &aux){
     tarbol temp;
     temp=aux->Dcho;
     aux->Dcho=temp->Izdo;
     temp->Izdo=aux;
     aux=temp;
     temp = aux->Izdo;
     if(temp)
     temp->eq = maximo(altura(temp->Izdo),altura(temp->Dcho))+1;
     aux->eq = maximo(altura(aux->Izdo),altura(aux->Dcho))+1;
}
void arbol::RID(tarbol &aux){
  RDD(aux->Izdo);
     RII(aux);
}
void arbol::RDI(tarbol &aux){
 RII(aux->Dcho);
 RDD(aux);
}

ArbolAVL.h

#include

class nodo{
public:
 char nombre[50];
 char telefono[10];
 char direccion[50];
 char email[50];
 int eq;
 nodo *Izdo, *Dcho;
 nodo(char nom[50],char tel[10],char dir[50],char em[50], nodo *Iz=NULL, nodo *Dr=NULL,int t=0){
 strcpy(nombre,nom);
 strcpy(telefono,tel);
 strcpy(direccion,dir);
 strcpy(email,em);
 eq=t;
 Izdo=Iz;
 Dcho=Dr; 
 }
 class arbol;
};
typedef nodo *tarbol; 
class arbol{
public: 
      tarbol miarbolito;   
     int pe;
  int a;
   arbol(){
   miarbolito=NULL;
   pe=0;
   a=0;
       }    
      void insertar(tarbol &aux,char nom[50],char tel[10],char dir[50],char em[50]);
      tarbol buscar(tarbol aux,char nom[50]);
      void borrar(tarbol &aux,char nom[50]);
      void actualizar(tarbol &temp, tarbol &aux);
      void balance(tarbol &aux, char nom[50]);
      int maximo(int a, int b);
      void IDN(tarbol aux);
      void RDD(tarbol &aux);
      void RDI(tarbol &aux);
      void RID(tarbol &aux);
      void RII(tarbol &aux);
      int Peso(tarbol aux);
      int altura(tarbol &aux);
};


puedes descargar el proyecto desde aquí.

No hay comentarios :

Publicar un comentario