【问题标题】:Program crashes when inserting a node in a binary tree在二叉树中插入节点时程序崩溃
【发布时间】:2017-10-28 19:59:47
【问题描述】:

我创建了以下库来插入、删除、搜索和打印二叉树中的节点。

#include <stdlib.h>

struct NODE
{
    int code;
    char subject[20];
    struct NODE *left;
    struct NODE *right;
};


void InOrder(struct NODE *R)
{
    if (R==NULL)
    return;
    InOrder(R->left);
    printf("%d %s\n",R->code,R->subject);
    InOrder(R->right);
}

void PreOrder(struct NODE *R)
{
    if (R==NULL)
    return;
    printf("%d %s\n",R->code,R->subject);
    InOrder(R->left);
    InOrder(R->right);
}

void PostOrder(struct NODE *R)
{
    if (R==NULL)
    return;
    InOrder(R->left);
    InOrder(R->right);
    printf("%d %s\n",R->code,R->subject);
}

struct NODE *Search(struct NODE *R,int CODE,struct NODE **father)
{
    if(R==NULL)
    return NULL;
    if(R->code==CODE)
    {
        *father=R;
        return R;
    }
    if (CODE<R->code)
    return Search(R->left,CODE,father);
    else
    return Search(R->right,CODE,father);
}

struct NODE * CreateNode(struct NODE T)
{
    struct NODE *tmp;
    tmp=(struct NODE *)malloc(sizeof(T));
    *tmp=T;
    tmp->left=tmp->right=NULL;
    return tmp;
}

int Insert(struct NODE **R,struct NODE ND)
{
    struct NODE *cur,*fath=NULL;
    cur=Search(*R,ND.code,&fath);
    if (cur)
    return 0;
    cur=CreateNode(ND);
    if(fath==NULL)
    *R=cur;
    else
    if(fath->code>ND.code)
    fath->left=cur;
    else
    fath->right=cur;
    return 1;
}

struct NODE *MinOfMax (struct NODE *ND)
{
    struct NODE *tmp;
    if (ND==NULL)
    return NULL;
    if(ND->right==NULL)
    return NULL;
    tmp=ND->right;
    while(tmp->left!=NULL)
    tmp=tmp->left;
    return tmp;
}

struct NODE* Delete(struct NODE *R, int code)
{
    if (R==NULL) 
    return R;
    if (code<R->code)
    R->left=Delete(R->left,code);
    else if (code>R->code)
    R->right=Delete(R->right,code);
    else
    {
        if (R->left==NULL)
        {
            struct NODE *temp=R->right;
            free(R);
            return temp;
        }
        else if (R->right==NULL)
        {
            struct NODE *temp=R->left;
            free(R);
            return temp;
        }
        struct NODE *temp=MinOfMax(R->right);
        R->code=temp->code;
        R->right=Delete(R->right,temp->code);
    }
    return R;
}   

当我尝试在二叉树中插入一个节点时,程序崩溃了。这是我的主要内容:

 int main(int argc,char* argv[])
{
    typedef struct NODE NODE;
    NODE *root=NULL;
    NODE tmp;
    Insert(&root,tmp);
    return 0;
}

我尝试分配静态值(例如 code=100 和 subject="Physics")但程序仍然崩溃。我应该 malloc 一些东西,更改我的头文件中的任何东西还是做一些完全不同的事情?我被困在这里几个小时没有找到任何解决方案。大多数插入函数假设我只有一个整数作为节点中的数据,但我需要传递整个节点。

【问题讨论】:

  • in main root 未初始化。 (tmp 也是如此)
  • 请添加程序的输出,人们可以为您提供更好的信息:)
  • @wildplasser 我应该如何初始化它?我应该 malloc 根节点吗?
  • 它是一个指针。它应该指向这样的东西,或者是NULL。顺便说一句:您的 Search() 和 Insert() 函数中还有一些错误)
  • @wildplasser 你能指出我的错误吗?我付出了很多努力来创建这个头文件。

标签: c pointers data-structures segmentation-fault binary-tree


【解决方案1】:

您的代码基本上什么都不做。看来您是从某个地方复制粘贴的。我试图弄清楚,这是一个代码示例。基本上,当您尝试插入一个新节点时,您必须在主节点中初始化它。 请注意,这只是一个示例,我没有进行完整的测试。

int main(int argc,char* argv[])
{
    typedef struct NODE NODE;
    NODE *root=NULL;
    NODE *tmp = malloc(sizeof(struct NODE));
    tmp->code = 1; /*Just a number*/
    strcpy(tmp->subject,"prova"); /*Put something in it*/
    Insert(&root,*tmp); /* Try to insert it*/
    PreOrder(root); /*Try to see if it has been inserted*/
    return 0;
}

【讨论】:

  • 感谢您的回答,我没有将根指针初始化为NULL是我的错。现在我的程序可以正常工作了。
  • @JohnM。你应该把答案标记为正确的家伙。
【解决方案2】:

您的tmp 节点(将成为新插入的节点)在您的main() 中使用未初始化。如果您使用了 -Wall 标志,您的编译器可能会警告您。

那么让我们看看你的插入函数:

int Insert(struct NODE **R, struct NODE ND)
{
    struct NODE *cur,*fath=NULL;
    cur = Search(*R, ND.code, &fath); // ND.code is junk, since ND is uninitialized
    ...
    return 1;
}

这可能导致分段错误。

root也是,你可以在main()中初始化为NULL


不是你问题的原因,而是Do I cast the result of malloc? 没有。

【讨论】:

  • 编译器通常不会诊断未初始化值的使用(我一直在 Valgrind 中找到)
  • 我明白,但我想我需要在插入函数之外初始化它,对吧?
  • @PaulStelian 正确,请参阅我的更新答案!是的,约翰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多