Hola:
Si no me equivoco, el motivo por el que no funciona lo que dices es porque estás intentando crear un objeto estático y usarlo. Pero los objetos dentro de la función, como cualquier otra variable, mueren cuando se sale de la función.
Parece que lo intentas arreglar declarando el objeto estático de forma dinámica, con new. No sé si esto compila, pero sigue sin ser un método correcto. El método correcto, es, efectivamente, que el puntero que se crea en la función haga la reserva de memoria y entonces sí existirá esa zona de memoria una vez salgas de la función. De la otra forma, si es que compila, te dará un error de segmentación o algo así.
Veamos:
Código C++:
Ver originalvoid insertar(lista *p,int n){//suponiendo que p apunta al ultimo elemento de la lista
lista nuevo;
nuevo.info=n;
nuevo.sig=Null;
p->sig=nuevo;
p=nuevo;
}
Primero la función insertar() crea el objeto nuevo. En este paso se hace la reserva de memoria pero como un objeto local a la función.
Luego se le hacen las asigaciones a nuevo.info y a nuevo.sig.
Y por último le das a p la dirección de nuevo.
Pero cuando salgas de la función, el objeto nuevo desaparece, y p apuntará a un sitio no válido.
Otra cosa es si haces:
Aunque el puntero desaparece, la reserva de memoria permanece, y si antes de que desaparezca el puntero has enlazado el último elemento de la lista a ese nuevo elemento, la cosa debería de funcionar.
(Otra cosa es que la función insertar() maneja un puntero del tipo lista, lo que no podrás usar para dirigirlo a un objeto del tipo Lista)
No sé si realmente he contestado tu duda. Pero seguro que alguien habrá que te pueda ayudar mejor que yo.
Saludos !