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 */