W tym wywiadzie dla Slashdot zacytowano Linusa Torvaldsa:
Widziałem zbyt wiele osób, które usuwają pojedynczo połączony wpis na liście, śledząc wpis „poprzedni”, a następnie usuwając wpis, robiąc coś w stylu
if (prev)
prev-> next = entry-> next;
else
list_head = entry-> next;i ilekroć widzę taki kod, po prostu mówię „Ta osoba nie rozumie wskaźników”. I to niestety dość powszechne.
Ludzie, którzy rozumieją wskaźniki, używają „wskaźnika do wskaźnika pozycji” i inicjują go za pomocą adresu nagłówka list_head. A następnie, gdy przeglądają listę, mogą usunąć wpis bez użycia żadnych warunków, po prostu wykonując polecenie „* pp = entry-> next”.
Jako programista PHP nie dotknąłem wskaźników od czasu wprowadzenia do C na uniwersytecie dziesięć lat temu. Uważam jednak, że jest to rodzaj sytuacji, z którą powinienem przynajmniej się zapoznać. O czym mówi Linus? Szczerze mówiąc, gdybym został poproszony o zaimplementowanie połączonej listy i usunięcie elementu, powyższy „zły” sposób to sposób, w jaki bym to zrobił. Co muszę wiedzieć, aby kodować, jak mówi Linus najlepiej?
Pytam tutaj, a nie o przepełnienie stosu, ponieważ tak naprawdę nie mam z tym problemu w kodzie produkcyjnym.
prev
zamiast całego węzła, możesz po prostu zapisać lokalizacjęprev.next
, ponieważ to jedyna rzecz, którą jesteś zainteresowany. Wskaźnik do wskaźnika. A jeśli to zrobisz, unikniesz głupotyif
, ponieważ teraz nie masz dziwnego przypadkulist_head
bycia wskaźnikiem spoza węzła. Wskaźnik do nagłówka listy jest wówczas semantycznie taki sam jak wskaźnik do następnego węzła.