In diesem Slashdot-Interview wird Linus Torvalds mit folgenden Worten zitiert:
Ich habe zu viele Leute gesehen, die einen einfach verknüpften Listeneintrag löschen, indem sie den Eintrag "prev" verfolgen und dann den Eintrag löschen, indem sie so etwas tun
if (prev)
prev-> next = entry-> next;
sonst
list_head = entry-> next;und wenn ich solchen Code sehe, gehe ich einfach zu "Diese Person versteht keine Zeiger". Und es ist leider ziemlich häufig.
Personen, die Zeiger verstehen, verwenden einfach einen "Zeiger auf den Eintragszeiger" und initialisieren diesen mit der Adresse des Listenkopfs. Und dann, wenn sie die Liste durchlaufen, können sie den Eintrag entfernen, ohne Bedingungen zu verwenden, indem sie einfach "* pp = entry-> next" ausführen.
Als PHP-Entwickler habe ich seit Einführung in C an der Universität vor einem Jahrzehnt keine Hinweise mehr berührt . Ich bin jedoch der Meinung, dass dies eine Art Situation ist, mit der ich zumindest vertraut sein sollte. Worüber spricht Linus? Um ehrlich zu sein, wenn ich gebeten würde, eine verknüpfte Liste zu implementieren und ein Element zu entfernen, würde ich den oben genannten "falschen" Weg einschlagen. Was muss ich wissen, um zu codieren, wie Linus am besten sagt?
Ich frage hier eher als bei Stack Overflow, da ich im Produktionscode eigentlich kein Problem damit habe.
prev
Knotens speichern müssen, anstatt den gesamten Knoten zu speichern, Sie einfach die Position von speichern könnenprev.next
, da dies das einzige ist, woran Sie interessiert sind. Ein Zeiger auf einen Zeiger. Und wenn Sie das tun, vermeiden Sie das Dummeif
, da Sie jetzt nicht den unangenehmen Fall habenlist_head
, ein Zeiger von außerhalb eines Knotens zu sein. Der Zeiger auf den Kopf der Liste ist dann semantisch der gleiche wie der Zeiger auf den nächsten Knoten.