gpt4 book ai didi

c - 二叉树段错误(核心已转储)

转载 作者:太空宇宙 更新时间:2023-11-04 03:33:07 25 4
gpt4 key购买 nike

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 个单词加载到树中。可悲的是,在“打印”这棵树的过程中,我遇到了一个核心转储的问题。我不知道为什么,但是其中一个结构“有”(*ko​​rzen)->left 不是 NULL,我的函数想要访问它,并且核心转储出现了。添加两行后

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

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

(*korzen)->hmanyt=1;

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

最佳答案

NULL 分配给您想要释放 的指针是个坏主意。更改 *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 >空。此外 drzewo 的类型是 struct Tree*,因此 sizeof(drzewo) 给出指针的大小而不是 struct 的大小树

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

关于c - 二叉树段错误(核心已转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34619236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com