【问题标题】:Loop insert binary tree循环插入二叉树
【发布时间】:2015-05-16 07:36:43
【问题描述】:

我试图弄清楚如何将大量数字插入二叉树。 该程序首先询问一个数字,然后在用户输入的任何数字中插入 0。我的程序可以工作,但它开始在 40,000 左右崩溃,出现错误: 进程返回-1073741571(0XC00000FD)

我是 C 和内存管理的新手,但我相信问题出在那儿。有什么建议吗?

#include<stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct node BSTREE;

struct node
{
    int data;
    struct node * left;
    struct node * right;
};

void insert(BSTREE ** root, int number);

 int main()
{

    BSTREE *root = malloc(sizeof *root);
    BSTREE *tmp = malloc(sizeof *root);
    root = NULL;
    int x;
    int input;

    FILE *fp;
    fp=fopen("c:\\test2.txt", "w");


    printf( "Please enter a number: " );
    scanf( "%d", &input );

    for ( x = 0; x < input; x++ )
    {
    insert(&root, x);
    }
    printf("%d", x);
    free(root);

    fclose(fp);

    }

void insert(BSTREE ** root, long int number)
{

    BSTREE *temp = NULL;
    if(!(*root))
    {
        temp = (BSTREE *)malloc(sizeof(BSTREE));
        temp->left = temp->right = NULL;
        temp->data = number;
        *root = temp;
        return;
    }

    if(number < (*root)->data)
    {
        insert(&(*root)->left, number);
        free(root);
    }
    else if(number > (*root)->data)
    {
        insert(&(*root)->right, number);
        free(root);
    }
 free(root);
   }

【问题讨论】:

  • free(root); insert ??并且可能堆栈溢出。
  • long int number --> int number , BSTREE *root = malloc(sizeof *root); BSTREE *tmp = malloc(sizeof *root); root = NULL; 内存泄漏。

标签: c loops memory memory-management out-of-memory


【解决方案1】:

每次调用插入时,您都调用了两次free(root)。在insert 返回后立即执行一次。然后立即再次在同一个节点上。而且您似乎总是在释放您刚刚插入的节点。因此,您的记忆可能已损坏,并且恰好在小树上起作用。随着树变大,内存开始重新分配,树损坏变得更加明显。

这是一个建议的更简单的解决方案。它更冗长,但在一个函数中处理 malloc 和 free,而核心递归插入在另一个函数中完成。希望这会有所帮助。

extern int insert_node(BSTREE* root, BSTREE* node);

void insert(BSTREE** root, int number)
{
    /* allocate a node for our number to be inserted */
    BSTREE* node = malloc(sizeof(BSTREE));
    node->data = number;
    node->left = NULL;
    node->right = NULL;
    int insert_result;

    if (*root == NULL)
    {
        /* handle the empty tree case */
        *root = node;
        return;
    }

    insert_result = insert_node(*root, node);

    if (!insert_result)
    {
        /* insert_node returned false.
           This means it already had a duplicate of the node 
           in the tree. Just free it since it did not get inserted
        */
        free(node);
        node = NULL;
    }

}

int insert_node(BSTREE* root, BSTREE* node)
{
    int result = 1; /* success */

    if (node->data < root->data)
    {
        /* traverse left */
        if (node->left != NULL)
        {
            result = insert_node(root->left, node);
        }
        else
        {
            root->left = node;
        }
    }
    else if (node->data > root->data)
    {
        /* traverse right */
        if (node->right != NULL)
        {
            result = insert_node(root->right, node);
        }
        else
        {
            root->right = node;
        }
    }
    else
    {
        /* else node is equal to root - nothing to do */
        /* return 0 to indicate the node should be free'd by the caller*/
        result = 0;
    }

    return result;
}

【讨论】:

  • 感谢您的回复。是否可以发布您的完整结果我仍在努力了解它是如何工作的
  • 你说的我的完整结果是什么意思?用我上面提供的代码替换您的 insert 函数。将上面的 insertinsert_node 函数复制到您的程序中,并删除您对 insert 的实现
  • 我试过了,但你的代码总是在结果中给我一个 5 位数字,所以我想我可能遗漏了一些东西。
  • 因为在node 被分配了malloc 之后我忘记分配node-&gt;data。我修复了上面的代码示例。
猜你喜欢
  • 2015-02-13
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多