• Martes 16 de Abril de 2024, 23:49

Autor Tema:  Lista enlazada simple (Insertar al Final)  (Leído 8283 veces)

cotolon

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Lista enlazada simple (Insertar al Final)
« en: Jueves 6 de Diciembre de 2012, 01:45 »
0
Hola buenas noches, necesito ayuda con un código de prueba que hago sobre listas enlazadas. Primero que nada tengo duda con el tema de los punteros, ya que no veo exactamente por qué sucede. Este es el código que funciona:

Código: C++
  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. void ingresarNumero(Numero **); //puntero q recorrerá para insetar valor
  13. void mostrarNumeros(Numero *); //mostrar valores
  14. void eliminarNumero(Numero *); //eliminar valor segun posición
  15.  
  16. int main()
  17. {
  18.     int opcion = 4;
  19.     Numero *lista = NULL; //primer elemento de la lista vacia
  20.     do{
  21.         system("CLS");
  22.         cout << "1.- Ingresar Dato." << endl; cout << "2.- Mostrar Datos." << endl;
  23.         cout << "3.- Eliminar Dato." << endl; cout << "4.- Salir." << endl; cout << "--> ";
  24.         cin >> opcion; cout << endl;
  25.         switch(opcion){
  26.             case 1: ingresarNumero(&lista); break;
  27.             case 2: mostrarNumeros(lista); break;
  28.             case 3: eliminarNumero(lista); break;
  29.         }
  30.     }while(opcion!=4);
  31.     cout << "Nos vemos!" << endl;
  32.     return 0;
  33. }
  34.  
  35. void ingresarNumero(Numero **primerNumero){
  36.     Numero *nuevoNumero = new Numero; //reservamos memoria
  37.     int nuevoDato; //el dato
  38.     if (nuevoNumero == NULL){cout << "No se pudo reservar Memoria. " << endl;}
  39.     else{
  40.         cout << "Si se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl;
  41.         cout << "Ingrese nuevo numero: "; cin >> nuevoDato;
  42.         nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato.
  43.         nuevoNumero->sig = NULL; //el siguiente es nulo
  44.        //Si la lista esta vacia:
  45.        if (*primerNumero == NULL) {*primerNumero = nuevoNumero;}
  46.        else{
  47.             //si no esta vacia
  48.             Numero *ptr = *primerNumero;
  49.             while(ptr->sig != NULL) ptr = ptr->sig; // avanza al siguiente nodo
  50.             // el nodo encontrado es no vacio pero el siguiente es nulo.
  51.             ptr->sig = nuevoNumero; //el nodo sgte nulo toma la direccion de nuevo numero
  52.        }
  53.     }
  54.     cout << endl;
  55.     system("pause");
  56. }
  57.  
  58. void mostrarNumeros(Numero *ptr){
  59.     if (ptr == NULL) cout << "La Lista esta Vacia." << endl << endl;
  60.     else {
  61.         while(ptr!=NULL){
  62.             //mientras el nodo sgte no sea nulo muestra el dato del nodo actual.
  63.             cout << ptr->dato << " ";
  64.             ptr = ptr->sig; // avanza al sgte nodo
  65.         }
  66.         cout << endl << endl;
  67.     }
  68.     system("pause");
  69. }
  70.  
  71. void eliminarNumero(Numero *ptr){
  72.  
  73. }
  74.  
  75.  

Bueno el tema es que el código de arriba es la solución, y la función ingresar número posee un parámetro de "puntero a un puntero" (**primerNumero), y exactamente no sé como arregla el problema, por el tema de las direcciones, ya que yo tenía este código (pondré solo la función) que realmente no funcionaba, porque cada vez que quería mostrar me salia "Lista vacia" y no se si realmente los números se añadían o no. Espero me puedan explicar cuales son las diferencias, gracias. Aquí el código de la función que tenía yo:

Código: C++
  1. void ingresarNumero(Numero *ptr){
  2.     Numero *nuevoNumero = new Numero; //reservamos memoria
  3.     int nuevoDato; //el dato
  4.     if (nuevoNumero == NULL){cout << "No se pudo reservar Memoria. " << endl;}
  5.     else{
  6.         cout << "Si se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl;
  7.         cout << "Ingrese nuevo numero: "; cin >> nuevoDato;
  8.         nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato.
  9.         nuevoNumero->sig = NULL; //el siguiente es nulo
  10.        //Si la lista esta vacia:
  11.        if (ptr == NULL) {ptr = nuevoNumero;}
  12.        else{
  13.             //si no esta vacia
  14.             while(ptr->sig != NULL) ptr = ptr->sig; // avanza al siguiente nodo
  15.             // el nodo encontrado es no vacio pero el siguiente es nulo.
  16.             ptr->sig = nuevoNumero; //el nodo sgte nulo toma la direccion de nuevo numero
  17.        }
  18.     }
  19.     cout << endl;
  20.     system("pause");
  21. }
  22.  


Gracias a todos por pasar!
« última modificación: Jueves 6 de Diciembre de 2012, 01:48 por cotolon »

cotolon

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re:Lista enlazada simple (Insertar al Final)
« Respuesta #1 en: Jueves 6 de Diciembre de 2012, 16:34 »
0
Disculpen el doble post.

Al final era porque estoy pasando lista por referencia, ya que declarar "**" estoy diciendo de un puntero a un puntero, pero como lista es un puntero a un nodo, entonces debe ser pasado por referencia, para que **primerNumero pueda apuntarlo correctamente.

P.D: Simplemente colocar *primerNumero, sería un puntero a un nodo y no a otro puntero.

Por favor corríjanme si estoy mal :S

Aquí dejo el código completo con varias cosas, según mi compilador funciona, pero espero que "teóricamente" también, es decir si no queda ningún nodo "volando" por ahí.

http://pastebin.com/1v25KeV2

Es largo el código (200 líneas) por eso lo dejo por pastebin.
« última modificación: Jueves 6 de Diciembre de 2012, 18:16 por cotolon »

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Lista enlazada simple (Insertar al Final)
« Respuesta #2 en: Jueves 6 de Diciembre de 2012, 18:56 »
0
Disculpen el doble post.

Al final era porque estoy pasando lista por referencia, ya que declarar "**" estoy diciendo de un puntero a un puntero, pero como lista es un puntero a un nodo, entonces debe ser pasado por referencia, para que **primerNumero pueda apuntarlo correctamente.

P.D: Simplemente colocar *primerNumero, sería un puntero a un nodo y no a otro puntero.

Por favor corríjanme si estoy mal :S

Es correcto

Citar
Aquí dejo el código completo con varias cosas, según mi compilador funciona, pero espero que "teóricamente" también, es decir si no queda ningún nodo "volando" por ahí.

Recomiendo que uses el depurador (debugger) de tu compilador ejecuta el codigo linea por linea e inspecciona tus variables, si no sabes usarlo, recomiendo que investigues como se hace (en realidad los depuradores son muy faciles de usar), de esa forma podras averiguar si queda algun nodo volando por ahi :)

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

cotolon

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re:Lista enlazada simple (Insertar al Final)
« Respuesta #3 en: Jueves 6 de Diciembre de 2012, 19:37 »
0
Me ha servido gracias :P

lo probé y si la lista me quedo como (Numero*) 0x0, ya que es nula. Gracias