QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1049|回复: 10

在linux为什么会运行错误?而在windows正常

[复制链接]
发表于 2004-5-25 18:23:45 | 显示全部楼层 |阅读模式
在linux下.运行时,"请问根结点是否有左子树?(Y/N):"和"请问根结点是否有右子树?(Y/N):"会同时出现,前面的根本没有输入.为什么?难道一个程序中不能出现两三个getchar或scanf??
[code:1]
#include <stdio.h>

typedef struct btnode
{
  int data;
  struct btnode *lchild;
  struct btnode *rchild;
} bitreptr;

bitreptr* create(bitreptr* root);

bitreptr* createHead()
{
  bitreptr *root;
  int input;
  char choose;
  root = (bitreptr *) malloc (sizeof(bitreptr));
  root -> lchild = NULL;
  root -> rchild = NULL;
  printf("输入根结点的数据:\t\t");
  scanf("%d", &input);
  root -> data = input;
  printf("请问根结点是否有左子树?(Y/N):\t");
  fflush(stdin);
  choose=getchar();
  if(choose=='Y' || choose=='y')
   root->lchild = create(root->lchild);
  printf("请问根结点是否有右子树?(Y/N):\t");
  fflush(stdin);
  choose=getchar();
  if(choose=='Y' || choose=='y')
   root -> rchild = create(root->rchild);

  return root;
}

bitreptr* create(bitreptr* root)
{
  int input;
  char choose;
  root = (bitreptr *) malloc (sizeof(bitreptr));
  root -> lchild = NULL;
  root -> rchild = NULL;
  printf("输入当前结点内的数据:\t\t");
  scanf("%d", &input);
  root -> data = input;
  printf("请问当前结点是否有左子树?(Y/N):\t");
  fflush(stdin);
  choose=getchar();
  if(choose=='Y' || choose=='y')
   root->lchild = create(root->lchild);
  printf("请问当前结点是否有右子树?(Y/N):\t");
  fflush(stdin);
  choose=getchar();
  if(choose=='Y' || choose=='y')
   root -> rchild = create(root->rchild);
  return (root);
}

void outputTree(bitreptr* pbnode,int totalSpace)
{int i;
if(pbnode!=NULL)
{
  totalSpace+=5;
  outputTree(pbnode->rchild,totalSpace);
  for(i=0;i<totalSpace;i++) printf(" ");
  printf("%d\n",pbnode->data);
  outputTree(pbnode->lchild,totalSpace);
}
}

void preorder (bitreptr *root)
{
  if (root == NULL)
    return;
  printf("%d ", root -> data);
  preorder(root -> lchild);
  preorder(root -> rchild);
}

void inorder (bitreptr *root)
{
  if (root == NULL)
    return;
  inorder(root -> lchild);
  printf("%d ", root -> data);
  inorder(root -> rchild);
}

void postorder (bitreptr *root)
{
  if (root == NULL)
    return;
  postorder(root -> lchild);
  postorder(root -> rchild);
  printf("%d ", root -> data);
}

int max(int a, int b)
{
if(a>=b) return a;
else return b;
}

int depth_bintree (bitreptr *root)
{
  int depth, depthl, depthr;
  if (root == NULL)
    depth = 0;
  else
    {
      depthl = depth_bintree(root -> lchild);
      depthr = depth_bintree(root -> rchild);
      depth = (max(depthl, depthr) + 1);
    }
  return (depth);
}

int countleaf (bitreptr *root)
{
  static int count=0;
  if ((root -> lchild == NULL) && (root -> rchild == NULL))
      count++;
  else if((root -> lchild != NULL) && (root -> rchild == NULL))
   countleaf(root -> lchild);
  else if((root -> lchild == NULL) && (root -> rchild != NULL))
      countleaf(root -> rchild);
  else if((root -> lchild != NULL) && (root -> rchild != NULL))
  {
   countleaf(root->lchild);
   countleaf(root->rchild);
  }
  return (count);
}
int countall(bitreptr *root)
{
static int count=0;
if((root -> lchild == NULL) && (root -> rchild == NULL))
  count++;
else if((root -> lchild != NULL) && (root -> rchild == NULL))
{
  count++;
  countall(root -> lchild);
}
else if((root -> lchild == NULL) && (root -> rchild != NULL))
{
  count++;
  countall(root -> rchild);
}
else if((root -> lchild != NULL) && (root -> rchild != NULL))
{
  count++;
  countall(root->lchild);
  countall(root->rchild);
}
return count;
}

int main ()
{
  bitreptr *root;
  int leaves,depth;
  int allnodes;
  int totalSpace=0;
  root = createHead();
  printf("我们构造的这棵二叉树的直观图为:\n");
  outputTree(root,totalSpace);
  printf("\n先根遍历:\n");
  preorder(root);
  printf("\n中根遍历:\n");
  inorder(root);
  printf("\n后根遍历:\n");
  postorder(root);
  depth = depth_bintree(root);
  printf("\n树的深度为:\t%d",depth);
  leaves = countleaf(root);
  printf("\n叶子总数为:\t%d", leaves);
  allnodes =countall(root);
  printf("\n总的结点数目为:\t%d\n",allnodes);
}
[/code:1]
发表于 2004-5-25 21:12:28 | 显示全部楼层
你用的是哪一个发行套件?我在用MagicLinux1.1时也遇到程序中有几个scanf语句时第一个取值时会出现一些问题,可能是库的BUG。
回复

使用道具 举报

 楼主| 发表于 2004-5-25 22:38:24 | 显示全部楼层
我的是RH9。0
回复

使用道具 举报

发表于 2004-5-25 23:41:45 | 显示全部楼层
你按了两个字符:Y和回车,试试多调用一次getchar以消去缓冲区中的回车,或用其它更健壮的方法.
回复

使用道具 举报

发表于 2004-5-25 23:54:43 | 显示全部楼层
并不是linux下库文件的bug,以前刚学c语言的时候也让这个问题给烦死了,呵呵
回复

使用道具 举报

 楼主| 发表于 2004-5-26 01:01:20 | 显示全部楼层
问题是我使用了fflush(stdin)将缓冲区的字符全部冲掉了。难道这个函数在linux无用?
回复

使用道具 举报

发表于 2004-5-26 12:48:52 | 显示全部楼层
这个问题不太了解。fflush说是flush用户空间,并不影响kernel空间,不知和这有没关系。不过,我试过,加了getchar去掉那个回车后就可以正常运行。
回复

使用道具 举报

 楼主| 发表于 2004-5-26 20:38:57 | 显示全部楼层
谢谢楼上了.不过正常是正常.但输入多了.就会影响到下一个输入.
回复

使用道具 举报

发表于 2004-5-26 22:17:16 | 显示全部楼层
的确是,还要再请高手指点一下。
回复

使用道具 举报

发表于 2004-6-13 22:59:15 | 显示全部楼层
用getch()多好.
回复

使用道具 举报

发表于 2004-6-19 19:54:39 | 显示全部楼层
[quote:ba897738d7="lanche"]你用的是哪一个发行套件?我在用MagicLinux1.1时也遇到程序中有几个scanf语句时第一个取值时会出现一些问题,可能是库的BUG。[/quote]

请不要怀疑库函数。fflush在这儿也不能解决问题。最好的解决办法就是调用getchar(),直到'\n'为止。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-8 02:53 , Processed in 0.051749 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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