2017-06-21 14 views
0

フレンド。だから私はエディタとしてvimを使ってubuntuでバイナリ検索ツリークラスを作成しています。私がプログラムを実行すると、私はいつもセグメンテーションフォルト(コアダンプ)エラーが出ます。奇妙なことは、NetBeansでこのプログラムを実行すると、完全に機能したということです。これは私がすでにデバッグにGDBを使用し、そしてそれは私にprintHelper機能上の誤りを指摘したが、私はエラーを見ることができない私のコードセグメンテーションフォルト(コアがダンプされている)を修正するのに役立つ必要があります

#include <iostream> 
using namespace std; 


class BST 
{ 

struct node { 
    int data; 
    node* left; 
    node* right; 

}; 


private: 
node* root; 


node* addHelper(node* temp, int data) 
{ 
    if(temp == NULL) 
    { 
     temp = new node; 
     temp->left = temp->right = NULL; 
     temp->data = data; 
     return temp; 
    } 
    if(data < temp->data) 
    { 
    temp->left = addHelper(temp->left, data); 
    } 
    else if(data > temp->data) 
    { 
    temp->right = addHelper(temp->right, data); 
    } 
    return temp; 
} 

void printHelper(node* cur) 
{ 
    if(cur == NULL) 
    { 
     return; 
    } 
    else { 
     printHelper(cur->left); 
     cout << cur->data << " "; 
     printHelper(cur->right); 
    } 
} 



public: 

void add(int value) 
{ 
    root = addHelper(root, value); 
} 



void printInorder() 
{ 
    printHelper(root); 
} 


}; 

int main() 
{ 
    cout << "Second Test, linux runnning sucsesfully"<<endl; 
    BST mytree; 
    mytree.add(20); 
    mytree.add(25); 
    mytree.add(10); 
    mytree.add(22); 
    mytree.add(15); 
    mytree.add(12); 
    mytree.add(23); 

    mytree.printInorder(); 
    return 0; 
} 

です。あなたがこれを修正する方法を知っていれば私を助けてください。 ありがとうございます

答えて

1

以下のようなコードがCertianlyはいデータメンバrootで変更を使用し、すべてのユースケースは、いくつかの要求の場合は、問題

public: 
BST(){ 
    root = new node(); 
} 

ため

ソリューションを初期化されていませんコンストラクタの操作を増やすと、読みやすさの点で優れた初期化子リストを使用することもできます。アドオンを追加するだけで、イニシャライザーリストを使用して、常にconstreferenceを初期化する必要があります。

または初期化子リスト

public: 
BST(node* root):root(root){ 
    //Any other initialization /Operation 
} 

あるいはそれにNULLを与える使用して(またはnullptrを、最新のC++標準で)。ここ

public: 
BST() : root(NULL) { } 

私たちのデフォルトのctorのは、(必要に応じてnullptrと交換)それはNULLになり、第二のコンストラクタは、渡された値で初期化されます。..

+0

また、初期化子リスト@Milindの呼び出し – CMouse

0

root変数を使用する前に初期化しません。コンストラクタで次のように初期化することができます。

public: 
BST(){ 
    root = new node(); 
} 
+1

すべてのユースケースは、コンストラクタでいくつかのより多くの操作が必要で、場合読みやすくするためのイニシャライザリストを使用することもできます。アドオンだけで、イニシャライザのリストを使って常に 'const'と' reference'を初期化する必要があります。 –

0

解決方法は、ルートをNULLとして初期化するだけです。 [そこには何も割り当てないでください。] コンストラクタは

BST() { 
    root = NULL; 
} 

以下のようにも根は我々が今までそれを変更すべきではない一度だけ作成されなければならないしなければなりません。だから、

if (root == NULL) { 
    root = addHelper(root, value); 
    } else { 
    addHelper(root, value); 
    } 
関連する問題