Scusa, sono io che ho letto male, la funzione è corretta così come l'ha scritta il tuo professore.
Infatti lo richiama: ma dopo aver chiamato ricorsivamente sé stessa sul prossimo elemento.fino a che non siamo in findo alla lista entra nell'if e richiama la funzione nel prossimo elemento.
ma facendo cosi la funzione non si sposta nel prossimo elemento ?
non dovrebbe richiamare delete_node a ogni chiamata ricorsiva ?
Quello che devi capire è che non è che la funzione attualmente in esecuzione va su un altro elemento: semplicemente, viene chiamata un'altra volta delete_list sul prossimo elemento, e ogni chiamata ricorsiva ha la sua copia dei parametri e delle variabili locali.
Ti faccio un esempio: supponiamo che la lista sia:
elem1 -> elem2 -> elem3 -> (NULL)
Chiamo delete_list su elem1: delete_list controlla che il prossimo elemento non sia nullo, quindi richiama delete_list su elem2; a sua volta, questa fa lo stesso su elem3. La delete_list che sta operando su elem3 vede che il prossimo elemento non è nullo, quindi non fa alcuna chiamata ricorsiva; elimina elem3 e ritorna; ora siamo tornati nella delete_list che sta operando su elem2; la sua istruzione successiva è delete_node(head_of_list), che qui elimina elem2, e ritorna. Ora siamo nella delete_list su elem1: stesso discorso: elimina elem1 e ritorna al chiamante iniziale.