Ich konnte den Grund nicht verstehen, warum wir Zeiger von Knoten anstelle von Knotenstrukturen erzeugen, wenn wir versuchen, verkettete Listen wie hier zu implementieren:
%Vor%und
%Vor% hier, warum deklarieren wir Knoten wie head
als Zeiger von Strukturen anstelle von direkten Strukturen & gt;
Wenn head
als Zeiger verwendet wird, können Dinge wie leere Listen ( head == NULL
) oder ein einfacher Weg zum Löschen von Elementen am Anfang der Liste durch Verschieben des head
Zeigers auf ein anderes (zB zweites) Element in Die Liste. Mit head
als Struktur wären diese Operationen unmöglich oder zumindest viel weniger effizient zu implementieren.
Der primäre Grund ist, dass die C-Sprache es einfach nicht erlaubt - ein struct
-Typ kann keine Instanz von sich selbst enthalten. Dafür gibt es zwei Gründe:
Der struct
-Typ ist nicht abgeschlossen bis zum schließenden }
, und Sie können keine Instanz eines unvollständigen Typs erstellen;
Wenn ein struct
type eine Instanz von sich selbst enthalten könnte, wäre die Instanz unendlich groß ( struct foo
enthält eine Instanz von struct foo
, die eine Instanz von enthält struct foo
, enthält eine Instanz von struct foo
, ad infinitum ).
Sie können jedoch Zeiger auf unvollständige Typen erstellen (da die Größe des Zeigers nicht von der Größe des angegebenen Typs abhängt). Wenn also ein struct
-Typ ein Element enthalten soll, das auf eine andere Instanz desselben Typs verweist, muss durch einen Zeiger ausgeführt werden.
warum deklarieren wir Knoten wie head als Zeiger von Strukturen anstelle von direkten Strukturen
Wenn head
als Zeiger deklariert wird, können wir eine leere Liste haben, d. h. wenn head
NULL
Denn das ist der springende Punkt: eine Sammlung von Knoten, die wie eine Kette verknüpft sind. Sie können Knoten einfach trennen und neu anbinden, da Sie dazu nur Zeigerwerte ändern müssen. Dies wäre unmöglich, wenn Ihr Typ eher wie ein Array wäre. Wenn Sie das wollen, verwenden Sie ein Array.
Außerdem ist es für einen Typ unmöglich, eine Instanz von sich selbst zu enthalten. Also ein node
enthält ein node
, welches ein node
enthält, welches ein node
enthält, welches ein node
enthält, und so weiter ... wie kann das funktionieren?
Wie schon jemand anderes gesagt hat, haben wir mit Hilfe von Zeigern eine bequeme Möglichkeit, eine leere Liste oder das Ende der Liste mit einem NULL-Zeiger anzuzeigen.
Wir könnten natürlich unsere Knoten modifizieren, um ein Flag zu haben, das anzeigt, dass es "das Ende der Liste" (EOL) ist. Ein weiterer wichtiger Grund dafür ist, dass die Liste leicht wachsen kann (bis zu der Menge des verfügbaren Speichers) oder dynamisch verkleinert werden kann, ohne Speicher neu zuweisen zu müssen, um die gesamte Liste zu speichern und sie jedes Mal zu kopieren, wenn sie wächst oder schrumpft. Es erleichtert auch das Einfügen oder Entfernen eines Elements.
Es wäre keine "verknüpfte" Liste, wenn die Knoten nicht tatsächlich miteinander verknüpft sind. Es könnte immer noch eine Liste von irgendeiner Art sein, aber es wäre nicht verknüpft.
Vergleichen Sie mit dem Wort "Link" oder Hyperlink im Internet. Sie sind auch Zeiger, weil fast keine Seite tatsächliche Inhalte der verlinkten Seiten speichert.
Tags und Links c pointers linked-list