二叉树分段故障(核心转储)

问题描述 投票:0回答:1
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 个单词加载到树中。遗憾的是,在“打印”这棵树的过程中,我遇到了一个核心转储的问题。我不知道为什么,但其中一个结构体“有”(*korzen)->left 不为 NULL,我的函数想要访问它,并且出现了核心转储。添加两行后

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

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

(*korzen)->hmanyt=1;

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

c tree binary-tree coredump
1个回答
1
投票

NULL
分配给您想要
free
的指针是一个坏主意。更改函数中
*korzen=NULL;
free(*korzen);
的位置
erease
:

调整你的功能

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;
}

如果在树中插入一个新节点,则必须使用

(*korzen)->left
初始化其子节点
(*korzen)->right
NULL
。此外
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 ;
}
© www.soinside.com 2019 - 2024. All rights reserved.