Używanie wskaźników do usuwania elementu z pojedynczo powiązanej listy
NiedawnoWywiad z Slashdotem Linus Torvalds podał przykład tego, jak niektórzy ludzie używają wskaźników w sposób, który wskazuje, że tak naprawdę nie rozumieją, jak ich używać poprawnie.
Niestety, ponieważ jestem jednym z ludzi, o których mówi, nie zrozumiałem jego przykładu:
Widziałem zbyt wielu ludzi, którzy usunęli wpis o pojedynczej liście, śledząc wpis „prev”, a następnie usuwając wpis, robiąc coś takiego
if (prev)
prev->next = entry->next;
else
list_head = entry->next;
a ilekroć widzę kod w ten sposób, po prostu przechodzę „Ta osoba nie rozumie wskazówek”. I to niestety dość powszechne. Ludzie, którzy rozumieją wskaźniki, używają jedynie „wskaźnika do wskaźnika wejścia” i inicjalizują go za pomocą adresu nagłówka listy. A kiedy przechodzą przez listę, mogą usunąć wpis bez użycia warunkowych, po prostu robiąc
*pp = entry->next
Czy ktoś może wyjaśnić, dlaczego to podejście jest lepsze i jak może działać bez instrukcji warunkowej?