2016-04-15 7 views
0

UPDATE: Bitte sehen Sie David Grayson Antwort, wenn Sie in einer ähnlichen Position wie meine sind und Ihr Programm überarbeiten möchten.Kopfzeiger in verknüpfter Liste magisch zugewiesen, sollte nicht funktionieren, tut aber

So habe ich in CS202 verknüpfte Listen gelernt und ich habe ein Programm erstellt, das funktioniert, sollte aber nicht. Der genaue Grund, warum es nicht funktionieren sollte, ist, dass ich den Zeiger im ersten Knoten nie dem nächsten Knoten zuweise, aber das Programm kompiliert und läuft perfekt.

(Oder zumindest das ist, wie ich es verstehe. Natürlich muss ich auf einer bestimmten Ebene falsch sein.)

Ich weiß, dass dies nicht der hübscheste Code, aber ich wollte nicht zu verwirren wenn es aus irgendeinem Grund schon funktioniert.

#include <iostream> 

using namespace std; 

//STRUCTS 

struct node 
{ 
    int num; 
    node *ptrNext; 
}; 

//FUNCTIONS 

node *addNode(node *currentNode, int i) 
{ 
    node *previousNode = currentNode; 

    currentNode = new node; 
    currentNode -> num = i; 
    currentNode -> ptrNext = nullptr; 

    previousNode -> ptrNext = currentNode; 

    return currentNode; 

} 

void printList(node *printingNode) 
{ 
    while (printingNode -> ptrNext != nullptr) 
    { 
     printingNode = printingNode -> ptrNext; 
     cout << printingNode -> num << ", "; 
    } 
} 

//MAIN 

int main() 
{ 
    node *head = new node; 
    node *current; 

    head -> num = NULL; 
    head -> ptrNext = nullptr; 

    current = addNode(head, 23); 
    current = addNode(current, 28); 
    current = addNode(current, 45); 
    current = addNode(current, 57); 

    printList(head); 

    return 0; 
} 

Das Programm kompiliert ohne Fehler oder Warnung, und die Ausgabe sieht wie folgt aus:

23, 28, 45, 57, 

Mein Lehrer und ich durch diese verwirrt. Wie kann, wenn in der printList-Funktion verwendet, der Kopf -> ptrNext verknüpft werden?

+2

Die Methode 'addNode' richtet den nächsten Zeiger ein:' previousNode -> ptrNext = currentNode; '. Wenn ich mich nicht irre? – cehnehdeh

+0

Ihre Verwirrung könnte sich aus dieser Zeile ergeben: 'currentNode = new node;' Sie haben sich dafür entschieden, einen Variablennamen zu verwenden, anstatt einen neuen zu erstellen, wodurch der Code auf den ersten Blick falsch aussieht. Ich hätte wahrscheinlich 'node * newNode = new node;' geschrieben und "previousNose" ganz losgeworden. –

+0

"Ich hätte wahrscheinlich den Knoten * newNode = new node; geschrieben und die vorhergehendeNose ganz gelöscht." Das hat den Trick gemacht, es macht jetzt viel mehr Sinn. Ich bin mir immer noch nicht sicher über die Antwort, speziell auf meine Frage, aber jetzt habe ich wenigstens ein Programm, das Sinn macht. Vielen Dank! –

Antwort

1

Die addNode-Funktion behandelt dies. Wenn addNode aufgerufen wird, legt es den Wert von ptrNext auf den neuen Knoten fest, der erstellt wird.

+0

Aber ich mache nie currentNode -> ptrNext = alles außer nullptr. Das heißt, wenn head currentNode ist, wird das erste Mal, wenn addNode aufgerufen wird, dem Knoten, auf den es zeigt, nur ptrNext = nullptr zugewiesen. –

+0

aber Sie tun '* previousNode = currentNode' und' previousNode -> ptrNext = currentNode' – Thomas

0

Wenn ich

previousNode -> ptrNext = currentNode; 

der Zeiger previousNode hat an den Kopfknoten gesetzt ist, und ändert die ptrNext im Kopfknoten zu dem soeben erzeugte ein.

GaiusOctavian hat eine technisch korrekte Antwort, aber ich habe es nicht verstanden, weil Zeiger kompliziert sind. Danke, dass du mir geholfen hast.


Mein neues Programm Vorteil von David Grayson Beratung nimmt:

node *addNode(node *inputNode, int input) 
{ 
    node *newNode = new node; 
    newNode -> num = input; 
    newNode -> ptrNext = nullptr; 

    inputNode -> ptrNext = newNode; 

    return newNode; 
} 

Dieses einfach einen Knoten nimmt, erstellt eine neue, verbindet dann den Eingangsknoten mit dem neuen und spuckt die neue out .