回 帖 发 新 帖 刷新版面

主题:二叉树的一个非常奇怪的问题!

我写了一个有关二叉树的创建和先序遍历的程序,代码如下:
#include "stdio.h"
#include <stdlib.h>

#define FALSE 0
#define TRUE 1
#define BOOL bool
#define NULL 0

typedef struct BiTNode{
    char chData;                            //元素
    struct BiTNode *lchild, *rchild;        //左孩子、右孩子
}BiTNode, *BiTree;

void CreateBiTree(BiTree& T)
{
    char ch;

    scanf("%c%c", &ch);

    if(ch=='\n') 
    {
        printf("ch=NULL\n");
        T = NULL;
    }
    else{
        T=(BiTree)malloc(sizeof(BiTNode));
        if(!T) 
        {
            printf("malloc fail\n");
            return ;
        }

        T->chData = ch;                                    //生成根结点
        printf("请输入%c的左孩子:\n", ch);
        CreateBiTree(T->lchild);                        //构造左子树
        printf("请输入%c的右孩子:\n", ch);
        CreateBiTree(T->rchild);                        //构造右子树
        printf("construct right\n");
    }

    return ;
}

void PreOrder(BiTree T)                                    //对二叉树进行先序遍历
{
    if (T){
        printf("%c",T->chData);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }//end of if
}//end of preorder

int main(int argc, char*& argv)
{
    BiTree b1;
    int iPos = 0;

    printf("请输入节点元素值(没有孩子元素就直接回车):\n");
    CreateBiTree(b1);
    
    PreOrder(b1);
    return TRUE;
}
运行没问题,但是只要删除printf("ch=NULL\n");或者printf("construct right\n");
就会出现不停滚屏的情况,简直就是闻所未闻!而且打印的内容长度还不能小,如果删除了construct right的一个字母一样不行。请教各位高手指点!
是在WIN2000下由cl编译的。

回复列表 (共1个回复)

沙发

运行没有问题吗?问题大了,并且与printf语句毫无关系。
问题出在 scanf("%c%c", &ch); 这条语句。格式符比变量多会造成内存的异常覆盖。你的本意是想跳过回车符,但是在此却造成回车符放到了不该放的内存单元,从而造成程序异常。正确做法是:
scanf("%c", &ch);
flushall(); // 清除键盘缓冲区
或者使用控制台函数getche,其原型是int getche(void);

我来回复

您尚未登录,请登录后再回复。点此登录或注册