martes, 27 de noviembre de 2012

Lista Doble C++, Insertar, Eliminar, Buscar, Mostrar

Buenas, hoy les traigo un codigo donde se crea una lista doble y permite las operaciones basicas sobre ella: Insertar, Buscar, Eliminar y Mostrar. Ademas de una nueva operacion donde se puede insertar antes o despues de un elemento de la lista, a partir de esta implementancion puede diseñar otros metodos con el comportamiento que quieran.

Aqui les dejo el codigo, pruebenlo y comenten.



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

using namespace std;
typedef int tipo;
class nodo_doble{
 tipo dato;
 nodo_doble *anterior, *siguiente;

 public:
 nodo_doble(tipo d, nodo_doble * e , nodo_doble *ee ){ dato=d; siguiente=e; anterior=ee; }
 nodo_doble(tipo d){ dato=d; }

 tipo m_dato(){ return dato; }
 nodo_doble* m_siguiente(){ return siguiente; }
 nodo_doble* m_anterior(){ return anterior; }
 void p_anterior(nodo_doble *e){ anterior=e; }
 void p_siguiente(nodo_doble *e){ siguiente = e; }
};

class lista_d
{
nodo_doble *primero;

 public:
  lista_d(){ primero = NULL; }

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~insertar principio
  void insertar_p(tipo d){
  nodo_doble * nuevo,*aux; aux=primero;
    nuevo=new nodo_doble(d);  


         if(primero==NULL)
              primero=nuevo;
           else
           {   while(aux->m_siguiente() != NULL)
               {   aux=aux->m_siguiente();  }
             aux->p_siguiente(nuevo);
             nuevo->p_anterior(aux);
             }//fin else

   }

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~mostrar
  void mostrar(){
  nodo_doble * aux=primero;
        cout<<" Lista: { ";
       while(aux!=NULL)
       {
         cout<<aux->m_dato();cout<<",";   aux=aux->m_siguiente();
             if(aux==NULL)
             cout<<"\b }"<<endl;       } //fin while

  }//fin mostrar

 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~buscar
   nodo_doble* buscar(tipo d){
       nodo_doble * aux=primero;

        while(aux!=NULL)
        {
            if(d==aux->m_dato())
             return aux;
           aux=aux->m_siguiente();
        }
        return NULL;
     }//fin buscar


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~insertar entre elemento
 void insertar_ee(nodo_doble *aux, tipo d){
    nodo_doble *nuevo;

      cout<<"Para insertarlo antes del elemento <1>, despues del elemento <2>\n";
       int  t=0;  cin>>t;
               nuevo=new nodo_doble(d);
      do{
        switch(t){
           case 1: if(aux == primero)
                   {   nuevo->p_siguiente(primero);
                      if(primero!=NULL)
                         primero->p_anterior(nuevo);
                    primero=nuevo;                    }//fin if
                  else
                  {  nuevo->p_siguiente(aux);
                     nuevo->p_anterior(aux->m_anterior());
                     aux->m_anterior()->p_siguiente(nuevo);
                     aux->p_anterior(nuevo);   }//fin else
           break;
           case 2:  if(aux->m_siguiente() == NULL)
                   {  aux->p_siguiente(nuevo);
                     nuevo->p_anterior(aux);    }//fin if
                    else
                    {  nuevo->p_siguiente(aux->m_siguiente());
                       nuevo->p_anterior(aux);
                       aux->m_siguiente()->p_anterior(nuevo);
                       aux->p_siguiente(nuevo); }//fin else
           break;
           default: cout<<"La opcion es incorrecta\n";
        }//fin switch
      }while(t<0 || t>2);//fin do-while
  } //fin insertar entre elemento

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~eliminar
 void eliminar(tipo d)
 {
    nodo_doble* aux; bool encon=false;

          aux=primero;
          

    while(!encon)
     {
        if(d==aux->m_dato())
        {
          encon=true;
        }
           else
           {
            aux=aux->m_siguiente();
           }
     }
     if(encon)
     { 
      if(aux==primero)
          {  primero=aux->m_siguiente();  
              if(aux!=NULL)
               primero->p_anterior(NULL);
          }
          else
           { 
             if(aux->m_siguiente()!=NULL)
              {   aux->m_anterior()->p_siguiente(aux->m_siguiente());
                  aux->m_siguiente()->p_anterior(aux->m_anterior());
              }
              else
              {
                aux->m_anterior()->p_siguiente(NULL);  
              }            
            }
         delete aux; cout<<"Elemento eliminado\n";
         getch();
      }//fin if
 }//fin eliminar

 };//fin lista_d

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~main
  main(){
    lista_d uno;  int num=0, resp=0;  nodo_doble* encon;

   while(num != -1) {
              system("cls");
          cout<<"\n\n 1.  Insertar elementos.. \n";
          cout<<" 2.  Buscar elemento.. \n";
          cout<<" 3.  Insertar nuevo antes o despues de un elemento.. \n";
          cout<<" 4.  Eliminar elemento.. \n";
          cout<<" 5.  Mostrar lista.. \n";
          cout<<"\n\n          -1 para salir \n";
                  num=resp=0;  cin>>resp;
     switch(resp){
          case 1:
                  cout<<"Introduzca los elementos de la lista, -1 para terminar\n";
                  do{
                     cin>>num;  if(num!= -1) uno.insertar_p(num);
                  }while(num != -1);

         num=0; break;
          case 2:
                 cout<<" Indique elemento a buscar \n";
                  num=0; cin>>num; encon = uno.buscar(num);
                   if(encon != NULL)
                    cout<<"El elemento encontrado \n";
                     else
                       cout<<"El elemento no fue encontrado \n";  getch();
          break;
          case 3:
                do{ cout<<" Indique el elemento antes/despues del cual quiere insertar uno nuevo\n";
                    num=0; cin>>num; encon = uno.buscar(num); resp=0;
                    if(encon != NULL)
                    {cout<<" Indique el nuevo elemento a insertar \n";
                      num=0; cin>>num; uno.insertar_ee(encon, num);;
                     }else
                       {     resp= 1;     }
                 }while(resp == 1); getch();
          break;
          case 4:
                  cout<<" Indique elemento a eliminar\n";
                  cin>>num;
                  encon=uno.buscar(num);
                   if(encon != NULL)
                   {
                    cout<<"El elemento encontrado \n";
                    uno.eliminar(num);
                   }
                     else
                     {
                       cout<<"El elemento no fue encontrado \n";  getch();
                     }
                  
          break;
          case 5: uno.mostrar(); getch();     break;

          default:  cout<<"Opcion incorrecta\n";
     };//fin switch
   }//fin while
 }//fin main


0 comentarios:

Publicar un comentario