c语言顺序二叉树和fflush(stdin)

顺序二叉树在课本上可考研中出现的频率都很少,也不像二叉链表那样具有丰富的可操作性,故本文只写顺序二叉树的建立和学习过程中遇到问题——fflush(stdin)(清除输入缓存)。

1.顺序二叉树

过程不繁琐,直接上代码

#include<stdio.h>  //递归建立顺序二叉树,数组第一位存放结点个数
#include<string.h>
#include<stdlib.h>

#define maxsize 51  //第一位存放二叉树结点个数,从而根结点序号为1,所有节点序号皆满足二叉树性质
#define elemtype char

typedef char SqBiTree[maxsize];

void InitTree(SqBiTree T)
{
 char j;
 int i;
 printf("请输入二叉树结点个数:");
 scanf("%c",&j);
 T[0]=j;
 printf("结点个数为%c\n",j);
 for(i=1;i<maxsize;i++)
 {
  T[i]='\0';
 }
}

void CreateTree(SqBiTree T,int i) //递归建立顺序二叉树
{
 fflush(stdin);
 elemtype x;
 scanf("%c",&x);
 if(x=='#')
 {
  T[i]='\0';
  return;
 }
 T[i]=x;
 printf("请输入其左子结点数据:");
 CreateTree(T,2*i);
 printf("请输入其右子结点数据:");
 CreateTree(T,2*i+1);
}

void PrintTree(SqBiTree T)
{
 for(int i=0;i<maxsize;i++)
 {
  printf("%c",T[i]);
 }
}

void main()
{
 SqBiTree t;
 InitTree(t);
 printf("请输入根节点数据:");
 CreateTree(t,1);
 PrintTree(t);
}

建立如图所示二叉树(随便画的图,将就下哈)
在这里插入图片描述
结果如下(补足的位置由字符型空格’\0’填充)在这里插入图片描述
总结二叉树建立大都用递归或栈的思想(递归代码量少,所以我选用前者),因为每个结点都要存储数据且不需要进行运算,所以数据类型选char型,于是出现了以下问题。

2.fflush(stdin);

fflush(stdin)的作用是清除输入缓存,把输入缓存中多余的未被保存的内容清除,以便下次读取。而在我们日常的学习中,多数以int型进行数据运算和存储,所以基本用不到fflush。
例如下程序:

#include<stdio.h>
void main()
{
 int a,b;
 scanf("%d",&a);
 printf("%d",a);
 scanf("%d",&b);
 printf("%d",b);
}

在这里插入图片描述
结果正常,也很容易预料,但如果把int型改为字符型char

#include<stdio.h>
void main()
{
 char a,b;
 scanf("%c",&a);
 printf("%c",a);
 scanf("%c",&b);
 printf("%c",b);
}

在这里插入图片描述
则输入的字符和回车符一并被存入输入缓冲区,而第二次输入则被无视,编译器直接读取了回车符,也许如上并不直观,可以换做如下输入
在这里插入图片描述
可以看到,abc都被存到了输入缓冲区,而两次输出分别将a,b输出,与我们希望的两次输入再分别输出不同,此时只要在第二次输入前加上flush(stdin);即可将之前的缓存内容清除,便可得到我们希望的结果。

char a,b;
 scanf("%c",&a);
 printf("%c",a);
 fflush(stdin);
 scanf("%c",&b);
 printf("%c",b);

在这里插入图片描述
特别是在处理字符型结构变量的时候,要格外注意这一点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

事多做话少说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值