La funzione LDat è errata perche scorre la lista senza fermarsi quando la lista è terminata:

codice:
while(cd < L->coD){
	prev = L;
	L = L->next;
}
mentre dovrebbe essere



codice:
while(L && (cd < L->coD)){
	prev = L;
	L = L->next;
}
codice:
Un altro errore sta nel caso in cui devi eliminare l'ultimo elemento della lista perche scrivi.

/* Se l'elemento puntato da (p->next)->next è NULL (non esiste)...
else if((p->next)->next == NULL && (p->next)->coD == codcor){
	(p->next)->next = NULL; /* Setta a NULL il campo next del nodo
cioè se (p->next)->next è NULL lo imposti a NULL...mentre te devi impostare a NULL p->next e devi deallocare p->next, non (p->next)->next. Poi qualke piccola ottimizzazione, che più che altro serve a rendere piu compatto il codice e piu leggibile, ad esempio se il nodo lo devi aggiungere alla lista puoi crearlo una sola volta all'inizio prima di fare i 3 if, e non crearlo all'interno di ogni if.