2014-10-02 81 views
-1

我試圖創建在C++一個簡單的二叉搜索樹類,但每當我打電話給我的插入功能:C++ - 函數調用的分割錯誤?

template<typename T> 
void BSTree_Fast<T>::insert(T & key) 
{ 
    cout<<"working"; 
    int i=0; 
    BSTNode<T> *newNode=new BSTNode<T>(key); //Initializing pointer to newNode with key as Key 
    if(maxDepth==0){    //if tree is empty, sets root to new node 
    root=newNode; 
    setMaxDepth(1); 
    } 
    BSTNode<T> *curr=root;   //Traversal unit curr 
    if(key==curr->getKey()){   //checking if inserted key is same as root key 
    int n=curr->getNum(); 
    n++; 
    curr->setNum(n); 
    delete(newNode); 
    } 
while(key!=curr->getKey()){   //first while loop when above is not true 
    if(key<curr->getKey()){   //checks left if key < current key 
    if(curr->getLeft()==NULL){  //if cannot traverse left, creates new node to left of current 
     curr->setLeft(newNode); 
     if(i>maxDepth){ 
      cout<<i; 
      setMaxDepth(i); 
     } 
     break; 
    } 
    else if(curr->getLeft()->getKey()==key){//if left child equals input key, increase number 
     int n=curr->getLeft()->getNum(); 
     n++; 
     curr->getLeft()->setNum(n); 
     delete(newNode); 
     break; 
    } 
    else{ 
     i++; 
     curr=curr->getLeft();  //traverses left 
    } 
    } 
    if(key>curr->getKey()){   //checks right if key > current key 
    if(curr->getRight()==NULL){  //if cannot traverse right, creates new node to right 
     curr->setRight(newNode); 
     if(i>maxDepth){ 
      setMaxDepth(i); 
     } 
     break; 
    } 
    else if(curr->getRight()->getKey()==key){//if right child equals input key, increase number 
     int n=curr->getRight()->getNum(); 
     n++; 
     curr->getRight()->setNum(n); 
     delete(newNode); 
     break; 
    } 
    else{ 
     i++; 
     curr=curr->getRight();  //traverses to right 
    } 
    } 
} 
} 

但是它打電話時似乎打了一個段錯誤之前的任何實際的代碼可以實現它帶有從文件讀入的字符串。

+0

輸出可能是行緩衝。你有沒有試過在函數的開頭添加一個換行符 - 「<< endl」 - 你的日誌語句?代碼後面有很多地方可能導致段錯誤(例如,如果第一次插入時'root'爲空)。您需要自己進一步調試或提供完整的可運行示例以獲得更具體的幫助 – simonc 2014-10-02 16:41:49

+3

您忘記提問了。當你按下「提問問題」按鈕時,你應該會詢問具體的問題。你講了一個故事,然後停下來,讓我們猜測你的實際問題是什麼。它可能來自「什麼是分段錯誤?」到「我的代碼看起來是否合理?」。 – 2014-10-02 16:44:38

回答

4

漫步加入的第一個節點的過程:

BSTNode<T> *newNode=new BSTNode<T>(key); //Initializing pointer to newNode with key as Key 
    if(maxDepth==0){    //if tree is empty, sets root to new node 
    root=newNode; 
    setMaxDepth(1); 
    } 

嗯哦,這裏沒有return。所以在設置了root=newNode後,我們繼續。

BSTNode<T> *curr=root;   //Traversal unit curr 
    if(key==curr->getKey()){   //checking if inserted key is same as root key 
    int n=curr->getNum(); 
    n++; 
    curr->setNum(n); 
    delete(newNode); 
    } 

顯然鍵將匹配。所以我們剛剛刪除了newNode,這也是rootcur

while(key!=curr->getKey()){ 

Ooops,我們訪問我們剛剛刪除的curr