Grazie, hai pienamente ragione: il ciclo while deve iterare finché p punta a NULL, perciò il giusto controllo è (p->next != NULL).
Nel frattempo ho continuato a sbatterci la testa e ho provato ad allocare head con la malloc. Non va più in crash!
Era anche quello un errore?

codice:
int main()
{
         head = (nodo*)malloc(sizeof(struct nodo)); //alloca nuovo nodo
         head->next = NULL;      // creazione della lista
         printf ("\n Nuovo inserimento: ");
         scanf ("%d", &n);      // leggi numero da inserire


         nuovo = (nodo*)malloc(sizeof(struct nodo)); //alloca nuovo nodo


         nuovo->dato = n;   // inserisci N in nodo.dato
                                    
         nuovo->next = NULL;    // NUOVO punta a NULL.
         printf("\n Allocato nuovo nodo all'indirizzo %d\n ", nuovo);
         head->next=nuovo;


         p=head;           // P coincide col nodo di testa
         while (p->next != NULL)   // finché la lista non è finita
         { p = p->next; }    // P punta la nodo successivo


         p->next = nuovo;    // l'ultimo nodo punta a NUOVO
         
         system("pause");
         return 0;
}

però ho lasciato "p=head", e non ha dato problemi. Come mai?