lunes, 26 de noviembre de 2012

Lista circular C++. Agregar, Eliminar, Mostar

Wikipedia define las listas como "una de las estructuras de datos fundamentales, y puede ser usada para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los que se guardan campos de datos arbitrarios y una o dos referencias, enlaces o punteros al nodo anterior o posterior."

Hoy veremos una lista circular, que es una lista donde cada elemento de la lista tendra un nodo siguiente y un nodo anterior.

En el codigo que veremos a continuacion tenemos un menu un poco rudimientario donde se muestran los metodos:

  • Crear Lista / Agregar un Nodo a la lista.
  • Mostrar Lista.
  • Eliminar un Nodo
  • Eliminar toda la lista

Aqui les dejo el codigo:



#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
typedef char tipo;

class nodo_c {
    tipo dato;
    nodo_c *enlace;

    public:
   nodo_c() {dato=NULL; enlace=NULL;}
   nodo_c(tipo e){ dato=e; enlace=this; /*se apunta a sí mismo */  }
   tipo m_dato(){ return dato; }
   nodo_c* m_enlace(){ return enlace; }
   void p_enlace(nodo_c * e){  enlace=e; }
};

class lista_c{
 nodo_c* lc;

 public:
 lista_c(){ lc=NULL; }

void insertar(tipo d){ nodo_c* nuevo; nuevo=new nodo_c(d);

        if(lc!=NULL)
        {  nuevo->p_enlace(lc->m_enlace());
           lc->p_enlace(nuevo);        
         }

      lc=nuevo;
 }

void eliminar(tipo d){ nodo_c *aux; bool encon=false; aux=lc;

     while( aux->m_enlace()!=lc && !encon )
     {        if(aux->m_enlace()->m_dato() == d )
                      encon=true;
                else
                   aux= aux->m_enlace();   }//fin while

    if(encon)
    {    nodo_c*aux2;  aux2=aux->m_enlace(); // nodo a elminar

        if(lc==lc->m_enlace()) // si tiene un solo nodo
                   lc=NULL;
          else
          {  if(aux2==lc) lc=aux;

              aux->p_enlace(aux2->m_enlace()); }

         delete aux2;}//fin if

}//fin eliminar

 int verificar()
  { nodo_c* aux, *auxx;

       if(lc==NULL)
       {
        return 0;            
       }
       else
       {
        return 1;    
       }

}//fin mostrar

  void mostrar()
  { nodo_c* aux, *auxx;

       if(lc==NULL)
           cout<<" La lista esta vacia\n";
           else
           {     auxx=lc->m_enlace(); aux=lc->m_enlace();
                 cout<<" Lista: { " /*<<lc->m_dato()*/;
               do
                { cout<<aux->m_dato()/*<<"  ,"*/;
                     aux=aux->m_enlace();
                     
                   }while(aux!=auxx); //while
                   cout<<" \b"<<" }"; 
           }//fin else
}//fin mostrar

  void  eliminar_todo() { tipo e; nodo_c *aux; aux=lc;


       while(aux!=NULL)
        {    e=aux->m_dato();
             eliminar(e);
             aux->m_enlace(); }

     if(aux==NULL) cout<<" Lista vacia \n";   lc=NULL;

 }

};

 int main()
 {
  lista_c letra;
  tipo l=NULL;
  int opc;
 do{   system("cls");
 
  cout<<"MENU"<<endl;
  if(letra.verificar()==0)
  {
  cout<<"1. Crear lista"<<endl;
  }
  else
  {
   cout<<"1. Agregar Nodo a la lista"<<endl;   
  }
  cout<<"2. Mostrar la lista"<<endl;
  cout<<"3. Eliminar un dato"<<endl;
  cout<<"4. Eliminar la lista completa y Salir"<<endl;
  cin>>opc;

  switch(opc)
  {
   case 1: cout<<"Ingrese una letra: "<<endl;
           cin>>l;
           letra.insertar(l);
           break;


   case 2: letra.mostrar();
            system("pause");
            break;

   case 3:  cout<<"Ingrese elemento a eliminar: "<<endl;
           cin>>l;
           letra.eliminar(l);
           break;

  case 4: letra.eliminar_todo();
     letra.mostrar();
       break;

  default: cout<<"Opcion invalida"<<endl;   };
 }while(opc < 5);
   getch();
}

1 comentario: