2017-03-05 9 views
0

これは私が本当に立ち往生しているので、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; 


} 
+0

トン。そのうちの1人が間違っていると言っているかもしれません。 – user4581301

+0

あなたの不具合は明らかです。これは、すべての変数とオブジェクトの値を調べながら、一度に1行ずつコードをステップ実行するために、デバッガを使用する方法を学び、それを理解する絶好の機会です。そして次回この状況であなた自身を見つけたら、あなたはstackoverflow.comの助けを求めずに、あなた自身でそれをすべて理解することができます。デバッガの使い方を知ることは、すべてのC++開発者にとって必要なスキルです。 –

+0

ありがとうございます。現在、すべての行にブレークポイントが設定されており、最初の実行時に値が正しく設定されているかどうかを確認できます。しかし、2回目の走行では、頭は再びNullにリセットされます。私は自分のロジックが機能から間違っているかもしれないことに気づきますしかし、クラス外のInserNode関数を宣言すると、ヘッドノードがリセットされることと関係があるかどうかを理解しようとしています。 void型メソッド(PrintNode)は、クラス内で宣言されたときにエラーをスローしませんが、同じ方法でInsertNodeメソッドを宣言しても、NodeNode :: InsertNode(Node * head、int data);私はそれが未定義であるというエラーを得る。 – sr2002

答えて

0

だから私は最終的に問題を考え出しました。最初はクラス関数InsertNode()を直接参照していたので、宣言されていない識別子で他の人が取得していたエラーを回避しようとしていました。だから私は周りの仕事としてクラスの宣言の外に関数を移動し、あなたは上記のポストのように多くの問題を引き起こした。今私はクラス内に関数が存在するとき、私は最初に参照を外して(私の用語はおそらく間違っている)関数を次のように使用していることに気付きました:head-> InsertNode(head、data); 私は当初、InsertNode(&ヘッド、データ)またはNode * InsertNode(&ヘッド、データ)などのさまざまな反復を試みていました...基本的には、

私は以下のコードを添付しています。改善できる点についてのご意見をお聞かせください。

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; 
関連する問題