Programación General > C/C++

 Lista enlazada simple (Insertar al Final)

(1/1)

cotolon:
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++ ---#include <iostream>#include <cstdlib>using namespace std; struct numero{    int dato; //valor del numero    numero *sig; //nodo al q apunta}; typedef struct numero Numero; void ingresarNumero(Numero **); //puntero q recorrerá para insetar valorvoid mostrarNumeros(Numero *); //mostrar valoresvoid eliminarNumero(Numero *); //eliminar valor segun posición int main(){    int opcion = 4;    Numero *lista = NULL; //primer elemento de la lista vacia    do{        system("CLS");        cout << "1.- Ingresar Dato." << endl; cout << "2.- Mostrar Datos." << endl;        cout << "3.- Eliminar Dato." << endl; cout << "4.- Salir." << endl; cout << "--> ";        cin >> opcion; cout << endl;        switch(opcion){            case 1: ingresarNumero(&lista); break;            case 2: mostrarNumeros(lista); break;            case 3: eliminarNumero(lista); break;        }    }while(opcion!=4);    cout << "Nos vemos!" << endl;    return 0;} void ingresarNumero(Numero **primerNumero){    Numero *nuevoNumero = new Numero; //reservamos memoria    int nuevoDato; //el dato    if (nuevoNumero == NULL){cout << "No se pudo reservar Memoria. " << endl;}    else{        cout << "Si se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl;        cout << "Ingrese nuevo numero: "; cin >> nuevoDato;        nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato.        nuevoNumero->sig = NULL; //el siguiente es nulo       //Si la lista esta vacia:       if (*primerNumero == NULL) {*primerNumero = nuevoNumero;}       else{            //si no esta vacia            Numero *ptr = *primerNumero;            while(ptr->sig != NULL) ptr = ptr->sig; // avanza al siguiente nodo            // el nodo encontrado es no vacio pero el siguiente es nulo.            ptr->sig = nuevoNumero; //el nodo sgte nulo toma la direccion de nuevo numero       }    }    cout << endl;    system("pause");} void mostrarNumeros(Numero *ptr){    if (ptr == NULL) cout << "La Lista esta Vacia." << endl << endl;    else {        while(ptr!=NULL){            //mientras el nodo sgte no sea nulo muestra el dato del nodo actual.            cout << ptr->dato << " ";            ptr = ptr->sig; // avanza al sgte nodo        }        cout << endl << endl;    }    system("pause");} void eliminarNumero(Numero *ptr){ }  
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++ ---void ingresarNumero(Numero *ptr){    Numero *nuevoNumero = new Numero; //reservamos memoria    int nuevoDato; //el dato    if (nuevoNumero == NULL){cout << "No se pudo reservar Memoria. " << endl;}    else{        cout << "Si se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl;        cout << "Ingrese nuevo numero: "; cin >> nuevoDato;        nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato.        nuevoNumero->sig = NULL; //el siguiente es nulo       //Si la lista esta vacia:       if (ptr == NULL) {ptr = nuevoNumero;}       else{            //si no esta vacia            while(ptr->sig != NULL) ptr = ptr->sig; // avanza al siguiente nodo            // el nodo encontrado es no vacio pero el siguiente es nulo.            ptr->sig = nuevoNumero; //el nodo sgte nulo toma la direccion de nuevo numero       }    }    cout << endl;    system("pause");} 

Gracias a todos por pasar!

cotolon:
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.

ProfesorX:

--- Cita de: cotolon en Jueves  6 de Diciembre de 2012, 16:34 ---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

--- Fin de la cita ---

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í.

--- Fin de la cita ---

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 :)

cotolon:
Me ha servido gracias :P

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

Navegación

[0] Índice de Mensajes

Ir a la versión completa