签到

06月21日
尚未签到

共有回帖数 0

    李小主任

    等级:
    void CreatBiTree(BiTree T)
    {
       char a;
       
       scanf("%c",&a);
       if(a=='@')
        T=NULL;
       else
        {
          T=(BiTree)malloc(sizeof(BiNode));
          T-data=a;
          CreatBiTree(T-lchild);
          CreatBiTree(T-rchild);
        }
       
    }

    虽能编译,但不能正确运行,冥思苦想n小时,未果

    遂改其为

    BiTree CreatBiTree()
    {
       char a;
       BiTree T;
       scanf("%c",&a);
       if(a=='@')
        T=NULL;
       else
        {
          T=(BiTree)malloc(sizeof(BiNode));
          T-data=a;
          T-lchild=CreatBiTree();
          T-rchild=CreatBiTree();
        }
        return T;
    }

    不再用传递参数,用返回值,正确编译运行,喜。

    重审前程序,改为

    void CreatBiTree(BiTree *T)
    {
       char a;
       scanf("%c",&a);
       if(a=='@')
        *T=NULL;
       else
        {
          *T=(BiTree)malloc(sizeof(BiNode));
          (*T)-data=a;
          CreatBiTree(&((*T)-lchild));
          CreatBiTree(&((*T)-rchild));
        }
       
    }

    正确编译运行,惑。
    又冥思苦想n小时,终于悟出其中原由(好象多难似的,或者其实是我太愚钝)
    原来还是对指针的理解不够深刻
    最开始的程序传递的是Node型结构体的指针,于是在函数中会生成一个形参也指向这个结构体,但在函数中有一句T=(BiTree)malloc(sizeof(BiNode)); 改变了形参的指向,以后再对形参的任何操作不会在主函数中的T产生影响。

    下面是两个完整的程序,分别用的两种建树方法

    #include "stdlib.h"
    #include "conio.h"
    typedef struct node
    {
       char data;
       struct node *lchild,*rchild;
    }BiNode,*BiTree;
    BiTree CreatBiTree()
    {
       char a;
       BiTree T;
       scanf("%c",&a);
       if(a=='@')
        T=NULL;
       else
        {
          T=(BiTree)malloc(sizeof(BiNode));
          T-data=a;
          T-lchild=CreatBiTree();
          T-rchild=CreatBiTree();
        }
        return T;
    }
    void PreOrderTraverse(BiTree T)
    {
      if(T)
       {
        printf("%c",T-data);

          PreOrderTraverse(T-lchild);

          PreOrderTraverse(T-rchild);
        }
    }
    void InOrderTraverse(BiTree T)
    {
        if(T)
          {
    InOrderTraverse(T-lchild);
    printf("%c",T-data);
    InOrderTraverse(T-rchild);
          }
    }
    void PostOrderTraverse(BiTree T)
    {
       if(T)
       {
           PostOrderTraverse(T-lchild);
           PostOrderTraverse(T-rchild);
           printf("%c",T-data);
       }
    }
    main()
    {
    BiTree T;
    clrscr();
    T=CreatBiTree();
    PreOrderTraverse(T);
    printf("n");
    InOrderTraverse(T);
    printf("n");
    PostOrderTraverse(T);
    }



    #include "stdlib.h"
    #include "conio.h"
    typedef struct node
    {
       char data;
       struct node *lchild,*rchild;
    }BiNode,*BiTree;
    void CreatBiTree(BiTree *T)
    {
       char a;
       
       scanf("%c",&a);
       if(a=='@')
        *T=NULL;
       else
        {
          *T=(BiTree)malloc(sizeof(BiNode));
          (*T)-data=a;
          CreatBiTree(&((*T)-lchild));
          CreatBiTree(&((*T)-rchild));
        }
       
    }
    void PreOrderTraverse(BiTree T)
    {
      if(T)
       {
        printf("%c",T-data);

          PreOrderTraverse(T-lchild);

          PreOrderTraverse(T-rchild);
        }
    }
    void InOrderTraverse(BiTree T)
    {
        if(T)
          {
    InOrderTraverse(T-lchild);
    printf("%c",T-data);
    InOrderTraverse(T-rchild);
          }
    }
    void PostOrderTraverse(BiTree T)
    {
       if(T)
       {
           PostOrderTraverse(T-lchild);
           PostOrderTraverse(T-rchild);
           printf("%c",T-data);
       }
    }
    main()
    {
    BiTree T;
    clrscr();
    CreatBiTree(&T);
    PreOrderTraverse(T);
    printf("n");
    InOrderTraverse(T);
    printf("n");
    PostOrderTraverse(T);
    }
    更多数据结构实例http://hi.baidu.com/longzuo

    楼主 2016-04-28 11:12 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知