无法创建第二棵二叉树
#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
wc liuhongrun2022 发表于 2023-3-1 17:17
ctm 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);
}
前言,试图反对这种四不像的写法:写 C 就好好写 C,写 C++ 就好好写 C++
问题:scanf("%c", ...) 不会忽略任何字符,包括第一棵树输入后的换行符,而这一符号并未被过滤,因此成为了第二棵树的根节点,导致后续输入的节点数量不够,看起来像“按回车后无反应”,实际上是程序仍在等待输入 jhq999 发表于 2023-3-1 18:19
错误的,fflush(stdin) 是不标准的写法,它可能工作也可能不工作,应该避免这种用法 dolly_yos2 发表于 2023-3-1 18:21
错误的,fflush(stdin) 是不标准的写法,它可能工作也可能不工作,应该避免这种用法
学到了
fseek(stdin,0,SEEK_SET); dolly_yos2 发表于 2023-3-1 18:19
前言,试图反对这种四不像的写法:写 C 就好好写 C,写 C++ 就好好写 C++
问题:scanf("%c", ...) 不会忽 ...
教材上都是伪码,参着C和CPP写的,所以四不像了{:10_266:} homeskating 发表于 2023-3-1 18:47
教材上都是伪码,参着C和CPP写的,所以四不像了
可能这就是命吧{:10_256:} 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 dolly_yos2 发表于 2023-3-1 18:51
这个方法好像也是很经典的,不过似乎也不够令人满意,因为 stdin 并不一定 seekable。我的测试结果显示这 ...
试试
((FILE *)stdin)->_cnt=0; jhq999 发表于 2023-3-1 19:00
试试
这个方法太魔法了,同样不值得提倡。我会用 fgets 或者 fgetc/ungetc 实现过滤
页:
[1]