homeskating 发表于 2023-3-1 17:13:45

无法创建第二棵二叉树

#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###
#为空格
第一棵树可以正常创建
第二棵树按回车无反应

liuhongrun2022 发表于 2023-3-1 17:17:04

sfqxx 发表于 2023-3-1 17:43:27

liuhongrun2022 发表于 2023-3-1 17:17


wc

歌者文明清理员 发表于 2023-3-1 17:53:24

liuhongrun2022 发表于 2023-3-1 17:17


ctm

jhq999 发表于 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);
}

dolly_yos2 发表于 2023-3-1 18:19:45

前言,试图反对这种四不像的写法:写 C 就好好写 C,写 C++ 就好好写 C++
问题:scanf("%c", ...) 不会忽略任何字符,包括第一棵树输入后的换行符,而这一符号并未被过滤,因此成为了第二棵树的根节点,导致后续输入的节点数量不够,看起来像“按回车后无反应”,实际上是程序仍在等待输入

dolly_yos2 发表于 2023-3-1 18:21:36

jhq999 发表于 2023-3-1 18:19


错误的,fflush(stdin) 是不标准的写法,它可能工作也可能不工作,应该避免这种用法

jhq999 发表于 2023-3-1 18:36:42

dolly_yos2 发表于 2023-3-1 18:21
错误的,fflush(stdin) 是不标准的写法,它可能工作也可能不工作,应该避免这种用法

学到了
fseek(stdin,0,SEEK_SET);

homeskating 发表于 2023-3-1 18:47:17

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

教材上都是伪码,参着C和CPP写的,所以四不像了{:10_266:}

歌者文明清理员 发表于 2023-3-1 18:48:43

homeskating 发表于 2023-3-1 18:47
教材上都是伪码,参着C和CPP写的,所以四不像了

可能这就是命吧{:10_256:}

dolly_yos2 发表于 2023-3-1 18:51:41

jhq999 发表于 2023-3-1 18:36
学到了

这个方法好像也是很经典的,不过似乎也不够令人满意,因为 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

jhq999 发表于 2023-3-1 19:00:27

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

试试
((FILE *)stdin)->_cnt=0;

dolly_yos2 发表于 2023-3-1 19:12:58

jhq999 发表于 2023-3-1 19:00
试试

这个方法太魔法了,同样不值得提倡。我会用 fgets 或者 fgetc/ungetc 实现过滤
页: [1]
查看完整版本: 无法创建第二棵二叉树