A me cosi' funziona benissimo:
codice:
struct lista{ 
int n; 
lista* pt;
lista(int a, lista *b)
{ n=a; pt=b; }           //Costruttori
lista() {} };

void inserisci_in_lista(lista*&,int);
void stampa(lista *);

main()
{
  lista* first=0;
  int x;
  char risposta;
  do{
      cout<<"Inserisci un valore da inserire nella lista : ";
      cin>>x;
      inserisci_in_lista(first,x);
      cout<<"\nVuoi continuare l'inserimento di valori nella lista? (s/n) : ";
      cin>>risposta;
  }while(risposta=='s');
  stampa(first);
}

void inserisci_in_lista(lista*& lx, int val)
{
  if(!lx)
    lx=new lista(val,0);
  else
    inserisci_in_lista(lx->pt,val);
}

void stampa(lista *lx)
{
  if(lx)
  {
    cout<<lx->n<<' ';
    stampa(lx->pt);
  }
}
Questo pezzo:
codice:
struct lista{ 
int n; 
lista* pt;
lista(int a, lista *b)
{ n=a; pt=b; }
lista() {} };
Puoi pure scriverlo:
codice:
struct lista{ int n; lista* pt; };
Ma allora devi modificare la funzione "inserisci_in_lista" e scriverla:
codice:
void inserisci_in_lista(lista*& lx, int val)
{
  if(!lx)
  {
    lx=new lista;
    lx->n=val;
    lx->pt=0;
  }
  else
    inserisci_in_lista(lx->pt,val);
}
Va bene?
Dimmi di si ti prego..