注册 登录
编程论坛 数据结构与算法

大家帮我看看这"棵"树怎么了

st_win 发布于 2010-09-21 16:31, 956 次点击
运行赋值AB##C## 回车后出现 对话框 说是内存不能为读之类的问题 我该怎么办啊 求教了~~
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX_TREE_SIZE 15
#define NULL 0
typedef struct BitNode{        //节点结构
    char data;
    struct BitNode *lchirld,*rchirld;//左孩子,右孩子
}BitNode,*Bitree;
char ch;
int CreateBtree(Bitree T)
{

     ch=getchar();
    if(ch=='#') {T=NULL;}      //
else{
     if(!(T=(Bitree)malloc(sizeof(BitNode)))) exit(0);//建立根节点
   

   T->data=ch; //访问根节
CreateBtree(T->lchirld);//建立左子树
printf("aaa");

 CreateBtree(T->rchirld);//建立右子树
printf("dddd");

 }//else
printf("ccc");

 return 0;
}//CreateBtree
void OrderTralversepre(Bitree T)

{ // 前序遍历二叉树
    if(T==0) return ;
else{ printf("%c\n",T->data);
    OrderTralversepre(T->lchirld); //前序遍历左子树
    OrderTralversepre(T->rchirld); //前序遍历右子树
}//else

}//OrderTralversepre
void DistroyBitree(Bitree T)
{//销毁二叉树
    if(T==0) return ;
else {DistroyBitree(T->lchirld);//销毁左子树
      DistroyBitree(T->rchirld);//销毁右子树
}//else
      free(T);  //释放节点
}//DistroyBitree
void main()

 {

 BitNode T;
printf("建立一个二叉树\n");

 CreateBtree(&T);

 printf("\n");
  OrderTralversepre(&T);//前序遍历二叉树
  printf("\n");
  DistroyBitree(&T);//销毁二叉树
  printf("success");

 }//main()



[ 本帖最后由 st_win 于 2010-9-21 16:38 编辑 ]
15 回复
#2
寒风中的细雨2010-09-21 22:24
#include<stdio.h>
#include<stdlib.h>
#define MAX_TREE_SIZE 15
#define NULL 0

typedef struct BitNode
{        //节点结构
    char data;
    struct BitNode *lchirld,*rchirld;//左孩子,右孩子
}BitNode,*Bitree;
char ch;
int CreateBtree(Bitree T)
{

    ch = getchar();
    getchar();
    if(ch=='#')
    {
        T=NULL;
    }      //空
    else
    {
        if(!(T=(Bitree)malloc(sizeof(BitNode))))
            exit(0);//建立根节点
   

        T->data=ch; //访问根节
        CreateBtree(T->lchirld);//建立左子树
//printf("aaa");
        CreateBtree(T->rchirld);//建立右子树
//printf("dddd");
    }//else
//printf("ccc");
    return 0;
}//CreateBtree

void OrderTralversepre(Bitree T)
{ // 前序遍历二叉树
    if(T==0)
        return ;
    else
    {
        printf("%c\n",T->data);
        OrderTralversepre(T->lchirld); //前序遍历左子树
        OrderTralversepre(T->rchirld); //前序遍历右子树
    }//else
}//OrderTralversepre

void DistroyBitree(Bitree T)
{//销毁二叉树
    if(T==0)
        return ;
    else
    {
        DistroyBitree(T->lchirld);//销毁左子树
        DistroyBitree(T->rchirld);//销毁右子树
    }//else
    free(T);  //释放节点
}//DistroyBitree

void main()
{
    Bitree T=0;
    printf("建立一个二叉树\n");
    CreateBtree(T);
    printf("\n");
    OrderTralversepre(T);//前序遍历二叉树
    printf("\n");
    DistroyBitree(T);//销毁二叉树
    printf("success");
}//main()
#3
st_win2010-09-21 22:49
版主,那个printf("aaa"); printf("ccc");这几个我是想看看程序是运行到哪里停止了,到遍历那就运行不下去了 我该怎么办?
#4
寒风中的细雨2010-09-21 22:53
#include<stdio.h>
#include<stdlib.h>
#define MAX_TREE_SIZE 15

