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
#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");
}
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í:
#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 */
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
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)
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:
- 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]