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).帮助将是非常感谢。
1条答案
按热度按时间eqoofvh91#
将
NULL
赋值给一个你想要指向free
的指针是一个坏主意。在你的函数erease
中改变*korzen=NULL;
和free(*korzen);
的位置:像这样修改你的函数
erease
:字符串
如果你在树中插入一个新节点,你必须用
NULL
初始化它的查尔兹(*korzen)->left
和(*korzen)->right
。此外,drzewo
的类型是struct Tree*
,所以sizeof(drzewo)
给出的指针大小不是struct Tree
的大小。型
最后是函数
printftree
:型