typedef struct BitNode
{        //节点结构
    char data;
    struct BitNode *lchirld,*rchirld;//左孩子,右孩子
}BitNode,*Bitree;
char ch;
Bitree CreateBtree(Bitree T)
{

    ch = getchar();
    getchar();
    if(ch=='#')
    {
        T=NULL;
    }      //空
    else
    {
        if(!(T=(Bitree)malloc(sizeof(BitNode))))
            exit(0);//建立根节点
   

        T->data=ch; //访问根节
        T->lchirld = CreateBtree(T->lchirld);//建立左子树
//printf("aaa");
        T->rchirld = CreateBtree(T->rchirld);//建立右子树
//printf("dddd");
    }//else
//printf("ccc");
    return T;
}//CreateBtree

void OrderTralversepre(Bitree T)
{ // 前序遍历二叉树
    if(T==0)
        return ;
    else
    {
        printf("%c\n",T->data);
        OrderTralversepre(T->lchirld); //前序遍历左子树
        OrderTralversepre(T->rchirld); //前序遍历右子树
    }//else
}//OrderTralversepre

void DistroyBitree(Bitree T)
{//销毁二叉树
    if(T==0)
        return ;
    else
    {
        DistroyBitree(T->lchirld);//销毁左子树
        DistroyBitree(T->rchirld);//销毁右子树
    }//else
    free(T);  //释放节点
}//DistroyBitree

void main()
{
    Bitree T = 0;
    printf("建立一个二叉树\n");
    T = CreateBtree(T);
    printf("\n");
    OrderTralversepre(T);//前序遍历二叉树
    printf("\n");
    DistroyBitree(T);//销毁二叉树
    printf("success");
}//main()
#5
寒风中的细雨2010-09-21 22:58
#include<stdio.h>
#include<stdlib.h>
#define MAX_TREE_SIZE 15
#define NULL 0

typedef struct BitNode
{        //节点结构
    char data;
    struct BitNode *lchirld,*rchirld;//左孩子,右孩子
}BitNode,*Bitree;
char ch;
void CreateBtree(Bitree & T)
{

    ch = getchar();
    getchar();
    if(ch=='#')
    {
        T=NULL;
    }      //空
    else
    {
        if(!(T=(Bitree)malloc(sizeof(BitNode))))
            exit(0);//建立根节点
   

        T->data=ch; //访问根节
        CreateBtree(T->lchirld);//建立左子树
//printf("aaa");
        CreateBtree(T->rchirld);//建立右子树
//printf("dddd");
    }//else
//printf("ccc");
}//CreateBtree

void OrderTralversepre(Bitree T)
{ // 前序遍历二叉树
    if(T==0)
        return ;
    else
    {
        printf("%c\n",T->data);
        OrderTralversepre(T->lchirld); //前序遍历左子树
        OrderTralversepre(T->rchirld); //前序遍历右子树
    }//else
}//OrderTralversepre

void DistroyBitree(Bitree & T)
{//销毁二叉树
    if(T==0)
        return ;
    else
    {
        DistroyBitree(T->lchirld);//销毁左子树
        DistroyBitree(T->rchirld);//销毁右子树
    }//else
    free(T);  //释放节点
}//DistroyBitree

void main()
{
    Bitree T = 0;
    printf("建立一个二叉树\n");
    CreateBtree(T);
    printf("\n");
    OrderTralversepre(T);//前序遍历二叉树
    printf("\n");
    DistroyBitree(T);//销毁二叉树
    printf("success");
}//main()
#6
寒风中的细雨2010-09-21 23:08
void main 中的 定义 BitNode T;

CreateBtree中的 if(!(T=(Bitree)malloc(sizeof(BitNode)))) exit(0);//建立根节点
联合起来看 就是问题  要注意
#7
雾雨淼淼2010-09-21 23:40
初学者,不好意思,看不懂
#8
st_win2010-09-21 23:52
以下是引用寒风中的细雨在2010-9-21 23:08:57的发言:

void main 中的 定义 BitNode T;

