如何释放我树的所有节点?

时间:2016-12-16 11:47:07

标签: c recursion tree

我想在C中释放一棵大树。每个人可以有12个儿子。但是当我执行这段代码时,没有删除任何节点,我的计算机变慢了,并且在段故障后2-3分钟就结束了

void freeTheNodes(node_t *n)
{
    for (int i = 0; i < 13; ++i) {
        if (n->children[i] != NULL) {
            freeTheNodes(n->children[i]);
        }
    }
    free(n);
}

您是否了解我的代码无效的原因?

2 个答案:

答案 0 :(得分:3)

for (int i = 0; i < 13; ++i) 

将释放13个节点。将其更改为

for (int i = 0; i < 12; ++i)

答案 1 :(得分:3)

你说每个节点可以有12个孩子,但你试图删除13.这可能会解决你的一些问题。

也可能是您的树首先被腐败了 - 我们无法分辨,因为您没有提供该代码。

您的代码假定children不为空 - 请确保这适用。

我很想把它写成:

void freeTheNodes(node_t *n)
{
    if(n != NULL) {
       for (int i = 0; i < CHILD_COUNT; ++i) {
          freeTheNodes(n->children[i]);
       }
       free(n);
    }
}

...只是因为它稍微简单一些(以递增更深层次的代价为代价)。

逐步调试您在调试器中运行的代码,看看它是否符合您的预期,并检查实际变量的实际内容。

使用electricfence之类的工具也是一个好主意,这会导致程序在尝试读取/写入外部分配的内存时立即失败。我怀疑使用electricfence你的程序会很快出错,而不是在失败之前运行几分钟。