Advertisement
cotolonco

Listas Enlazadas Simples

Dec 6th, 2012
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5. struct numero{
  6.     int dato; //valor del numero
  7.     numero *sig; //nodo al q apunta
  8. };
  9.  
  10. typedef struct numero Numero;
  11.  
  12. int cantidad = 0;
  13.  
  14. //Es doble asterisco (puntero a puntero), ya que pasamos la lista por referencia ya que tambien es un puntero
  15. void ingresarNumero(Numero **); //puntero q recorrerá para insetar valor
  16. void ingresarNumeroInicio(Numero **);
  17. void ingresarNumeroPosicion(Numero **);
  18. void modificarDato(Numero **);
  19. void mostrarNumeros(Numero *); //mostrar valores
  20. void eliminarNumero(Numero **); //eliminar valor segun posición
  21. void borrarLista(Numero **);
  22.  
  23. int main()
  24. {
  25.     int opcion = 6;
  26.     Numero *lista = NULL; //primer elemento de la lista vacia
  27.     do{
  28.         system("CLS");
  29.         cout << "1.- Ingresar Dato al Final." << endl; cout << "2.- Ingresar Dato al Inicio." << endl;
  30.         cout << "3.- Ingresar Dato en Posicion." << endl; cout << "4.- Modificar Datos." << endl; cout << "5.- Mostrar Datos." << endl;
  31.         cout << "6.- Eliminar Dato." << endl; cout << "7.- Eliminar Lista." << endl; cout << "8.- Salir." << endl; cout << "--> ";
  32.         cin >> opcion; cout << endl;
  33.         switch(opcion){
  34.             case 1: ingresarNumero(&lista); break;
  35.             case 2: ingresarNumeroInicio(&lista); break;
  36.             case 3: ingresarNumeroPosicion(&lista); break;
  37.             case 4: modificarDato(&lista); break;
  38.             case 5: mostrarNumeros(lista); break;
  39.             case 6: eliminarNumero(&lista); break;
  40.             case 7: borrarLista(&lista); break;
  41.         }
  42.         system("pause");
  43.     }while(opcion!=8);
  44.     cout << endl << "Nos vemos!" << endl;
  45.     return 0;
  46. }
  47.  
  48. void ingresarNumero(Numero **primerNumero){
  49.     Numero *nuevoNumero = new Numero; //reservamos memoria
  50.     int nuevoDato; //el dato
  51.     mostrarNumeros(*primerNumero);
  52.     if (nuevoNumero == NULL){cout << "\n\nNo se pudo reservar Memoria. " << endl;}
  53.     else{
  54.         cout << "\n\nSi se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl;
  55.         cout << "Ingrese nuevo numero: "; cin >> nuevoDato;
  56.         nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato.
  57.         nuevoNumero->sig = NULL; //el siguiente es nulo
  58.        //Si la lista esta vacia:
  59.        if (*primerNumero == NULL) {*primerNumero = nuevoNumero; cantidad++;}
  60.        else{
  61.             //si no esta vacia
  62.             Numero *ptr = *primerNumero;
  63.             while(ptr->sig != NULL) ptr = ptr->sig; // avanza al siguiente nodo
  64.             // el nodo encontrado es no vacio pero el siguiente es nulo.
  65.             ptr->sig = nuevoNumero; //el nodo sgte nulo toma la direccion de nuevo numero
  66.             cantidad++; //aumenta uno en cantidad
  67.        }
  68.        mostrarNumeros(*primerNumero);
  69.     }
  70. }
  71.  
  72. void ingresarNumeroInicio(Numero **primerNumero){
  73.     Numero *nuevoNumero = new Numero; //reservamos memoria
  74.     int nuevoDato; //el dato
  75.     mostrarNumeros(*primerNumero);
  76.     if (nuevoNumero == NULL){cout << "\n\nNo se pudo reservar Memoria. " << endl;}
  77.     else{
  78.         cout << "\n\nSi se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl;
  79.         cout << "Ingrese nuevo numero: "; cin >> nuevoDato;
  80.         nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato.
  81.        //Si la lista esta vacia:
  82.        if (*primerNumero == NULL) {nuevoNumero->sig = NULL; *primerNumero = nuevoNumero; cantidad++;}
  83.        else{
  84.             //si no esta vacia
  85.             nuevoNumero->sig = *primerNumero; //el siguiente nodo del nuevo numero sera el primer nodo
  86.             *primerNumero = nuevoNumero; //El primer nodo sera nuevo Numero
  87.             cantidad++; //aumenta uno en cantidad
  88.        }
  89.        mostrarNumeros(*primerNumero);
  90.     }
  91. }
  92.  
  93. void ingresarNumeroPosicion(Numero **primerNumero){
  94.     Numero *nuevoNumero = new Numero; //reservamos memoria
  95.     int nuevoDato; //el dato
  96.     mostrarNumeros(*primerNumero);
  97.     if (nuevoNumero == NULL){cout << "\n\nNo se pudo reservar Memoria. " << endl;}
  98.     else{
  99.         int posicion = 1;
  100.         cout << "\n\nSi se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl;
  101.         cout << "Ingrese Posicion: "; cin >> posicion;
  102.         cout << "Ingrese nuevo numero: "; cin >> nuevoDato;
  103.         nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato.
  104.         nuevoNumero->sig = NULL;
  105.         //Si esta fuera del rango
  106.         if (posicion <= 1 || posicion >= cantidad) {cout << "\n\aPosicion Erronea\n\n"; return;}
  107.         Numero *auxiliar, *anterior, *siguiente;
  108.         auxiliar = *primerNumero;
  109.         int contador = 1;
  110.         //mientras contador sea distinto a la posicion anterior
  111.         while(contador != (posicion-1)) {auxiliar = auxiliar->sig; contador++;} //avanza un nodo
  112.         //Ya que tenemos el nodo anterior de la posicion donde se añade
  113.         anterior = auxiliar; //anterior sera el nodo anterior
  114.         siguiente = auxiliar->sig; //siguiente sera el nodo siguiente
  115.         anterior->sig = nuevoNumero; //El nodo que le sigue al anterior sera nuevo numero
  116.         nuevoNumero->sig = siguiente; //El nodo que sigue de nuevo numero sera el siguiente
  117.         cantidad++; //aumenta uno en cantidad
  118.         mostrarNumeros(*primerNumero);
  119.     }
  120. }
  121.  
  122. void modificarDato(Numero **primerNumero){
  123.     int nuevoDato; //el dato
  124.     int posicion = 1;
  125.     mostrarNumeros(*primerNumero);
  126.     cout << "Ingrese Posicion: "; cin >> posicion;
  127.     cout << "Ingrese nuevo numero: "; cin >> nuevoDato;
  128.     //Si esta fuera del rango
  129.     if (posicion < 1 || posicion > cantidad) {cout << "\n\aPosicion Erronea\n\n"; return;}
  130.     Numero *auxiliar;
  131.     auxiliar = *primerNumero;
  132.     int contador = 1;
  133.     //mientras contador sea distinto a la posicion
  134.     while(contador != posicion) {auxiliar = auxiliar->sig; contador++;} //avanza un nodo
  135.     //Una vez encontrado el nodo de la posicion indicada
  136.     auxiliar->dato = nuevoDato; //cambiamos el valor
  137.     mostrarNumeros(*primerNumero);
  138. }
  139.  
  140. void mostrarNumeros(Numero *ptr){
  141.     if (ptr == NULL) cout << "\nLa Lista esta Vacia." << endl << endl;
  142.     else {
  143.         cout << endl << endl;
  144.         while(ptr!=NULL){
  145.             //mientras el nodo no sea nulo muestra el dato del nodo actual.
  146.             cout << ptr->dato << " ";
  147.             ptr = ptr->sig; // avanza al sgte nodo
  148.         }
  149.         cout << endl << endl;
  150.     }
  151. }
  152.  
  153. void eliminarNumero(Numero **primerNumero){
  154.     mostrarNumeros(*primerNumero);
  155.     cout << "cantidad: " << cantidad << endl << endl;
  156.     int posicion;
  157.     cout << "Ingrese posicion a borrar: "; cin >> posicion;
  158.     if (posicion < 1 || posicion > cantidad) {cout << "\n\aPosicion Erronea\n\n"; return;}
  159.     else{
  160.         Numero *aBorrar, *anterior, *siguiente; //nodo a borrar, nodo anterior y nodo siguiente
  161.         aBorrar = *primerNumero; //le asignamos el primer nodo
  162.         //Si es el primer nodo (posicion = 1)
  163.         if (posicion == 1){
  164.             *primerNumero = (*primerNumero)->sig; //el primer nodo ahora será el sgte
  165.             delete (aBorrar); //borramos el nodo
  166.         }
  167.         //si es el último nodo
  168.         else if (posicion == cantidad){
  169.             // si el nodo siguiente que le sigue no es nulo, significa q no es el penultimo y avanza un nodo
  170.             while((aBorrar->sig)->sig!=NULL) aBorrar = aBorrar->sig;
  171.             //Ahora q aBorrar es el penultimo nodo
  172.             anterior = aBorrar; //le asignamos el penultimo nodo
  173.             aBorrar = aBorrar->sig; //aBorrar sera el ultimo nodo
  174.             anterior->sig = NULL; //dejamos nulo el nodo q sigue del penultimo nodo
  175.             delete (aBorrar); //borramos el ultimo nodo
  176.         }
  177.         //Pero si está en medio:
  178.         else{
  179.             int contador = 1;
  180.             //Mientras contador sea distinto a la posición anterior del nodo a borrar
  181.             while(contador != (posicion-1)){
  182.                 aBorrar = aBorrar->sig; //avanza un nodo
  183.                 contador ++; //Avanza uno en contador
  184.             }
  185.             //Ahora q aBorrar es el nodo anterior al que hay que borrar
  186.             anterior = aBorrar; //anterior es el nodo anterior.
  187.             aBorrar = aBorrar->sig; //aBorrar sera el nodo a Borrar
  188.             siguiente = aBorrar->sig; //siguiente sera el nodo siguiente del que hay que borrar
  189.             anterior->sig = siguiente; //El nodo que sigue del anterior ahora sera siguiente
  190.             delete (aBorrar); //borramos el nodo en la posicion indicada
  191.         }
  192.         cantidad--; //pierde 1 en cantidad
  193.         mostrarNumeros(*primerNumero);
  194.     }
  195. }
  196.  
  197. void borrarLista(Numero **primerNumero){
  198.     Numero *auxiliar, *aBorrar;
  199.     auxiliar = *primerNumero;
  200.     mostrarNumeros(*primerNumero);
  201.     //Si la lista no esta vacia
  202.     while(*primerNumero !=NULL){
  203.         aBorrar = auxiliar; //aBorrar sera el nodo a borrar
  204.         auxiliar = auxiliar->sig; //avanzamos un nodo
  205.         *primerNumero = auxiliar; //el primer nodo sera el siguiente
  206.         delete (aBorrar); //Borramos el nodo
  207.     }
  208.     cout << "\n\aLista Borrada.\n";
  209.     mostrarNumeros(*primerNumero);
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement