33,008
社区成员
发帖
与我相关
我的任务
分享
typedef struct M{
char info[MAX];
struct M *lchild,*rchild;
}TreeNode,* PNode;
char replay[5],answer[5];
PNode root;
int size = sizeof(TreeNode);
下面的函数完成构建如下树的功能:
你猜的是哺乳动物吗?
比猫大吗? 生活在水里吗?
袋鼠 老鼠 鲑鱼 鸟
void Init()
{ //建立根结点:你是哺乳动物吗?
strcpy(replay,"yes");
root=(TreeNode*)malloc(size);
strcpy(root->info,"你猜的是哺乳动物吗?");
//建立左子树:比猫大吗?
root->lchild=(TreeNode*)malloc(size);
strcpy(root->lchild->info,"比猫大吗?");
//左:袋鼠
root->lchild->lchild=(TreeNode*)malloc(size);
strcpy(root->lchild->lchild->info,"袋鼠");
root->lchild->lchild->lchild = root->lchild->lchild->rchild = NULL;
//右:老鼠
root->lchild->rchild=(TreeNode*)malloc(size);
strcpy(root->lchild->rchild->info,"老鼠");
root->lchild->rchild->lchild = root->lchild->rchild->rchild = NULL;
//建立右子树:生活在水里吗?
root->rchild=(TreeNode*)malloc(size);
strcpy(root->rchild->info,"生活在水里吗?");
//左:鲟鱼
root->rchild->lchild=(TreeNode*)malloc(size);
strcpy(root->rchild->lchild->info,"鲑鱼");
root->rchild->lchild->lchild = root->rchild->lchild->rchild = NULL;
//右:知更鸟
root->rchild->rchild=(TreeNode*)malloc(size);
strcpy(root->rchild->rchild->info,"鸟");
root->rchild->rchild->lchild = root->rchild->rchild->rchild = NULL;
}
void Change(char str[])
{
int i=0;
while(str[i]!='\0'){
str[i++]=tolower(str[i]);
}
}
void Ask()
{
int flag = 0;
printf("还要再玩一次吗?\n");
while(!flag){
gets(answer);
Change(answer);
if(!strcmp(answer,"yes")||!strcmp(answer,"y")){
flag = 1;
strcpy(replay,"yes");
}
else if(!strcmp(answer,"no")||!strcmp(answer,"n")){
flag = 1;
strcpy(replay,"no");
}
else {
printf("再次输入答案(Y/N):\n");
}
}
}
//当猜错时,加入新的动物和新回答
void Learn(PNode p)
{
char s1[MAX],s2[MAX],s[5],temp[MAX];
PNode p1,p2;
int flag = 0;
printf("我认输了,那是什么呢?\n");
gets(s1);//读入答案
printf("请输入一个可以区分开%s和%s的问题:\n",s1,p->info);//询问用户
gets(s2);
printf("对于%s,你的回答是(Y/N):\n",s1);
gets(s);
//把新问题作为当前结点值,为两个动物建立2个新结点作为它的左子树
strcpy(temp,p->info);
strcpy(p->info,s2);
p1 = (TreeNode*)malloc(size);
strcpy(p1->info,temp);
p1->lchild = p1->rchild = NULL;
p2 = (TreeNode*)malloc(size);
strcpy(p2->info,s1);
p2->lchild = p2->rchild = NULL;
while(!flag){
Change(s);
if(!strcmp(s,"yes")||!strcmp(s,"y")){
p->lchild=p2;
p->rchild=p1;
flag = 1;
}
else if(!strcmp(answer,"no")||!strcmp(answer,"n")){
p->lchild=p1;
p->rchild=p2;
flag = 1;
}
else {
printf("再次输入答案(Y/N):\n");
}
}
printf("好的,我记住了!\n");
}
void Request()
{
int flag;
PNode p;
printf("游戏开始:\n");
p=root;
while(p!=NULL)
{
flag = 0;
if(p->lchild!=NULL){printf("%s\n",p->info);}
else{printf("它是%s吗?\n",p->info);}
while(!flag){
gets(answer);
Change(answer);
if(!strcmp(answer,"yes")||!strcmp(answer,"y")){
if(p->lchild==NULL)printf("猜对了!\n");
p=p->lchild;
flag = 1;
}
else if(!strcmp(answer,"no")||!strcmp(answer,"n")){
if(p->lchild==NULL){Learn(p);p=NULL;}
else p=p->rchild;
flag = 1;
}
else {
printf("再次输入答案(Y/N):\n");
}
}
}
Ask();
}
int main()
{
Init();
while(!strcmp(replay,"yes"))
{
Request();
}
return 0;
}