2017-06-21 70 views
0

朋友。所以我在ubuntu中使用vim作为我的编辑器创建了一个Binary Search Tree Class,当我运行我的程序时,我总是得到一个分段错误(core dump)错误。奇怪的是,当我在NetBeans上运行这个程序时,它完美运行。这是我的代码需要帮助修复分段错误(核心转储)

#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; 
} 

我已经使用了GDB调试,并指出我的错误就printHelper功能,但我看不到的错误。如果你知道如何解决这个问题,请帮助我。 预先感谢您

回答

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) { } 

我们这里默认的构造函数使得NULL(如果需要使用nullptr代替),第二个构造函数将与传递的值初始化它..

+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); 
    }