Originariamente inviato da nicone 91
perchè con la prima stampa il primo elemento e con la seconda stampa tutti gli altri elementi

è un errore?
Bè, a meno che non mi sfugga qualcosa, la funzione per stampare non ha molto senso secondo me... Tu dici:

1) se p == NULL (lista vuota) stampa "Nessun contatto presente";
2) altrimenti stampa il primo elemento (ma NON sposta il puntatore nella lista, cioè punta ancora al primo elemento!);
3) in ogni caso (il ciclo è fuori dall'if e dall'else) stampi tutti gli elementi della lista;

Quindi a occhio il primo elemento dovrebbe venire stampato due volte!