CreateBtree中的 if(!(T=(Bitree)malloc(sizeof(BitNode)))) exit(0);//建立根节点
联合起来看 就是问题  要注意
可是还是有点问题的 如我输入AB##C##应该是行如 A  的树,程序中根据设置的prinf("aaa")等应是 aaadddcccaaaaaadddccc但现在却是
                                            B C

cccaaacccaaa#cccddddcccddddccc 而且遍历中只有AC 并没有B 感觉是这有错误但实在不知道怎么解决,想了一个多小时没有思路~~是指针错误,还是怎样原因内存没有成功的建立空间.


[ 本帖最后由 st_win 于 2010-9-21 23:56 编辑 ]
#9
st_win2010-09-22 00:10
我看大部分帖子上指针都是用二级指针引用的不是明白,试着改了改,这个只能运行到遍历AB没有C 想不同了
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX_TREE_SIZE 15
#define NULL 0
typedef struct BitNode{        //节点结构
    char data;
    struct BitNode *lchirld,*rchirld;//左孩子,右孩子
}BitNode,*Bitree;
char ch;
int CreateBtree(Bitree *T)
{

     ch=getchar();
    if(ch=='#') {*T=NULL;}      //
else{
     if(!(*T=(Bitree)malloc(sizeof(BitNode)))) exit(0);//建立根节点
   

   (*T)->data=ch; //访问根节
CreateBtree(&(*T)->lchirld);//建立左子树
CreateBtree(&(*T)->rchirld);//建立右子树
printf("dddd");

 }//else
printf("ccc");

 return 0;
}//CreateBtree
void OrderTralversepre(Bitree *T)

{ // 前序遍历二叉树
    if(*T==0) exit(0);
else{printf("hi");
      printf("%c",(*T)->data);
    OrderTralversepre(&(*T)->lchirld); //前序遍历左子树
    printf("uu");
    OrderTralversepre(&(*T)->rchirld); //前序遍历右子树
    printf("ii");
}//else

}//OrderTralversepre
void DistroyBitree(Bitree *T)
{//销毁二叉树
    printf("part3");
    if(*T==0) exit(0);
else {DistroyBitree(&(*T)->lchirld);//销毁左子树
      DistroyBitree(&(*T)->rchirld);//销毁右子树
}//else
       printf("part4");
      free(*T);  //释放节点
}//DistroyBitree
void main()

 {

 Bitree T;
printf("建立一个二叉树\n");

 CreateBtree(&T);

 printf("\n");
  OrderTralversepre(&T);//前序遍历二叉树
  printf("\n");
  DistroyBitree(&T);//销毁二叉树
  printf("success");

 }//main()
#10
寒风中的细雨2010-09-22 11:44
回复 8楼 st_win
抱歉, 不是很理解你的意思。
#11
寒风中的细雨2010-09-22 11:52
F5  F9  F10单步跟踪
#12
st_win2010-09-22 15:54
以下是引用寒风中的细雨在2010-9-22 11:44:05的发言:

抱歉, 不是很理解你的意思。
我是说改完后的程序 运行后我要输入AB##C##回车的话赋值就应该完成了,可是改过后的情况是我还要在输入一个#才往下进行,而且经过遍历后没有打印B只打印了AC两个,怎么办啊还是不对啊几乎就是抄书上的写的.
#13
寒风中的细雨2010-09-22 21:16
只有本站会员才能查看附件,请 登录
不是这样的吗?
#14
st_win2010-09-23 12:23
以下是引用小心我人肉你在2010-9-23 08:50:54的发言:

又是一位把台机上的ghost xp安装光盘的经验复制到笔记本的,要知道,笔记本的驱动的适用范围比台机上小很多,所以驱动是有问题的。另外,T400最好装win7,原配就是win7啊。从你的cpu来看,你的T400还是高配机,象内置的磁盘加速功能都是只能在vista/win7上起作用的TIME:2010-7-5 19:20
你太强悍了,你咋知道的, win7 用不了VC6.0和SQL2000啊 所以用的是GHOST XP 我程序问题是以上原因?
1