LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 954|回复: 11

二叉树中,指针出错。迷惑中!!!

[复制链接]
发表于 2004-11-24 20:13:05 | 显示全部楼层 |阅读模式
我的代码如下:

#include <stdio.h>
#include <string.h>
#include <malloc.h>

typedef char TElemType;
typedef struct _BiTNode{
TElemType data;
struct _BiTNode *lchild,*rchild;
}BiTNode;


void CreateBiTree(BiTNode *T) {

char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else {
T=(BiTNode*)malloc(sizeof(BiTNode));
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}

void PrintTree(BiTNode *T) {

if (T==NULL)
return;
else
printf("%c",T->data);
PrintTree(T->lchild);
PrintTree(T->rchild);
}



void main() {
BiTNode *T;
printf("input:\n");
CreateBiTree(T);
PrintTree(T);
}

编译可以通过,运行时出问题。我想是指针的问题,可不知该如何解决。求教高手!!~~~~~
发表于 2004-11-24 22:41:39 | 显示全部楼层
你PrintTree(T)里的T还是NULL,

int count=0;
BiTnode *temp;

void CreateBiTree(BiTNode *T) {

char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else {
T=(BiTNode*)malloc(sizeof(BiTNode));

if(count==0)
{
   temp=T;
}
count++;

T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}

void main() {
BiTNode *T;
printf("input:\n");
CreateBiTree(T);
PrintTree(temp);
}
发表于 2004-11-24 23:19:31 | 显示全部楼层
void CreateBiTree(BiTNode **T)
    {
     18     do
     19     {
     20         ch = getchar();
     21     }while(ch=='\n');
     22     if(ch=='#')
     23     {
     24         T=NULL;
     25     }
     26     else
     27     {
     28         *T=(BiTNode*)malloc(sizeof(BiTNode));
     29         (*T)->lchild=NULL;
     30         (*T)->rchild=NULL;
     31         (*T)->data=ch;
     32         CreateBiTree(&((*T)->lchild));
     33         CreateBiTree(&((*T)->rchild));
     34     }
     35 }
要改成这样。要不然指针得不到值。赋值那儿的循环是用来消除前面赋值时留下的回车。
发表于 2004-11-25 10:27:53 | 显示全部楼层
我写的
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>

  4. typedef char TElemType;
  5. typedef struct _BiTNode{
  6. TElemType data;
  7. struct _BiTNode *lchild,*rchild;
  8. }BiTNode;
  9. void CreateBiTree(BiTNode **T) {
  10.         char ch;
  11.         fflush(stdin);
  12.         printf("input:\n");
  13.         ch=getchar();
  14.         if(ch=='#') *T=NULL;
  15.         else {
  16.                 (*T)=(BiTNode*)malloc(sizeof(BiTNode));
  17.                 (*T)->data=ch;
  18.                 CreateBiTree(&((*T)->lchild));
  19.                 CreateBiTree(&((*T)->rchild));
  20.         }
  21. }
  22. void PrintTree(BiTNode *T) {

  23.         if (T==NULL)
  24.         return;
  25.         else
  26.                 printf("output the tree:%c\n",T->data);
  27.         PrintTree(T->lchild);
  28.         PrintTree(T->rchild);
  29. }
  30. int main() {
  31.         BiTNode *T;
  32.         //printf("input:");
  33.         CreateBiTree(&T);
  34.         PrintTree(T);
  35.         getchar();
  36.         getchar();
  37.         return 0;
  38. }
复制代码
发表于 2004-11-25 10:44:00 | 显示全部楼层
楼上的程序输入时无法终止呀!
发表于 2004-11-25 10:50:59 | 显示全部楼层
我在vc2005上是可以的,用cygwin gcc就不行了
发表于 2004-11-25 10:51:55 | 显示全部楼层
当然了。windows下是没有终端的。
发表于 2004-11-25 10:53:38 | 显示全部楼层
我觉得是标准io的缓冲问题,版主能说说怎么解决吗?
发表于 2004-11-25 11:55:32 | 显示全部楼层
和标准I/O的缓冲没有关系,是终端造成的。终端是行缓冲的,也就是说要输入回车才会把前面输入的字符传送给内核,不是输入一个字符就处理一个字符。办法有很多,你可以先在论坛搜索,不可以到CU的C/C++论坛去找找。
发表于 2004-11-25 17:20:02 | 显示全部楼层
想到一个简单的办法while((ch=getchar())=='\n'){}
但是这样只能过滤回车造成的'\n'字符,如果一次输入多个
字符比如aaa的话,后面的字符还是会被后面的getchar()收到。
APUE上看到可以修改终端属性,但是有没有简单的办法实现一次只
接受一个字符呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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