鱼C论坛

 找回密码
 立即注册
查看: 907|回复: 6

[已解决]关于二叉树创建的问题 具有大大的疑惑

[复制链接]
发表于 2020-4-6 00:46:25 | 显示全部楼层 |阅读模式

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

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

x

关于二叉树的创立,当存放数据为字符时候为什么会出现如下问题(当出现重复出现的字符时候就是错误了)
typedef struct BinTreeNode *PBinTree;
struct BinTreeNode{

        char info;
        PBinTreeNode llink;
        PBinTreeNode rlink;
};
PBinTree Create(){
        char val;
        scanf("%c", &val);
      
        PBinTree t = (PBinTree)malloc(sizeof(struct BinTreeNode));
        if (val =='0') {
                return NULL;
        }

        else {
                t->info = val;
                printf("请输入'%c'的左节点\n",val);      
                t->llink = Create();
                printf("请输入'%c'的右节点\n",val);
                t->rlink = Create();
        }
         
        return t;}
----------------------------------------
输入A时 输出如下:
A
请输入'A'的左节点
请输入'
'的左节点
------------------------------------------
上面重复了
{
请输入'
'的左节点
}这一段 不知道怎么解决 但如果输入的是整型就一切正常

输入整形时候:
typedef struct BinTreeNode *PBinTree;
struct BinTreeNode{

        char info;
        PBinTreeNode llink;
        PBinTreeNode rlink;
};
PBinTree Create(){
        int val;
        scanf("%d", &val);
      
        PBinTree t = (PBinTree)malloc(sizeof(struct BinTreeNode));
        if (val <= 0) {
                return NULL;
        }
      

        if (val > 0) {
                t->info = val;
                printf("请输入'%d'的左节点\n",val);      
                t->llink = Create();
                printf("请输入'%d'的右节点\n",val);
                t->rlink = Create();
        }
         
        return t;}
-----------------------------------------------------------------------------
输出:
3
请输入'3'的左节点
1
请输入'1'的左节点
4
请输入'4'的左节点
0
请输入'4'的右节点
0
请输入'1'的右节点
5
请输入'5'的左节点
0
请输入'5'的右节点
0
请输入'3'的右节点
2
请输入'2'的左节点
0
请输入'2'的右节点
0
中序遍历41532
前序遍历31452
后序遍历45123
--------------------------------
一切正常
最佳答案
2020-4-6 07:18:40
这个是因为scanf函数的用法理解有偏差。第一种写法,scanf读取%c,即一个char字符。当你输入字符A的时候,敲击了回车,然后scanf将A读取赋值给val,缓冲区剩下回车字符,第二次调用create函数的时候scanf读取%c时读到了回车字符,然后将之赋值给了val,所以就出现了这种情况。
第二种写法,scanf读取%d,即整型数字,第一次输入1回车,scanf读到1赋值给val,缓冲区剩下回车字符,第二次的时候,再次读取%d,遇到回车跳过,等待你输入数字,所以你输入2回车就能正常读到2了。
scanf读取除了%c以外的其他格式,都回将空白符(空格  回车   tab)当做间隔符跳过。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-6 07:18:40 | 显示全部楼层    本楼为最佳答案   
这个是因为scanf函数的用法理解有偏差。第一种写法,scanf读取%c,即一个char字符。当你输入字符A的时候,敲击了回车,然后scanf将A读取赋值给val,缓冲区剩下回车字符,第二次调用create函数的时候scanf读取%c时读到了回车字符,然后将之赋值给了val,所以就出现了这种情况。
第二种写法,scanf读取%d,即整型数字,第一次输入1回车,scanf读到1赋值给val,缓冲区剩下回车字符,第二次的时候,再次读取%d,遇到回车跳过,等待你输入数字,所以你输入2回车就能正常读到2了。
scanf读取除了%c以外的其他格式,都回将空白符(空格  回车   tab)当做间隔符跳过。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-6 07:25:11 | 显示全部楼层
如果想用scanf读取char,那么应该在scanf后用getchar()清除缓存的回车字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-6 13:49:06 | 显示全部楼层
sunrise085 发表于 2020-4-6 07:25
如果想用scanf读取char,那么应该在scanf后用getchar()清除缓存的回车字符

啊 这是个什么意思呀 不太懂 因为不太常用c语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-6 13:50:22 | 显示全部楼层
sunrise085 发表于 2020-4-6 07:18
这个是因为scanf函数的用法理解有偏差。第一种写法,scanf读取%c,即一个char字符。当你输入字符A的时候, ...

啊啊啊啊 我懂了!!谢谢我现在去试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-6 13:58:08 | 显示全部楼层
sunrise085 发表于 2020-4-6 07:25
如果想用scanf读取char,那么应该在scanf后用getchar()清除缓存的回车字符

那这个要怎么实现呢 我用getchar()输入他还是会有回车
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-6 13:59:23 | 显示全部楼层
秃头小宝贝 发表于 2020-4-6 13:58
那这个要怎么实现呢 我用getchar()输入他还是会有回车

我知道拉 成功!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-13 06:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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