In questa intervista di Slashdot, Linus Torvalds è citato dicendo:
Ho visto troppe persone che eliminano una voce dell'elenco collegata singolarmente tenendo traccia della voce "precedente" e quindi per eliminare la voce, facendo qualcosa di simile
if (prev)
prev-> next = entry-> next;
else
list_head = entry-> next;e ogni volta che vedo codice del genere, vado semplicemente "Questa persona non capisce i puntatori". Ed è purtroppo abbastanza comune.
Le persone che comprendono i puntatori usano semplicemente un "puntatore al puntatore voce" e lo inizializzano con l'indirizzo di list_head. E poi mentre attraversano l'elenco, possono rimuovere la voce senza usare alcun condizionale, semplicemente facendo un "* pp = entry-> next".
Come sviluppatore di PHP non ho toccato i puntatori dall'Introduzione alla C all'università un decennio fa. Tuttavia, ritengo che questo sia un tipo di situazione che dovrei almeno conoscere. Di cosa sta parlando Linus? Ad essere onesti, se mi chiedessero di implementare un elenco collegato e di rimuovere un elemento, il modo "sbagliato" sopra riportato è il modo in cui lo farei. Cosa devo sapere per codificare come Linus dice meglio?
Lo sto chiedendo qui piuttosto che su Stack Overflow poiché in realtà non ho problemi con questo nel codice di produzione.
prev
, invece di memorizzare l'intero nodo, è possibile memorizzare la posizione diprev.next
, dal momento che "l'unica cosa che ti interessa. Un puntatore a un puntatore. E se lo fai, eviti lo scioccoif
, dal momento che ora non hai il caso imbarazzante dilist_head
essere un puntatore dall'esterno di un nodo. Il puntatore all'inizio della lista è quindi semanticamente uguale al puntatore al nodo successivo.