朋友。所以我使用vim作为编辑器在ubuntu中创建二进制搜索树类,当我运行程序时,我总是遇到分段错误(核心转储)错误。奇怪的是,当我在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函数上指出了一个错误,但我看不到错误。如果你知道如何解决这个问题,请帮助我。 提前谢谢你
答案 0 :(得分:1)
Certianly是的问题是数据成员root
已被使用而未初始化
问题的解决方案
public:
BST(){
root = new node();
}
如果用例在构造函数中需要更多操作,您还可以使用初始化列表,这在可读性方面是很好的。只是一个加载项,您应该始终使用初始化列表初始化const
和reference
。
或使用初始化列表
public:
BST(node* root):root(root){
//Any other initialization /Operation
}
或者给它一个NULL(或nullptr,在最新的C ++标准中)。
public:
BST() : root(NULL) { }
这里我们的默认ctor使它为NULL(如果需要,用nullptr替换),第二个构造函数将使用传递的值初始化它。
答案 1 :(得分:0)
在使用之前,您不会初始化root
变量。您可以在构造函数中将其初始化为:
public:
BST(){
root = new node();
}
答案 2 :(得分:0)
修复只是将root初始化为NULL。 [不要在那里分配任何东西。] 构造函数必须如下所示
BST() {
root = NULL;
}
根也只能创建一次我们不应该永远改变它。所以改变代码如下
if (root == NULL) {
root = addHelper(root, value);
} else {
addHelper(root, value);
}