2017-03-05 3 views
0

Dies ist mein erster Post auf StackOverflow, wie ich wirklich fest bin. Mein Problem ist, dass jedes Mal, wenn ich den folgenden Code ausführen, beim ersten Aufruf der Funktion InsertNode() der Rückgabetemperaturknoten die richtigen Werte für den nächsten Knoten und Daten hat. Wenn die Funktion jedoch erneut aufgerufen wird, wird der Kopf aus bestimmten Gründen auf den Datenwert NULL und den nächsten Zeiger rekursiv auf die gleiche Adresse zurückgesetzt. Ich habe es schwer, dies in OOP zu implementieren, ich habe dies mit einfachen Strukturen erfolgreich getan. Aber mit OOP bin ich verwirrt, wie die Knoten * Node :: InsertNode (Node * Kopf), Methode in main zu deklarieren, wie ich einen Fehler, dass InsertNode nicht deklariert ist. Als Workaround habe ich InsertNode außerhalb der Node-Klasse als unabhängige Funktion deklariert. Ich habe das Gefühl, dass das das Problem verursacht. Ich würde gerne etwas Hilfe bei dem, was vor sich geht, oder was ich in meinem Code ändern sollte. Vielen Dank!C++ Verknüpfte Liste mit Klassen (OOP)

hashtable.cpp

#include "Hashtable.hpp" 
using namespace std; 
Node::Node(){ 

    data = NULL; 
    Node* nextP = NULL; 
}; 

Node::~Node(){ 

} 

Node* InsertNode(Node* head, int data){ 

    Node* temp = new Node(); 

    if(head->nextP == NULL){ 

     head->data = data; 
     temp->nextP = head; 
     head = temp; 

    } else if(head->nextP!=NULL){ 

     temp->nextP = head; 
     temp->data = data; 
     head = temp; 
    } 

    return head; 
}; 

void Node::printNode(Node* head){ 
    Node* temp = new Node(); 
    temp = head; 
    while(temp->nextP != NULL){ 
     printf("%d\n", temp->data); 
     temp = temp->nextP; 
    } 
} 

Hashtable.hpp

#ifndef Hashtable_hpp 
#define Hashtable_hpp 

#include <stdio.h> 

class Node 
{ 
public: 
    Node* nextP; 
    Node(); 
    ~Node(); 

    void printNode(Node* head); 
    int data = NULL; 

    private: 


}; 
Node* InsertNode(Node* head, int data); 

#endif /* Hashtable_hpp */ 

main.cpp

#include <iostream> 
#include "stdio.h" 
#include <string> 
#include "Hashtable.hpp" 

using namespace std; 
Node head; 
//Node* head = new Node(); 


int main(int argc, const char * argv[]) { 
    // insert code here... 
    std::cout << "Hello, World!\n"; 
    head = *InsertNode (&head, 10); 
    // head = temp2; 
    head = *InsertNode (&head, 20); 
    // head = temp2; 
    head = *InsertNode (&head, 30); 
    // head = temp2; 

    //InsertNode(head, 20); 

    Node printNode(head); 

    return 0; 


} 
+0

Tonnen von Compiler-Warnungen. Einer von ihnen könnte dir sagen, dass das falsch ist. – user4581301

+0

Ihr Bug scheint ziemlich offensichtlich zu sein. Dies ist eine ausgezeichnete Gelegenheit, um zu lernen, wie man einen Debugger benutzt, um den Code Zeile für Zeile durchzugehen, während man die Werte aller Variablen und Objekte untersucht, um es selbst herauszufinden. Und wenn Sie sich das nächste Mal in dieser Situation befinden, können Sie es selbst herausfinden, ohne nach Hilfe auf stackoverflow.com zu fragen. Zu wissen, wie man einen Debugger benutzt, ist eine notwendige Fähigkeit für jeden C++ Entwickler. –

+0

Danke. Ich habe Breakpoints für jede Zeile gesetzt und kann sehen, dass die Werte beim ersten Durchlauf richtig gesetzt werden. Aber im zweiten Lauf wird der Kopf wieder auf Null zurückgesetzt. Ich erkenne, dass meine Logik von der Funktion her falsch ist. Aber ich versuche zu verstehen, ob das Deklarieren der InserNode-Funktion außerhalb der Klasse etwas damit zu tun hat, dass der Kopfknoten zurückgesetzt wird. Die void type-Methode (PrintNode) löst keine Fehler aus, wenn sie in der Klasse deklariert wird, aber wenn ich die InsertNode-Methode auf die gleiche Weise deklariere: Node * Node :: InsertNode (Node * head, int data); Ich bekomme einen Fehler, dass es nicht definiert ist. – sr2002

Antwort

0

So endlich dachte ich, das Problem aus. Da ich anfänglich die Klassenfunktion InsertNode() direkt referenzierte, versuchte ich den Fehler zu vermeiden, den ich mit der nicht deklarierten Kennung bekommen hatte. Als Workaround habe ich die Funktion außerhalb der Klassendeklaration verschoben, was dann zu mehr Problemen geführt hat, wie Sie oben sehen konnten. Jetzt habe ich festgestellt, dass, wenn die Funktion in der Klasse existiert, ich sie referenziere, indem ich zuerst die Funktion referenziere (meine Terminologie ist wahrscheinlich falsch), indem ich folgendes benutze: head-> InsertNode (head, data); Ich versuchte zunächst verschiedene Iterationen von InsertNode (& Kopf, Daten) oder Knoten * InsertNode (& Kopf, Daten) ... usw. Grundsätzlich versucht, brachial Kraft meinen Weg durch den Compiler :).

Ich füge den folgenden Code an, bitte lassen Sie mich Ihre Kommentare darüber, was ich verbessern kann.

Hashtable.cpp

#include "Hashtable.hpp" 
#include <iostream> 

using namespace std; 

Node::Node(){ 

    data = NULL; 
    Node* nextP = NULL; 
}; 

Node::~Node(){ 

} 

Node* Node::InsertNode(Node* head, int data){ 
    Node* temp = new Node(); 
    if(head->nextP == NULL){ 
     head->data = data; 
     temp->nextP = head; 

    } else if(head->nextP!=NULL){ 
     temp->nextP = head; 
     temp->data = data; 
    } 

    return temp; 
}; 


void Node::printNode(Node* head){ 
    Node* temp = new Node(); 
    temp = head; 
    while(temp->nextP != NULL){ 
     printf("%d\n", temp->data); 
     temp = temp->nextP; 
    } 
} 

Hashtable.hpp

#ifndef Hashtable_hpp 
#define Hashtable_hpp 

#include <stdio.h> 
#include <iostream> 

using namespace std; 

class Node 
{ 
    int data = NULL; 
    Node* nextP; 
public: 

    Node(); 
    ~Node(); 
    Node* InsertNode(Node* head, int data); 
    void printNode(Node* head); 
     private: 
}; 


#endif /* Hashtable_hpp */ 

main.cpp

#include <iostream> 
#include "stdio.h" 
#include <string> 
#include "Hashtable.hpp" 

using namespace std; 
Node* head = new Node(); 

int main(int argc, const char * argv[]) { 
    // insert code here... 
    std::cout << "Hello, World!\n"; 
    Node temp2; 
    head = head->InsertNode (head, 10); 
    head = head->InsertNode (head, 20); 
    head = head->InsertNode (head, 30); 
    head = head->InsertNode (head, 40); 
    head = head->InsertNode (head, 50); 
    head = head->InsertNode (head, 60); 
    head = head->InsertNode (head, 70); 
    head->printNode(head); 

    return 0;