Lista ligada simple en CPP

Una parte importante en la formación como programmer es conocer las estructuras de datos, listas enlazadas, pilas, colas, arboles, grafos, tablas hash, etc. Se puede considerar la lista enlazada como la estructura basica, se trata simplemente de una lista de nodos enlazados uno tras otro, cada nodo guarda uno o más datos, al insertar un nodo este se agrega al final de la lista, para buscar uno nodo se debe recorrer la lista nodo por nodo desde el inicio hasta encontrar el dato buscado o hasta el final si no se encuentra.

Digamos algo así.





Una lista se puede utilizar para guardar una colección de datos, para implementar una pila o una cola. La siguiente lista la programe en CPP como una clase, esto con la idea de que pueda ser reusable para otras aplicaciones o programas en CPP y bajo el concepto de POO [Programación Orientada a Objetos]

Cada nodo puede guardar un entero como dato, la clase tiene las operaciones para agregar, buscar o eliminar un nodo, tambien la función para mostrar la lista en pantalla. Captura de ejecución del programa, modo consola:

Código fuente del programa:
/*  compilador borland c++ 5.02 noviembre 2007 */
#include <iostream.h>

class listaSimple{
 private:
  struct nodo{
    int val;
    struct nodo *siguiente;
  };
  nodo lista;
  nodo *indice;
 public:
  listaSimple();
  void agregar(int n);
  int buscar(int n);
  int eliminar(int n);
  void listar();
  void vaciar();
};

listaSimple::listaSimple(){
  lista.val=NULL;
  lista.siguiente=NULL;
  indice=NULL;
}

void listaSimple::agregar(int n){
 nodo *nuevo;
 nuevo = new nodo;
 nuevo->val=n;
 nuevo->siguiente=NULL;
 if(!lista.val){
   lista=(*nuevo);
   return;
 }
 indice=&lista;
 while(indice->siguiente) indice=indice->siguiente;
 indice->siguiente=nuevo;
}

int listaSimple::buscar(int n){
 indice=&lista;
 while(indice->val){
   if(indice->val==n) return n;
   else{
     if(indice->siguiente) indice=indice->siguiente;
     else return NULL;
   }
 }
 return NULL;
}

void listaSimple::listar(){
 indice=&lista;
 if(!indice->val){
   cout << "\n  La lista esta vacia  \n\n";
   return;
 }
 while(indice->val){
   cout << "\n Valor: " << indice->val;
   if(indice->siguiente) indice=indice->siguiente;
   else return;
 };
}

int listaSimple::eliminar(int n){
 nodo *temp;
 indice=&lista;
 temp=NULL;
 while(indice->val){
   if(indice->val==n){
     if(!temp){
       if(lista.siguiente){
         indice=lista.siguiente;
         lista.val=indice->val;
         lista.siguiente=indice->siguiente;
       }
       else{
         lista.val=NULL;
         lista.siguiente=NULL;
         return 1;
       }
     }
     else{
       if(indice->siguiente){
         temp->siguiente=indice->siguiente;
       }
       else temp->siguiente=NULL;
     }
     delete indice;
     return 1;
   }
   else{
     if(indice->siguiente){
       temp=indice;
       indice=indice->siguiente;
     }
     else return 0;
   }
 };
 return 0;
}

void listaSimple::vaciar(){
 while(lista.val) eliminar(lista.val);
}

void main(){
  listaSimple lst;
  int opcion, val;
  do{
    cout << "Elige una opcion\n" << " 1-.Agregar dato a la lista\n";
    cout << " 2-.Buscar dato en la lista\n" << " 3-.Mostrar contenido de lista";
    cout << "\n 4-.Eliminar un elemento \n 5-.Salir \n >> "; cin >> opcion;
    if(opcion==1){
      cout << "\n\n Ingresa el valor entero a ingresar: "; cin >> val;
      lst.agregar(val); cout << "\n\n El valor ha sido ingresado \n\n";
    }
    else if(opcion==2){
      cout << "\n\n Ingresa el valor entero a buscar: "; cin >> val;
      if(lst.buscar(val)!=NULL) cout << " El elemento existe\n\n";
      else cout << " El elemento no existe\n\n";
    }
    else if(opcion==3){
      lst.listar(); cout << "\n\n";
    }
    else if(opcion==4){
      cout << "\n\n Ingresa valor a eliminar: "; cin >> val;
      if(lst.eliminar(val)) cout << "  Se elimino la primera coincidencia\n\n";
      else cout << "  No hubo coincidencia no se elimino nada\n\n";
    }
  }while(opcion!=5);
  lst.vaciar();
}

Comentarios

Entradas populares