如何在C中的二叉树中释放已分配的内存

时间:2015-02-24 19:59:15

标签: c tree malloc binary-tree free

我的C程序中的函数出现问题。该计划的目的是:

  • 将二进制文件中的整数读入数组
  • 使用二叉树对这些数字进行排序
  • 做其他一些事情
  • 释放使用malloc();
  • 分配的所有内存

除了能够释放我的二叉树之外,我已经完成了所有工作。这是树和节点的结构(a.k.a. leaf)。

typedef struct Node *NodeP;
typedef struct Tree *TreeP;

// Definition of a tree
    struct Tree
    {
        NodeP root;
    }Tree;

    // Definition of a node
    struct Node
    {
        int data;
        NodeP L, R;
    }Node;

在我的程序中,我使用malloc为我的树和每个单独的节点分配内存。所以我调用一个函数来释放树及其所有节点。

/*
 * Frees the memory allocated for
 * each node
 */
void freeNode(NodeP p)
{
    if(p == NULL) return;
    freeNode(p->L);
    freeNode(p->R);
    free(p);
}

/*
 * Frees the memory allocated
 * for the tree
 */
TreeP freeTree(TreeP tree)
{
    if(tree->root == NULL)
        free(tree);
    else
    {
        freeNode(tree->root);
        free(tree);
    }

    return NULL;
}

当我运行这个程序时,我的调试器给了我这个错误。

EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

我试过精神上经历了递归的每次迭代,我找不到为什么它会给我一个错误。我认为它在边缘情况下从树的边缘掉下来了?我不确定。非常感谢任何帮助!

编辑:

这是下载完整程序的链接。我包含了README和我正在使用的二进制文件。一个长度只有10个整数,另一个长度为20000个。感谢您的帮助!

https://copy.com/902v0bMv8DtIMUrc

1 个答案:

答案 0 :(得分:3)

这里有困惑:

// Definition of a tree
struct Tree
{
    NodeP root;
}Tree;

// Definition of a node
struct Node
{
    int data;
    NodeP L, R;
}Node;

上面的定义定义了变量,而不是类型!

这里有一个错误:

TreeP newTree()
{
    TreeP tree = (TreeP) malloc(sizeof(TreeP));
    tree->root = NULL;
    return tree;
}

应该阅读TreeP tree = malloc(sizeof(struct Tree));。一个很好的例子,说明为什么输入结构指针是一个坏主意。由于Tree只保存一个指针,因此不会引起任何问题,但应该修复它。

这是 THE 错误:

/*
 * Creates a new node in the tree
 */
void insertTreeNode(TreeP tree, int data)
{
    NodeP p = tree->root;
    Boolean b = FALSE;

    /*  Creates a node and tests for errors  */
    NodeP node = (NodeP) malloc(sizeof(Node));
    if(node == NULL)
        fprintf(stderr, "Memory allocation failed! \n");
    else
    {
        node->data = data;
        node->L = NULL;
        node->R = NULL;

        /*  Inserts in empty tree case  */
        if(tree->root == NULL)
            tree->root = node;
        else
        {
            /*  Inserts in any other case  */
            while(p != NULL && b != TRUE)
            {
                if(node->data >= p->data)
                {
                    if(p->R == NULL)
                    {
                        p->R = node;
                        b = TRUE;
                    }
                    else p = p->R;
                }
                if(node->data <= p->data) // replace this line with else
                {
                    if(p->L == NULL)
                    {
                        p->L = node;
                        b = TRUE;
                    }
                    else p = p->L;
                }
            }
        }
    }
}

您必须将新节点链接到节点p的左侧或右侧,但如果p->data == data,则必须不在两个子树中。

可能还有其他错误,但是这个错了!