Per essere più precisi ancora, l'istruzione list *p=NULL; all'inizio della routine non è corretta nel caso in cui si parta con la lista non-vuota, per cui deve diventare list *p=*l;.

Stefano.