二进制搜索树崩溃

时间:2011-11-19 00:43:46

标签: c++ crash binary-tree runtime-error

我正在用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

2 个答案:

答案 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;为什么。还要记得确切地看到代码崩溃的地方。获取尽可能多的关于崩溃的信息,而不是仅仅说“笨拙,它崩溃了!”。

最好的问候:)