2017-06-21 47 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); 
    }