二进制树在C崩溃

时间:2014-11-27 00:52:38

标签: c function crash binary-tree dynamic-memory-allocation

我开始在我的C类中进入二叉树。我理解二叉树的概念,但现在我试图更深入地了解它是如何工作的。我试图设置一个简单的二叉树,根据用户输入的内容改变大小。每当我运行程序时,它会在第一次输入后崩溃。有人能帮助我理解为什么吗?

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

typedef struct node
{
    int value;
    struct node *left;
    struct node *right;
}node;

void traverse(node *root);
void addnode (node *root, int nUser);
int checknode (node *root, int nUser);

int main (void)
{
    int nUser;
    node *root;
    root=(node *)malloc(sizeof(node));
    root->value=10;
    do
    {
        printf("Please enter any integer, enter 0 when done\n\n\n"); /*Program crashes when I enter the first value, unsure why*/
        scanf("%d",&nUser);
        if(!(checknode(root,nUser)))/*check node runs through the binary tree to find the data if it exists, returns 1 if exists, 0 if it doesn't*/
            addnode(root,nUser); /*add node runs through the binary tree, when it finds a place where the number will fit, that is a null pointer where the number can be placed it will create a new node with the value and null pointers on right and left*/
    }while(nUser);
    traverse(root);/*should traverse the tree and print out values*/
    return(0);
}

void traverse(node *root)
{
    printf("%d/n",root->value);
    if(root->left)
        {
         traverse(root->left);
        }
    if(root->right)
        {
         traverse(root->right);
        }
}

void addnode (node *root, int nUser)
{
if(root->value<nUser)
    if(root->right)
        {
         addnode(root->right,nUser);
        }
    else
        {
        node *temp;
        temp=(node *)malloc(sizeof(node));
        temp->value=nUser;
        root->right=temp;
        }
if(root->value>nUser)
    if(root->left)
        {
         addnode(root->left,nUser);
        }
    else
        {
        node *temp;
        temp=(node *)malloc(sizeof(node));
        temp->value=nUser;
        root->left=temp;
        }
}
int checknode (node *root, int nUser)
{
    if(!(root->value==nUser))
    {
        if(root->value<nUser)
            if(root->right)
                {
                 checknode(root->right,nUser);
                }
            else
                {
                 return(0);
                }
        if(root->value>nUser)
            if(root->left)
                {
                 checknode(root->left,nUser);
                }
            else
                {
                 return(0);
                }
    }
    else
    {
        return (1);
    }
}

2 个答案:

答案 0 :(得分:1)

我认为问题是当你将root传递给left时,root的rightaddnode指针是未初始化的。 malloc返回的缓冲区不保证为NULL。

尝试在循环开始之前将root->rightroot->left初始化为NULL。

答案 1 :(得分:0)

root=(node *)malloc(sizeof(node));

更改为:

root=(node *)calloc(1, sizeof(node));

您没有将root->leftroot->right清除为NULL,因此您使用的是未初始化的指针。您应该将所有malloc更改为calloc,或者需要在每个malloc之后将左右指针清除为NULL。