我正在用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将用户输入转换为整数,然后将它们添加到地图中。然后我得到地图的大小并使用它来填充元素的数组。现在,当我遍历数组并尝试使用add函数将数组元素传递给树时,它正在崩溃程序。当我尝试添加固定数组元素时,该程序工作正常。例如:
int data [] = {6,7,8,9};
如果我在main中有这个固定数组并传递要添加的元素,它工作正常,这让我觉得add方法没有问题。请帮我找到问题,很困惑
整个程序的Pastebin链接:http://pastebin.com/SWqTccJf
答案 0 :(得分:3)
在C ++中你不能使用
int data[size];
在编译时不知道size
。使用
int * data = new int[size];
// use data
delete [] data; // remember to delete
或者,由于这是C ++,请使用std::vector
std::vector<int> data(size);
答案 1 :(得分:3)
我认为Tyler Hyndman是正确的,它不是标准的C ++。但是,例如g ++确实支持这种C99-ish“语言扩展”。它并没有消除这样一个事实,即在堆栈上分配数组通常是一种不好的做法,它的大小在编译时是未知的,实际上可能非常大。
我的猜测是代码中存在一个尚未提供的错误。一些涉及内存/指针问题的错误可能会被屏蔽,具体取决于内存的内容,这可能会让他们感到沮丧。无论如何,我没有看到提供的代码中的错误。我会注意它崩溃的确切位置,以及程序崩溃时的状态是什么。
为获得最佳帮助,请提供最少(但足够)的代码来重现问题。如果看起来太多,可能会使用pastebin吗?
//编辑// 好的,我查看了您的完整代码清单。
见revised code。主要区别:
1)您在清除树的代码中有一个错误。不应在此处调用Tree :: del(),因为它用于删除特定值。它必须找到要删除的节点,然后处理各种特殊情况。当您擦除树的内容时,您可以继续并递归删除所有节点。简单&amp;快!
2)我将两个查找功能统一为一个。
3) Tree :: del中存在一个错误,其中被删除的节点是根。删除根节点时,parent将为NULL ...
4)从输入读取数字的逻辑已更改。
我希望你能学习代码&amp;看看有什么变化&amp;为什么。还要记得确切地看到代码崩溃的地方。获取尽可能多的关于崩溃的信息,而不是仅仅说“笨拙,它崩溃了!”。
最好的问候:)