我是一名初学程序员(刚刚开始),我正在为二元搜索树编写一些代码以获得乐趣。 出于某种原因,每当我调用此追加函数时,我的程序就会崩溃。它与两个函数本身之一有关,而不是头文件或包含main()的源文件中的任何其他函数。顺便说一句,Leaf只是一个带有int值的结构,以及两个名为left和right的Leaf指针。
崩溃时没有输出错误。
Leaf* BinarySearchTree::GetLeaf(int x,Leaf*a)
{
int key = a->value;
cout <<key<<"\n";
if(x > key)
{
if(a->right == NULL)
{
Leaf* newleaf = new Leaf();
newleaf->value = x;
a->right = newleaf;
return newleaf;
}
else if (a->right != NULL)
{
return a->right;
}
}
else if(x< key)
{
if(a->left == NULL)
{
Leaf* newleaf = new Leaf();
newleaf->value = x;
a->left = newleaf;
return newleaf;
}
else if (a->left != NULL)
{
return a->left;
}
}
else if(x == key)
{
//tbc
}
}
void BinarySearchTree::Append(int x)
{
if(root != NULL)
{
Leaf* current = root;
while(current->value != x)
{
current = BinarySearchTree::GetLeaf(x,current);
cout<<"value: "<<
current->value;
}
}
else
{
cout <<" No ROOT!";return;
}
}
如果您想查看我的主要(来源)文件,请转到此处(因为我不想发布此帖子) http://pastebin.com/vrh7KkMm
如果要查看头文件的其余部分,这两个函数所在的位置, http://pastebin.com/ZGWewPdV
答案 0 :(得分:1)
在BinarySearchTree构造器中,您首先开始访问root而不为其分配内存。这可能是你的崩溃。尝试添加
root = new Leaf()
在构造函数的开头。
编辑 - 更多信息:
C ++不会自动为您的成员变量设置值,您通常需要手动初始化它们。 (c ++ 11确实允许你在声明中这样做)。这意味着您未设置为值的任何变量都将包含垃圾值。如果您将此垃圾值用作指针,则很可能会崩溃。
在您的情况下,最初的问题之一是LinkedList类在开始引用它之前没有在构造函数中初始化其根成员变量。
BinarySearchTree也存在同样的问题。
学习使用调试器是学习编程时可以做的最好的事情之一。它允许您一次一行地执行代码并查看每个变量的值。这使我很容易看到事情没有按计划进行。您使用哪种调试器取决于您的平台。
答案 1 :(得分:0)
如果使用GetLeaf()
调用x == key
,则该函数既不返回nullptr
也不返回有效指针。这是一个潜在的崩溃源。无论如何,你需要返回一些合理的东西。
更新:不要忘记在其构造函数中正确初始化Leaf结构(所有三个成员)。
UPDATE2:也正确初始化你的root。我会用nullptr初始化它并以一种方式更改append函数,如果root == nullptr,它会创建第一次离开。