Ciao,
Allora innanzi tutto ho notato un po' di cose che a mio avviso non sono correttissime:
1. Tenta di non utilizzare i comandi come system("PAUSE"); perché questi sono specifici del sistema operativo
nel tuo caso windows. Al posto di system("PAUSE") ti consiglio di usare getch() del file stdio.h dello standard C.
2. L'header conio non mi risulta che ti serva quindi consiglio di toglierlo.
In ogni caso ti consiglio di scrivere il codice il più portabile possibile usando getch():
#include <cstdio>
....
getch();
return 0;
Non penso sia necessario includere il file stdlib.h poiché tu già lo includi includendo cstdlib che dovrebbe essere lo stesso file solo referenziato dallo standard c++.
Per quanto riguarda il crash non so come aiutarti poiché sulla mia macchina funziona. Di sicuro ciò che dice @oregon è corretto devi eliminare il p = new id che è solo uno spreco di memoria siccome lo rifai successivamente all'interno della funzione insElemento.
Ripensandoci quel new id ti porta ad una zona di memoria di cui non conosci il contenuto e che quindi può essere diversa da NULL. In pratica nella stampa non ti fermi alla fine della lista ma continui tentando poi di accedere ad una zona di memoria alla quale non hai diritti poiché non è ancora stata allocata.
Probabilmente sulla mia macchina ho avuto fortuna le volte in cui l'ho testata.