好的,所以我正在完成一项任务并为了我的生活,我无法弄清楚为什么我会遇到这些分段错误。我仍然在学习c ++,编程一般,所以我希望有人比我更聪明可以帮助我。该程序是一个自组织的二叉搜索树,直到现在我并没有太多困难。这是我用来测试我的班级BST的主程序的开始,我不能改变mian程序,因为它是一个赋值。
int main() {
string input;
// get a list of integer values
cout << "Enter a list of integer values in one line: ";
getline(cin, input);
cout << "\n**CHECKPOINT 1**\n";
// create a binary search tree
BST<int> bst1(input);
if (!bst1.empty()) {
cout << "\n**CHECKPOINT 2**\n";
cout << "Inorder traversal: ";
bst1.printInOrder();
cout << "Level order traversal: ";
bst1.printLevelOrder();
我还没有通过printInOrder()函数,这是
的代码template <typename T>
void BST<T>::printInOrder(BSTNode* t) const
{
if (t->left != NULL)
printInOrder(t->left);
std::cout << " " << t->data << " ";
if (t->right != NULL)
printInOrder(t->right);
}
当我添加一个快速的cout&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;对于printInOrder函数的第一行的“Something”,它的所有内容都将是打印行
cout << "Inorder traversal: ";
它还将开始打印树中的一些数字,最后再次给我一个分段错误。 :/
所以,如果有人能向我解释WTF正在进行中,我将非常感激。增加或减少一个简单的cout线不应该改变这样的事情吗?此外,我觉得有更好的方法来调试这个,如果有人有他们用来计算这些东西的技术,请分享:)提前谢谢!
编辑:我已经尝试过调试器GDB,我无法弄明白,但是我再也不是很熟悉调试器的高级功能,所以我可能错过了一些东西。 唯一运行的其他函数是从字符串输入构建的构造函数。从我从调试器中可以看出,构造函数似乎工作正常,但仍然是代码
template <typename T>
BST<T>::BST(const std::string input, int th)
{
threshold = th;
root = NULL;
T v;
// Make Input String Stream for easy use of >> operator
std::istringstream iss (input);
do
{
iss >> v;
insert(v, root);
}while(iss.good());
}
EDIT2:
这是我的插入功能的代码,感谢大家的帮助! :)
template <typename T>
void BST<T>::insert(const T& v, BSTNode *&t)
{
if(t == NULL)
{
t = new BSTNode;
t->left = NULL;
t->right = NULL;
t->data = v;
t->searchCount = 0;
}
else if( v < t->data )
insert(v, t->left);
else
insert(v, t->right);
}
答案 0 :(得分:1)
输出中明显缺少换行符。线缓冲通常意味着在遇到换行符之前您没有看到任何内容。
我将PrintOnOrder之后的行修改为: -
cout << "\nLevel order traversal: ";
答案 1 :(得分:0)
在构造函数中,即使读取v
的数据失败,您也会将iss >> v
插入树中。可能你更想要这样的东西:
while (iss >> v) {
insert(v, root);
}
但是,您的分段错误的真正原因可能在于insert()
,例如,如果该函数只是插入指向它接收到树中的(堆栈已分配)参数的指针。参数变量将超出函数末尾的范围(因此不再存在)。如果你只是将一个指向该变量的指针存储到树中,那么该指针将不再指向任何有用的东西。
答案 2 :(得分:0)
我在这里看不出任何错误。正如其他人指出的那样,输出缓冲可能意味着您的代码实际上成功完成了printInOrder(),然后在某个地方崩溃。