二叉树的动态查找

qq_42576307 2018-07-04 08:06:10
输入12条字符串查找里面否含有字符串x。为什么无论x 是什么 都输出查找成功,代码中是哪部分错了?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node{
char *data;
struct node *lchild,*rchild;
}Btree;
typedef Btree *BiTree;
int InsertBiTree(Btree **root,char *x){
Btree *current=NULL,*parent=NULL ,*p;
current=*root;
while(current!=NULL){
if(strcmp(current->data,x)==0)
return 0;
parent=current;
if(strcmp(current->data,x)<0)
current=current->rchild;
else
current=current->lchild;
}
p=(Btree*)malloc(sizeof(Btree));
if(p==NULL){
printf("空间不够\n");
exit(1);
}
p->data=x;
p->lchild=NULL;
p->rchild=NULL;
if(parent==NULL)
*root=p;
else if(strcmp(x,parent->data)<0)
parent->lchild=p;
else
parent->rchild=p;
return 1;
}
int BiTreeSearch(Btree *root ,char *x){
Btree *current;
if(root!=NULL){
current=root;
while(current!=NULL){
if(strcmp(current->data,x)==0)
return 1;
if(strcmp(current->data,x)<0)
current=current->rchild;
else
current=current->lchild;
}
}
return -1;
}
int main(void){
Btree *s=NULL;
int i;
char ch[5];
printf("请输入元素:\n");
for(i=0;i<12;i++){
scanf("%s",ch);
InsertBiTree(&s,ch);
}
printf("请输入要查找的元素:");
scanf("%s",ch);
if(BiTreeSearch(s,ch)==-1)
printf("无此元素");
else printf("查找成功");
return 0;
}
...全文
177 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
老马何以识途 2018-07-05
  • 打赏
  • 举报
回复
問題出在把數組ch的地址傳給兩個函數了。 這是一個固定地址,但它的内容隨著scanf的執行而發生變化。 InsertBiTree函數中,data僅僅是指向傳遞進來的字符串地址,所以它指向的其實是ch這個數組。換句話說,執行多次InsertBiTree函數之後,生成的這個樹,每一個data數據項其實都指向同一個地方,這是問題之一。 而在BiTreeSearch函數中,又在這個樹中查找ch這個字符串,既然都指向了ch,再跟ch做比較,豈不是必然相等? 所以解決辦法是: 樹結搆体中的data改用字符數組而不是指針,或者在InsertBiTree中給它動態分配地址。 並且在InsertBiTree中必須用strcpy拷貝字符串内容。
sghcpt 2018-07-05
  • 打赏
  • 举报
回复
楼上说的正确,楼主可以参考一下下面代码,逻辑差不多的。注意需要添加动态分配的内存释放操作。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct node{
char *data;
struct node *lchild, *rchild;
}Btree;

typedef Btree *BiTree;

int InsertBiTree(Btree **root, char *x)
{
Btree *current = NULL, *parent = NULL, *p = NULL;
current = *root;
while (current != NULL)
{
if (strcmp(current->data, x) == 0)
return 0;

parent = current;
if (strcmp(current->data, x) < 0)
current = current->rchild;
else
current = current->lchild;
}

p = (Btree*)malloc(sizeof(Btree));
if (p == NULL)
{
printf("空间不够\n");
exit(1);
}

int nLen = strlen(x);
if (nLen > 9)
{
printf("输入的字符数不对\n");
exit(1);
}

char* px = (char*)malloc(nLen + 1);
if (px == NULL)
{
printf("空间不够\n");
exit(1);
}
memset(px, 0, nLen + 1);
memcpy(px, x, nLen);

p->data = px;
p->lchild = NULL;
p->rchild = NULL;
if (parent == NULL)
*root = p;
else if (strcmp(x, parent->data) < 0)
parent->lchild = p;
else
parent->rchild = p;
return 1;
}

int BiTreeSearch(Btree *root, char *x){
Btree *current;
if (root != NULL){
current = root;
while (current != NULL){
if (strcmp(current->data, x) == 0)
return 1;
if (strcmp(current->data, x)<0)
current = current->rchild;
else
current = current->lchild;
}
}
return -1;
}


int main(void)
{
Btree *s = NULL;
char ch[10] = { 0 };
printf("请输入最多9个元素:\n");
for (int i = 0; i<12; i++){
scanf_s("%s", ch, 10);
InsertBiTree(&s, ch);
memset(ch, 0, 10);
}

printf("请输入要查找的最多9个元素:");
scanf_s("%s", ch, 10);
if (BiTreeSearch(s, ch) == -1)
printf("无此元素");
else
printf("查找成功");

getchar();
return 0;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