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

时间:2016-01-05 18:55:19

标签: c tree binary-tree core

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个字加载到树上。可悲的是在打印期间&#39;这棵树我遇到了一个核心倾销的问题。我不知道为什么,但其中一个结构&#34;有&#34; (* korzen) - &gt;离开那不是NULL,我的功能想要获取它,并且核心转储出现。添加两行后

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

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

(*korzen)->hmanyt=1;

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

1 个答案:

答案 0 :(得分: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)->rightNULL。此外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 ;
}