Bu Slashdot röportajında Linus Torvalds şöyle diyor:
"Prev" girdisini takip ederek tek bir bağlantılı liste girişini silen ve daha sonra girişi silmek için,
eğer (önceki)
önceki-> sonraki = giriş-> sonraki;
else
list_head = giriş-> sonraki;ve böyle bir kod gördüğümde, "Bu kişi işaretçileri anlamıyor" diye gidiyorum. Ve ne yazık ki oldukça yaygın.
İşaretçileri anlayan insanlar sadece bir "giriş işaretçisine işaretçi" kullanır ve bunu list_head adresiyle başlatır. Ve sonra listeyi geçtiklerinde, girdiyi herhangi bir koşul kullanmadan, yalnızca "* pp = entry-> next" yaparak kaldırabilirler.
Bir PHP geliştiricisi olarak ben on yıl önce üniversiteye C Giriş beri işaretçiler dokunmadım . Ancak, bunun en azından aşina olmam gereken bir tür durum olduğunu hissediyorum. Linus ne hakkında konuşuyor? Dürüst olmak gerekirse, bağlantılı bir listeyi uygulamam ve bir öğeyi kaldırmam istendiğinde, yukarıdaki 'yanlış' yol, bu konuda gitmemin yoludur. Linus'un en iyi dediği gibi kodlamak için nelere ihtiyacım var?
Aslında üretim kodunda bu bir sorun yok gibi Yığın Taşma yerine burada soruyorum.
prev
düğümün konumunu saklamanız gerektiğinde, tüm düğümü saklamak yerine, sadece konumunu saklayabilirsinizprev.next
, çünkü bu 'ilgilendiğiniz tek şey. Bir işaretçiye işaretçi. Ve bunu yaparsanız, aptallıktan kaçınırsınızif
, çünkü şimdilist_head
bir düğümün dışından bir işaretçi olma garip örneğiniz yok . Listenin başına gelen işaretçi, anlamsal olarak bir sonraki düğüme işaretçi ile aynıdır.