C语言 二叉树分割故障(核心转储)

ryoqjall  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(80)
struct Tree{
    char string[30];
    int hmanyt;
    struct Tree * left;
    struct Tree * right;
};
typedef struct Tree * drzewo;
void printftree(drzewo* korzen)
{
    if((*korzen)->left != NULL)
        printftree(&((*korzen)->left));
    printf("%s(%d)\n",(*korzen)->string,(*korzen)->hmanyt);
    if(strcmp((*korzen)->string,"boril\0")==0)
        (((*korzen)->right)->left)->left=NULL;
    if((*korzen)->right != NULL)
        printftree(&((*korzen)->right));
    return ;
}
void erease(drzewo* korzen)
{
    if((*korzen)->left==NULL && (*korzen)->right==NULL)
    {
        *korzen=NULL;
        free (*korzen);
        return ;
    }
    else
    {
        if((*korzen)->left !=NULL)
        {
            erease(&((*korzen)->left));
            (*korzen)->left=NULL;
            free((*korzen)->left);
        }
        if((*korzen)->right !=NULL)
        {
            erease(&((*korzen)->right));
            (*korzen)->right=NULL;
            free((*korzen)->right);
        }
    }
    *korzen=NULL;
    free(*korzen);
    return ;
}
void add(drzewo* korzen,char word[])
{
    while(*korzen!=NULL)
    {
        if(strcmp((*korzen)->string,word)==0)   {
            ((*korzen)->hmanyt)++;
            return; }
        else if(strcmp((*korzen)->string,word)<0)   {
            korzen=&((*korzen)->right); }
        else if(strcmp((*korzen)->string,word)>0)   {
            korzen=&((*korzen)->left);
                }
    }
    *korzen=(drzewo) malloc(sizeof(drzewo));
    strcpy(((*korzen)->string),word);
    printf("%p",(*korzen)->left);
    printf("%p\n",(*korzen)->right);
    (*korzen)->hmanyt=1;    
    return;
}
int main()
{
    drzewo korzen =NULL;
    char *words[10]={"alfabet","borixon","aaaaaa","zombie","bobas","kamil","agnieszka","kokos","zamach"};
    for(int i=0;i<9;i++)
        add(&korzen,words[i]);
    printf("test1\n");
    printftree(&korzen);
    printf("test");
    erease(&korzen);
    return 0;
}

字符串
这是我实现的二叉树。它加载了10个单词到树中。可悲的是,在'打印'这个树的过程中,我遇到了一个核心转储的问题。我不知道为什么,但是其中一个结构“has”(*korzen)->left不是NULL,我的函数想访问它,核心转储出现了。添加两行后,

if(strcmp((*korzen)->string,"boril\0")==0)
    (((*korzen)->right)->left)->left=NULL;


它工作正常,但我不知道为什么我有这个问题.另一个问题是,尽管有这样一行:

(*korzen)->hmanyt=1;


毕竟它没有这个值.(只有第一个词有hmanyt==1).帮助将是非常感谢。

eqoofvh9

eqoofvh91#

NULL赋值给一个你想要指向free的指针是一个坏主意。在你的函数erease中改变*korzen=NULL;free(*korzen);的位置:
像这样修改你的函数erease

void erease(drzewo* korzen)
{
    if ( *korzen == NULL )
        return;

    if( (*korzen)->left !=NULL )
    {
        erease(&((*korzen)->left)); // (*korzen)->left is freed in erease
    }
    if( (*korzen)->right !=NULL )
    {
        erease(&((*korzen)->right)); // (*korzen)->right is freed in erease
    }
    free(*korzen);
    *korzen=NULL;
    return;
}

字符串
如果你在树中插入一个新节点,你必须用NULL初始化它的查尔兹(*korzen)->left(*korzen)->right。此外,drzewo的类型是struct Tree*,所以sizeof(drzewo)给出的指针大小不是struct Tree的大小。

void add(drzewo* korzen,char word[])
{
    while( *korzen != NULL )
    {
        int cmp = strcmp( ( *korzen )->string, word );
        if ( cmp == 0 )
        {
            ((*korzen)->hmanyt)++;
            return;
        }
        else if( cmp<0 ) {
            korzen=&((*korzen)->right);
        }
        else if (cmp>0 ) {
            korzen=&((*korzen)->left);
        }
    }
    // allocate new node and initiialize
    *korzen=malloc(sizeof(struct Tree)); // allocat sizeof struct Tree ( not sizeof pointer to Tree) 
    ( *korzen )->left = NULL;  // <- left child is null
    ( *korzen )->right = NULL; // <- right child is null
    strcpy(((*korzen)->string),word);
    (*korzen)->hmanyt=1;    
    return;
}


最后是函数printftree

void printftree(drzewo* korzen)
{
    if ( *korzen == NULL )
        return;
    if( (*korzen)->left != NULL)
        printftree(&((*korzen)->left));
    printf("%s(%d)\n",(*korzen)->string,(*korzen)->hmanyt);
    if((*korzen)->right != NULL)
        printftree(&((*korzen)->right));
    return ;
}

相关问题