Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: pitka en 18 Mayo 2012, 22:09 pm



Título: Cargar una lista [SOLUCIONADO]
Publicado por: pitka en 18 Mayo 2012, 22:09 pm
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
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct nodo
  5.    {
  6.        string nombre;
  7.        int edad;
  8.        nodo *siguiente;      
  9.    };
  10.  
  11. int main(void)
  12. {
  13.  
  14. nodo *persona;
  15. char resp;
  16.  
  17.  
  18. do
  19. {
  20.      persona = new nodo;
  21.      cout<<"introduzca el nombre: ";
  22.      cin>>persona->nombre;
  23.      cout<<"introduzca la edad: ";
  24.      cin>>persona->edad;
  25.      cout<<"Salir? S/N ";
  26.      cin>>resp;
  27. }while(resp!='s');
  28.  
  29. p = persona;
  30.  
  31. while (p->siguiente != NULL)
  32. {
  33.      cout<<p->nombre<<endl;
  34.      cout<<p->edad<<endl;
  35.      p=p->siguiente;  
  36. }
  37.  
  38. system("pause");
  39.  
  40. }


Título: Re: Cargar una lista (ayuda)
Publicado por: Aberroncho en 19 Mayo 2012, 23:13 pm


Código
  1. do
  2. {
  3.      persona = new nodo;
  4.      cout<<"introduzca el nombre: ";
  5.      cin>>persona->nombre;
  6.      cout<<"introduzca la edad: ";
  7.      cin>>persona->edad;
  8.      cout<<"Salir? S/N ";
  9.      cin>>resp;
  10. }while(resp!='s');
  11.  

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
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct nodo
  5. {
  6.    string nombre;
  7.    int edad;
  8.    nodo *siguiente;      
  9. };
  10.  
  11. int main(void)
  12. {
  13.    nodo     * pInicioLst = NULL;
  14.    nodo     * pFinLst    = NULL;
  15.    char       resp       = 'N' ;
  16.  
  17.  
  18.    do
  19.    {
  20.    if ( pInicioLst == NULL ) /* Primera vez. No hay ningún nodo en la lista */
  21. {
  22. pFinLst = pInicioLst = new nodo;
  23. pFinLst->siguiente = NULL; /* Indica que es el último nodo de la lista */
  24. }
  25. else /* No es la primera pasada. NO TOCAMOS EL PUNTERO AL PRIMER NODO */
  26. {
  27. pFinLst->siguiente = new nodo; /* Nuevo nodo apuntado por el último nodo de la lista */
  28. pFinLst = pFinLst->siguiente; /* Avanzamos el puntero al último nodo de la lista */
  29. pFinLst->siguiente = NULL;
  30.        }
  31.  
  32.        cout<<"introduzca el nombre: ";
  33.        cin>>persona->nombre;
  34.        cout<<"introduzca la edad: ";
  35.        cin>>persona->edad;
  36.        cout<<"Salir? S/N ";
  37.        cin>>resp;
  38.    }while(resp!='s');
  39.  
  40. p = pInicioLst; /* Apuntamos "p" al primer nodo para recorrer la lista */
  41.  


Título: Re: Cargar una lista (ayuda)
Publicado por: pitka en 20 Mayo 2012, 18:25 pm
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


Título: Re: Cargar una lista (ayuda)
Publicado por: 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:
  • cout (http://c.conclase.net/curso/?cap=904e)
  • cin (http://c.conclase.net/curso/?cap=904f)


Título: Re: Cargar una lista (ayuda)
Publicado por: pitka en 20 Mayo 2012, 19:01 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:
  • cout (http://c.conclase.net/curso/?cap=904e)
  • cin (http://c.conclase.net/curso/?cap=904f)
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]