これは私が本当に立ち往生しているので、StackOverflowの私の最初の投稿です。 私の問題は、次のコードを実行するたびに、関数InsertNode()の最初の呼び出しで戻り値のノードが次のノードとデータに対して正しい値を持つことです。しかし、関数が再び呼び出されると、何らかの理由でヘッドがデータNULLにリセットされ、次のポインターが再帰的に同じアドレスを指してしまいます。私はOOPでこれを実装するのが苦労しています。私はプレーンな構造体を使ってこれを成功させました。しかし、OOPでは、InsertNodeが宣言されていないというエラーが出るので、Node * Node :: InsertNode(Node * head)メソッドをmainで宣言する方法として混乱しています。回避策として、Nodeクラスの外にあるInsertNodeを独立した関数として宣言しました。私はこの問題を引き起こしている可能性があると感じています。何が起こっているのか、私のコードで何を変えなければならないのかについての助けに感謝します。ありがとうございました!クラス(OOP)を使用したC++リンクリスト
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;
}
トン。そのうちの1人が間違っていると言っているかもしれません。 – user4581301
あなたの不具合は明らかです。これは、すべての変数とオブジェクトの値を調べながら、一度に1行ずつコードをステップ実行するために、デバッガを使用する方法を学び、それを理解する絶好の機会です。そして次回この状況であなた自身を見つけたら、あなたはstackoverflow.comの助けを求めずに、あなた自身でそれをすべて理解することができます。デバッガの使い方を知ることは、すべてのC++開発者にとって必要なスキルです。 –
ありがとうございます。現在、すべての行にブレークポイントが設定されており、最初の実行時に値が正しく設定されているかどうかを確認できます。しかし、2回目の走行では、頭は再びNullにリセットされます。私は自分のロジックが機能から間違っているかもしれないことに気づきますしかし、クラス外のInserNode関数を宣言すると、ヘッドノードがリセットされることと関係があるかどうかを理解しようとしています。 void型メソッド(PrintNode)は、クラス内で宣言されたときにエラーをスローしませんが、同じ方法でInsertNodeメソッドを宣言しても、NodeNode :: InsertNode(Node * head、int data);私はそれが未定義であるというエラーを得る。 – sr2002