In einer C Linked List sind die Knoten also auch Zeiger? [Duplikat]

8

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;

    
Huzo 16.02.2018, 13:12
quelle

6 Antworten

10

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.

    
Mithrandir 16.02.2018, 13:17
quelle
11

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:

  1. Der struct -Typ ist nicht abgeschlossen bis zum schließenden } , und Sie können keine Instanz eines unvollständigen Typs erstellen;

  2. 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.

    
John Bode 16.02.2018 15:26
quelle
6
  

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

ist     
Andriy Berestovskyy 16.02.2018 13:14
quelle
2

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?

    
quelle
1

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.

    
Marker 16.02.2018 13:21
quelle
1

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.

    
mathreadler 16.02.2018 17:05
quelle

Tags und Links