Cargar una lista [SOLUCIONADO]

Iniciado por pitka, 18 Mayo 2012, 22:09 PM

0 Miembros y 1 Visitante están viendo este tema.

pitka

Hola apenas estoy empezando con punteros y listas, quiero hacer un programa que vaya leyendo por teclado nombre y edad de una persona y lo vaya almacenando en a lista(sin conocer la cantidad de personas que vayan a ser registradas) y luego mostrar todas esas personas, pero estoy atascado,  me han dicho que tengo que usar un puntero auxiliar que guarde el primer valor o algo así pero de verdad me gustaría entender el porque.

gracias de antemano, aquí dejo lo que llevo

Saludos

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

struct nodo
   {
       string nombre;
       int edad;
       nodo *siguiente;      
   };

int main(void)
{

nodo *persona;
char resp;


do
{
     persona = new nodo;
     cout<<"introduzca el nombre: ";
     cin>>persona->nombre;
     cout<<"introduzca la edad: ";
     cin>>persona->edad;
     cout<<"Salir? S/N ";
     cin>>resp;
}while(resp!='s');

p = persona;

while (p->siguiente != NULL)
{
     cout<<p->nombre<<endl;
     cout<<p->edad<<endl;
     p=p->siguiente;  
}

system("pause");

}

Aberroncho



Código (cpp) [Seleccionar]

do
{
      persona = new nodo;
      cout<<"introduzca el nombre: ";
      cin>>persona->nombre;
      cout<<"introduzca la edad: ";
      cin>>persona->edad;
      cout<<"Salir? S/N ";
      cin>>resp;
}while(resp!='s');


El problema que veo es que en cada iteración del bucle reservas un nuevo nodo y guardas su dirección en el puntero "persona" con lo que pierdes la referencia al primer nodo de tu lista y tu puntero "persona" solo apunta al último elemento.

Además, tampoco estás enlazando los nodos. Cada uno de tus nodos tiene un puntero llamado "siguiente". Ese puntero deberías inicializarlo a null cuando creas el nodo y darle el valor del siguiente nodo de la lista cada vez que añadas un nuevo nodo por detrás de él.

Yo haría algo así:

Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;

struct nodo
{
    string nombre;
    int edad;
    nodo *siguiente;     
};

int main(void)
{
    nodo     * pInicioLst = NULL;
    nodo     * pFinLst    = NULL;
    char       resp       = 'N' ;


    do
    {
    if ( pInicioLst == NULL ) /* Primera vez. No hay ningún nodo en la lista */
{
pFinLst = pInicioLst = new nodo;
pFinLst->siguiente = NULL; /* Indica que es el último nodo de la lista */
}
else /* No es la primera pasada. NO TOCAMOS EL PUNTERO AL PRIMER NODO */
{
pFinLst->siguiente = new nodo; /* Nuevo nodo apuntado por el último nodo de la lista */
pFinLst = pFinLst->siguiente; /* Avanzamos el puntero al último nodo de la lista */
pFinLst->siguiente = NULL;
        }

        cout<<"introduzca el nombre: ";
        cin>>persona->nombre;
        cout<<"introduzca la edad: ";
        cin>>persona->edad;
        cout<<"Salir? S/N ";
        cin>>resp;
    }while(resp!='s');

p = pInicioLst; /* Apuntamos "p" al primer nodo para recorrer la lista */
"La ignorancia es la noche de la mente, pero una noche sin Luna ni estrellas."
(Confucio)

pitka

#2
muchísimas gracias me ayudo mucho  :D  ;-) y la explicación excelente al final lo deje así y funciona bien, toda critica sera bien recibida, muchas gracias nuevamente.

ahora una pregunta que no viene tanto con el tema, es posible validar que solo se escriban números o que solo acepte números en donde pido la edad y letras en donde pido el nombre?

Saludos

Aberroncho

Espero que además de dejarlo así hayas entendido porqué es así. Ese era el objetivo ;)

En cuanto a los formatos para la entrada de datos:
"La ignorancia es la noche de la mente, pero una noche sin Luna ni estrellas."
(Confucio)

pitka

Cita de: Aberroncho en 20 Mayo 2012, 18:45 PM
Espero que además de dejarlo así hayas entendido porqué es así. Ese era el objetivo ;)

En cuanto a los formatos para la entrada de datos:
si de verdad muchísimas gracias lo he entendido perfectamente, lo de los enlaces y la explicación excelente como dije!! cualquier duda estaré molestando nuevamente por aca  :rolleyes: jaja

De nuevo gracias, así provoca aprender![/list]