#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
struct node{
char *name;
struct node *lchild;
struct node *rchild;
}*root;
void find(char *str,struct node **par,struct node **loc)
{
struct node *ptr,*ptrsave;
if(root==NULL)
{
*loc=NULL;
*par=NULL;
return;
}
if(!(strcmp(str,root->name)))
{
*loc=root;
*par=NULL;
return;
}
if(strcmp(str,root->name)<0)
ptr=root->lchild;
else
ptr=root->rchild;
ptrsave=root;
while(ptr!=NULL)
{
if(!(strcmp(str,ptr->name)))
{
*loc=ptr;
*par=ptrsave;
return;
}
ptrsave=ptr;
if(strcmp(str,ptr->name)<0)
ptr=ptr->lchild;
else
ptr=ptr->rchild;
}
*loc=NULL;
*par=ptrsave;
}
void insert(char *str)
{
struct node *parent,*location,*temp;
find(str,&parent,&location);
if(location!=NULL)
{
printf("Name already present\n");
return;
}
temp=(struct node*)malloc(sizeof(struct node));
temp->name=str;
temp->lchild=NULL;
temp->rchild=NULL;
if(parent==NULL)
root=temp;
else
if(strcmp(str,parent->name)<0)
parent->lchild=temp;
else
parent->rchild=temp;
}
void displayin(struct node *ptr)
{
if(root==NULL)
{
printf("Tree is empty");
return;
}
if(ptr!=NULL)
{
displayin(ptr->lchild);
printf("%s -> ",ptr->name);
displayin(ptr->rchild);
}
}
int main()
{
root=NULL;
char str[20];
while(1)
{
printf("Enter name: ");
fflush(stdin);
gets(str);
insert(str);
printf("Wants to insert more item: ");
if(getchar()=='y')
insert(str);
else
break;
}
displayin(root);
getch();
getchar();
return 0;
}
如果我使用以下输入运行这段代码
勒凯什 拉杰什 BIMAL
然后,它将输出显示为&#34; bimal-&gt;&#34;这是错的。我不知道逻辑出错的地方。我交叉检查但不能发现错误。有人可以看看这个。
答案 0 :(得分:4)
其中一个问题:
在您正在执行的insert()
功能中
temp=(struct node*)malloc(sizeof(struct node));
temp->name=str; //this is not correct,
//do
temp=malloc(sizeof(struct node)); // no type cast for malloc
temp->name = strdup(str); //allocate memory too
//also check you NULL and free the allocated memory.
您只是在为要存储的字符串创建的节点中设置指针位置,但它指向str
的{{1}}数组。因此,所有节点都将指向相同的位置,该位置将输入最后一个值。在你的情况下是main()
。
答案 1 :(得分:3)
您的查找功能无论如何都非常模糊。这是改进版。
void find(char *str,struct node **par,struct node **loc)
{
*par = NULL;
*loc = NULL;
struct node *ptr,*ptrsave;
if(root==NULL) return;
if(!(strcmp(str,root->name)))
{
*loc=root;
return;
}
ptrsave = NULL;
ptr = root;
while(ptr!=NULL) {
if(!(strcmp(str,ptr->name))) break;
ptrsave = ptr;
if(strcmp(str,ptr->name)<0)
ptr=ptr->lchild;
else
ptr=ptr->rchild;
}
*loc=ptr;
*par=ptrsave;
}