Dans cette interview à Slashdot, Linus Torvalds aurait déclaré:
J'ai vu trop de gens qui suppriment une entrée de liste à liaison unique en gardant une trace de l'entrée "prev", puis en supprimant l'entrée, en faisant quelque chose comme
if (prev)
prev-> next = entry-> next;
else
list_head = entry-> next;et chaque fois que je vois du code comme ça, je dis simplement "Cette personne ne comprend pas les pointeurs". Et c'est malheureusement assez courant.
Les personnes qui comprennent les pointeurs utilisent simplement un "pointeur vers le pointeur d'entrée" et l'initialisent avec l'adresse de list_head. Et puis, au fur et à mesure qu'ils parcourent la liste, ils peuvent supprimer l'entrée sans utiliser de conditions, en faisant simplement un "* pp = entry-> next".
En tant que développeur PHP, je n'ai pas touché de pointeurs depuis l' introduction au C à l'université il y a dix ans. Cependant, je pense que c'est un type de situation que je devrais au moins connaître. De quoi parle Linus? Pour être honnête, si on me demandait de mettre en œuvre une liste chaînée et de supprimer un élément, la «mauvaise» manière ci-dessus est la façon dont je procéderais. Que dois-je savoir pour coder comme Linus le dit le mieux?
Je demande ici plutôt que sur Stack Overflow car je n'ai pas vraiment de problème avec cela dans le code de production.
prev
, au lieu de stocker le nœud entier, vous pouvez simplement stocker l'emplacement deprev.next
, car c'est la seule chose qui vous intéresse. Un pointeur vers un pointeur. Et si vous faites cela, vous évitez l'idiotif
, car maintenant vous n'avez pas le cas gênant d'list_head
être un pointeur de l'extérieur d'un nœud. Le pointeur vers la tête de la liste est alors sémantiquement le même que le pointeur vers le nœud suivant.