鱼C论坛

 找回密码
 立即注册
查看: 1957|回复: 12

[已解决]无法创建第二棵二叉树

[复制链接]
发表于 2023-3-1 17:13:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
#include<iostream>
#include<iterator>
using namespace std;
#define TElemType char
#define Status int
#define SUCCESS 1
#define ERROR -1
#define OVERFLOW -2
//二叉树的二叉链表存储表示
typedef struct BitNode
{
        TElemType data;
        struct BitNode* lchild, * rchild;
}BiTNode, * BiTree;
//构造空二叉树
Status InitBiTree(BiTree& T) {
        T = NULL;
        return 1;
}
/*
  销毁二叉树T
 */
Status DestroyBiTree(BiTree& T) {
        if ((T)->lchild)
                DestroyBiTree(T->lchild);
        if ((T)->rchild)
                DestroyBiTree(T->rchild);
        free(T);
        T = NULL;
        return 1;
}
/*
 * 先序队列创建二叉树
 */
Status CreateBiTree(BiTree& S) {
        TElemType ch2;
        scanf("%c", &ch2);
        if (ch2 == ' ')
                S = NULL;
        else
        {
                S = (BiTree)malloc(sizeof(BiTNode));
                if (!S)
                        exit(OVERFLOW);
                S->data = ch2;
                CreateBiTree(S->lchild);
                CreateBiTree(S->rchild);
        }
        return SUCCESS;
}
int main(void) {
        BiTree biTree = NULL, insertBiTree = NULL;
        int initResult = InitBiTree(biTree);
        printf("initResult=%d\n", initResult);
        int createBiTree = CreateBiTree(biTree);
        printf("createBiTree=%d\n", createBiTree);
        int insertCreateResult = CreateBiTree(insertBiTree);
        printf("insertCreateBiTree=%d\n", insertCreateResult);
}
测试数据:ABC##DE#G##F###
#为空格
第一棵树可以正常创建
第二棵树按回车无反应
最佳答案
2023-3-1 18:36:42
dolly_yos2 发表于 2023-3-1 18:21
错误的,fflush(stdin) 是不标准的写法,它可能工作也可能不工作,应该避免这种用法

学到了
fseek(stdin,0,SEEK_SET);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-1 17:17:04 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-1 17:43:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 17:53:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 18:19:27 | 显示全部楼层
int main(void) {
        BiTree biTree = NULL, insertBiTree = NULL;
        int initResult = InitBiTree(biTree);
        printf("initResult=%d\n", initResult);
        int createBiTree = CreateBiTree(biTree);
        printf("createBiTree=%d\n", createBiTree);
        fflush(stdin);///////////////////
        int insertCreateResult = CreateBiTree(insertBiTree);
        printf("insertCreateBiTree=%d\n", insertCreateResult);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 2

使用道具 举报

发表于 2023-3-1 18:19:45 | 显示全部楼层
前言,试图反对这种四不像的写法:写 C 就好好写 C,写 C++ 就好好写 C++
问题:scanf("%c", ...) 不会忽略任何字符,包括第一棵树输入后的换行符,而这一符号并未被过滤,因此成为了第二棵树的根节点,导致后续输入的节点数量不够,看起来像“按回车后无反应”,实际上是程序仍在等待输入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-3-1 18:21:36 | 显示全部楼层

错误的,fflush(stdin) 是不标准的写法,它可能工作也可能不工作,应该避免这种用法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 18:36:42 | 显示全部楼层    本楼为最佳答案   
dolly_yos2 发表于 2023-3-1 18:21
错误的,fflush(stdin) 是不标准的写法,它可能工作也可能不工作,应该避免这种用法

学到了
fseek(stdin,0,SEEK_SET);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-1 18:47:17 | 显示全部楼层
dolly_yos2 发表于 2023-3-1 18:19
前言,试图反对这种四不像的写法:写 C 就好好写 C,写 C++ 就好好写 C++
问题:scanf("%c", ...) 不会忽 ...

教材上都是伪码,参着C和CPP写的,所以四不像了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 18:48:43 | 显示全部楼层
homeskating 发表于 2023-3-1 18:47
教材上都是伪码,参着C和CPP写的,所以四不像了

可能这就是命吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 18:51:41 | 显示全部楼层

这个方法好像也是很经典的,不过似乎也不够令人满意,因为 stdin 并不一定 seekable。我的测试结果显示这并不能移除多余的换行符,而 fseek 返回了 -1 表示调用失败
测试:
#include <stdio.h>
int main(){
    int i;
    char c;
    scanf("%d", &i);
    printf("%d\n", i);
    printf("%d\n", fseek(stdin, 0, SEEK_SET));
    scanf("%c", &c);
    printf("%u\n", (unsigned int)c);
    return 0;
}
输入:
12<回车>
输出:
12
-1
10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 19:00:27 | 显示全部楼层
dolly_yos2 发表于 2023-3-1 18:51
这个方法好像也是很经典的,不过似乎也不够令人满意,因为 stdin 并不一定 seekable。我的测试结果显示这 ...

试试
((FILE *)stdin)->_cnt=0;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 19:12:58 | 显示全部楼层

这个方法太魔法了,同样不值得提倡。我会用 fgets 或者 fgetc/ungetc 实现过滤
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 17:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表