2016-10-30 9 views
0

Ich habe schon eine ganze Weile auf Google und ein paar Lehrbüchern gesucht und ich kann nicht verstehen, warum es ist, wenn Sie eine verknüpfte Liste erstellen Die Knoten müssen Zeiger sein.Erstellen einer verketteten Liste ohne Deklaration von Knoten als Zeiger

Eg. Wenn ich einen Knoten wie folgt definiert:

typedef struct Node{ 
    int value; 
    struct Node *next; 
} Node; 

warum ist es, dass, um eine Liste zu erstellen, würde ich sagen:

Node *a = malloc(sizeof(Node)); 
Node *b = malloc(sizeof(Node)); 
a->value = 1; 
b->value = 2; 

a->next = b; 
b->next = NULL; 

statt:

Node a, b; 
a.value = 1; 
b.value = 2; 

a.next = &b; 
b.next = NULL; 

Zu meiner Verständnis, die Liste wird immer noch in der Lage sein, referenziert und durchlaufen als normal, der einzige Unterschied ist die Verwendung des Punktes, Ampersand-Syntax und nicht den Pfeil?

+2

Ihr 'Node * a, * b 'Snippet ist invalild. Sie deklarieren Zeigervariablen, ohne dass sie auf gültigen Speicher verweisen. Die Zeiger zeigen mit ziemlicher Sicherheit nicht auf gültige 'Node'-Objekte –

+0

Mit Ihrem zweiten Beispiel überlegen Sie, wie Sie Hunderte von neuen Knoten zu Ihrer Liste hinzufügen würden. Mithilfe von Zeigern können Sie malloc weiterhin verwenden, um neue Knoten innerhalb einer Schleife hinzuzufügen. Ohne Zeiger müssen Sie den Speicher auf andere Weise zuweisen, was den Vorteil der Verwendung einer verknüpften Liste etwas zunichte macht. – Neil

Antwort

0

Ihr erstes Beispiel wird nicht funktionieren. Sie deklarieren zwei Node Zeiger. Da Sie diese jedoch zu nichts initialisieren, ist es illegal, sie zu referenzieren, da sie auf nichts hinweisen. Sie müssen zuerst so etwas wie malloc verwenden, um den Speicher zu deklarieren, auf den sie zeigen sollen, oder sie einer zuvor deklarierten lokalen Variablen zuzuordnen. Sie müssen jedoch auch daran denken, free aufzurufen, wenn Sie mit dem Speicher fertig sind. Im zweiten Beispiel deklarieren Sie zwei Node Variablen, die Sie zum Speichern von Instanzen des Node verwenden. Diese werden auf dem Stapel zugewiesen, wenn sie lokale Variablen sind, und sie werden so lange leben, wie sie sich im Gültigkeitsbereich befinden. Sie haben ein gültiges Gedächtnis, und du kannst sie so benutzen, wie du gezeigt hast.

+0

Mein Fehler. Aber unter der Annahme, dass ich den erforderlichen Platz für a und b zugewiesen habe, sagen wir, wenn ich meine zwei malloc - Anweisungen unter "Node * a, * b" zum Beispiel habe ... was wären die bevorstehenden Unterschiede an diesem Punkt zwischen diesem Beispiel von eine verknüpfte Liste und die zweite, die ich erwähnte? – alphabetguy

2

Sie können die Liste auf eine von Ihnen erwähnte Weise erstellen.

Aber Sie müssen für die Lebensdauer der Listenmitglieder sorgen. Wenn Ihr

Knoten a, b;

sind im Umfang einer Funktion, dann sind diese nach der Rückkehr dieser Funktion verloren.

Wenn Sie Zeiger verwenden, verwenden Sie normalerweise den Heap und die Instanzen, bis sie gelöscht werden.

Verwandte Themen