2016-04-17 12 views
-1
class Node { 
private: 
    Node *left = NULL, *right = NULL; 
    char data; 
public: 
    Node(char new_data) { 
     data = new_data; 
    } 
    Node *get_left() { 
     return left; 
    } 
    Node *get_right() { 
     return right; 
    } 
    char get_data() { 
     return data; 
    } 
    void set_data(char new_data) { 
     data = new_data; 
    } 
}; 

私はデバッグしました(gdbとcoutを使用しています)、set_data関数が問題であるようです。どうして?これはセグメンテーションの理由がわかりません

もっと多くのコードがありますが、より多くのコードは必要ないと仮定しています。

EDIT:

class tree { 
private: 
    Node *root; 
public: 
    tree(char ch) { 
     cout << "ASDASD"; //using this to identify error 
     root->set_data(ch); 
     cout << root->get_data(); //using this to identify error 
    } 
}; 

EDIT 2:

#include <iostream> 
#include "tree.h" 
#include <cctype> 
using namespace std; 

int main() { 
char c; 

cout << "Enter a series of letters: "; 

cin >> c; 
tree t(c); //sets first one to root 
while(cin) { //change?? 
    cin >> c; 
    if (isdigit(c)) break; 
    Node *n; 
    n->set_data(c); 
    t.insert(n); 
} 
} 

コードは番号を読み取るまで、キーボードから読み取るようになっています。それはすべての文字を読みますが、終了しようとする数字を入力すると、それはセグメンテーションします。

+0

あなたはツリーを歩いているときに 'NULL'ノードを監視します。 – xbug

+0

私はヌルノードで何かをやっているのか分かりません。ツリークラスには、ルートノードを設定するためにset_data()を使用するコンストラクタがあります。元の投稿をツリークラスの主要部分を含むように更新しました。これに何か問題はありますか? – Locrian7

+2

'root'は' Node * 'のインスタンスにいつ設定されますか? – bmm6o

答えて

1
class tree { 
private: 
    Node *root; 
public: 
    tree(char ch) { 
     cout << "ASDASD"; //using this to identify error 
     root->set_data(ch); // **HERE** 
     cout << root->get_data(); //using this to identify error 
    } 
}; 

この時点で、rootは何も指していません。だからそれを逆参照しようとするのは誤りです。ポインタが指しているものを使う前に、ポインタを何かを指すようにしなければなりません。

そして、あなたはここに同じ問題を抱えている:

Node *n; 
n->set_data(c); 

set_data機能がNodeのデータを設定するために使用されます。したがって、それを呼び出すにはすでにNodeが必要です。 Nodeは作成されません。nはここには指されません。

関連する問題