2013-11-25 59 views
0

我目前正在寫一個二叉搜索樹來保存我想按名稱排列的歌曲列表。我按照慣例遞歸,使用strcmp比較樹的當前節點(歌曲是節點)的標題和要添加的歌曲的標題。該代碼在達到Song的get_title函數時會發生seg錯誤,它僅返回一個char *。我可能在這裏忽略了一些明顯的東西,但我很難過。我試圖解決它沒有結果。也許你可以幫助我。我對二叉搜索樹的代碼如下:二叉搜索在一個陌生的地方樹seg故障

#include "BSTree.h" 

BSTree::BSTree() { 
next = NULL; 
root = NULL; 
} 

BSTree::BSTree(const BSTree& src) { 
next = src.next; 
root = src.root; 
} 

BSTree::~BSTree() { 
next = NULL; 
root = NULL; 
} 

void BSTree::add(Song& s) { 
root = add_r(root, s); 
} 

Song* BSTree::add_r(Song* curr, Song& song) { 
if(curr = NULL) { 
Song* temp = new Song(song); 
curr = temp; 
cout << "added a new song" << endl; 
return curr; 
} else if(strcmp(song.get_title(), curr->get_title()) <= 0) { 
cout << "went left" << endl; 
curr->set_left(add_r(curr->get_left(), song)); 
} else { 
cout << "went right" << endl; 
curr->set_right(add_r(curr->get_right(), song)); 
} 
} 

回答

3

此行這裏:

你想用==。目前,您的代碼將curr更改爲NULL,然後評估爲false。所以控制傳遞給下一個if,它在NULL指針上調用curr->get_title()。在程序到達任何調試語句之前,結果是段錯誤。

+0

作爲一個額外的觀察,並不是所有'add_r'函數中的控制路徑都返回一個值。你*必須*在函數結尾處返回'curr',否則你會損壞你的樹。您可能還想考慮使用不區分大小寫的比較(stricmp),並考慮如果插入的歌曲與樹中已有的歌曲具有相同的名稱,該如何操作。 – paddy