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;
}
Tonnen von Compiler-Warnungen. Einer von ihnen könnte dir sagen, dass das falsch ist. – user4581301
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. –
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