我正在用 C++ 实现二叉搜索树 我有以下代码来向树中添加一个条目:
void tree::add(int n)
{
int found;
leaf *t,*parent;
findparent(n,found,parent);
if(found==YES)
cout<<"\nSuch a Node Exists";
else
{
t=new leaf;
t->data=n;
t->l=NULL;
t->r=NULL;
if(parent==NULL)
p=t;
else
parent->data > n ? parent->l=t : parent->r=t;
}
}
在我的主要任务中,我使用映射将从文本文件中读取的值存储为整数。现在,当我将值传递给 add 函数时,它会使程序崩溃。
int main()
{
tree t;
map<int,int> word;
map<int,int>::iterator count;
string str;
int num;
string space ="";
while((str=value(cin))!=space )
{
num = atoi(str.c_str());
++word[num];
}
int size = (int) word.size();
int data[size];
int x = 0;
for(count = word.begin(); count!=word.end(); ++count){
data[x] = (*count).first;
x = x+1;
}
for (int iter = 0; iter<size; iter++){
int x = 3 * data[iter];
t.add(x);
}
return 0;
}
我在这里所做的是,我使用 atoi 将用户输入转换为整数,然后将它们添加到 map 中。然后我得到 map 的大小并用它来用元素填充一个数组。现在,当我遍历数组并尝试使用 add 函数将数组元素传递给树时,它会使程序崩溃。当我尝试添加固定数组元素时,该程序运行良好。例如:
整数数据[] = {6,7,8,9};
如果我在我的 main 中有这个固定数组并传递要添加的元素,它工作正常,这让我觉得 add 方法没有问题。请帮我找到问题所在,我很困惑
整个程序的 Pastebin 链接:http://pastebin.com/SWqTccJf
最佳答案
我认为 Tyler Hyndman 是正确的,它不是标准的 C++。但是,例如 g++ 确实支持这种 C99 风格的“语言扩展”。它并没有消除这样一个事实,即在堆栈上分配大小在编译时未知的数组通常是一种不好的做法,而且实际上可能非常大。
我的猜测是代码中存在一个尚未提供的错误。一些涉及内存/指针问题的 bug 可以根据内存的内容被掩盖,这会让他们感到沮丧。无论如何,我在提供的代码中没有看到错误。我会注意它崩溃的确切位置,以及崩溃时程序的状态。
为获得最佳帮助,请提供最少(但足够)的代码来重现问题。如果看起来太多,也许可以使用 pastebin?
//EDIT// 好的,我查看了您的完整代码 list 。
查看此 revised code .主要区别:
1) 您在清除树的代码中存在错误。不应在此处调用 Tree::del(),因为它用于删除特定值。它必须找到要删除的节点,然后处理各种特殊情况。当您清除树的内容时,您可以继续递归地删除所有节点。简单快捷!
2) 我将你的两个查找功能合并为一个。
3) Tree::del 中存在错误,因为被删除的节点是根节点。当删除根节点时,parent 将为 NULL...
4) 从输入中读取数字的逻辑已更改。
我希望您能研究代码并查看更改内容和原因。还要记住准确查看代码崩溃的位置并获取尽可能多的有关崩溃的信息,而不是仅仅说“天啊,它崩溃了!”。
最好的问候:)
关于c++ - 二叉搜索树崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8190938/