鱼C论坛

 找回密码
 立即注册
查看: 3410|回复: 7

[已解决]小甲鱼老师的二叉树的建立和遍历程序里有个问题求帮助

[复制链接]
发表于 2015-5-13 09:58:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在创建二叉树的函数CreateBiTree(BiTree *T)里,T是二叉树节点BiTNode的指针的指针;现在我修改这个函数的参数类型为节点的指针,即CreateBiTree(BiTree  T),函数内相应的参数也都修改过来了,编译没问题,就是输出没结果,请问原因出在哪里?谢谢
最佳答案
2015-5-13 18:36:00
本帖最后由 lightninng 于 2015-5-13 18:38 编辑

关于两者之间的区别,楼主自行搜索,C语言,形参和实参~~
另外,楼主你说的没有出结果是指?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-5-13 10:01:40 | 显示全部楼层
修改后的代码:
  1. void CreateBiTree(BiTree T)
  2. {
  3.         char c;
  4.         scanf("%c", &c);
  5.         if( ' ' == c )
  6.         {
  7.                 T = NULL;
  8.         }
  9.         else
  10.         {
  11.                 T = (BiTNode *)malloc(sizeof(BiTNode));
  12.                 T->data = c;
  13.                 CreateBiTree(T->lchild);
  14.                 CreateBiTree(T->rchild);
  15.         }
  16. }
复制代码

原来的代码:
  1. void CreateBiTree(BiTree *T)
  2. {
  3.         char c;
  4.         scanf("%c", &c);
  5.         if( ' ' == c )
  6.         {
  7.                 *T = NULL;
  8.         }
  9.         else
  10.         {
  11.                 *T = (BiTNode *)malloc(sizeof(BiTNode));
  12.                 (*T)->data = c;
  13.                 CreateBiTree(&(*T)->lchild);
  14.                 CreateBiTree(&(*T)->rchild);
  15.         }
  16. }
复制代码


节点定义:
  1. typedef struct BiTNode
  2. {
  3.         char data;
  4.         struct BiTNode *lchild, *rchild;
  5. } BiTNode, *BiTree;
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-13 18:36:00 | 显示全部楼层    本楼为最佳答案   
本帖最后由 lightninng 于 2015-5-13 18:38 编辑

关于两者之间的区别,楼主自行搜索,C语言,形参和实参~~
另外,楼主你说的没有出结果是指?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-13 18:49:54 | 显示全部楼层
lightninng 发表于 2015-5-13 18:36
关于两者之间的区别,楼主自行搜索,C语言,形参和实参~~
另外,楼主你说的没有出结果是指?

完整代码:
  1. typedef char ElemType;

  2. typedef struct BiTNode
  3. {
  4.         char data;
  5.         struct BiTNode *lchild, *rchild;
  6. } BiTNode, *BiTree;

  7. // 创建一棵二叉树,约定用户遵照前序遍历的方式输入数据
  8. void CreateBiTree(BiTree *T)
  9. {
  10.         char c;
  11.         scanf("%c", &c);
  12.         if( ' ' == c )
  13.         {
  14.                 *T = NULL;
  15.         }
  16.         else
  17.         {
  18.                 *T = (BiTNode *)malloc(sizeof(BiTNode));
  19.                 (*T)->data = c;
  20.                 CreateBiTree(&(*T)->lchild);
  21.                 CreateBiTree(&(*T)->rchild);
  22.         }
  23. }

  24. // 访问二叉树结点的具体操作,你想干嘛?!
  25. void visit(char c, int level)
  26. {
  27.         printf("%c 位于第 %d 层\n", c, level);
  28. }

  29. // 前序遍历二叉树
  30. void PreOrderTraverse(BiTree T, int level)
  31. {
  32.         if( T )
  33.         {
  34.                 visit(T->data, level);
  35.                 PreOrderTraverse(T->lchild, level+1);
  36.                 PreOrderTraverse(T->rchild, level+1);
  37.         }
  38. }

  39. int main()
  40. {
  41.         int level = 1;
  42.         BiTree T = NULL;

  43.         CreateBiTree(&T);
  44.         printf("%c",T->data);
  45.         PreOrderTraverse(T, level);

  46.         return 0;
  47. }
复制代码


没出结果就是说,没有输出二叉树各节点,程序在执行PreOrderTraverse()函数时,执行到if语句,没满足条件就直接结束了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-13 18:53:01 | 显示全部楼层
lightninng 发表于 2015-5-13 18:36
关于两者之间的区别,楼主自行搜索,C语言,形参和实参~~
另外,楼主你说的没有出结果是指?

楼上是正确代码,我把CreateBiTree()参数修改后,就打印不出结果了
修改的部分:
  1. void CreateBiTree(BiTree T)
  2. {
  3.         char c;
  4.         scanf("%c", &c);
  5.         if( ' ' == c )
  6.         {
  7.                 T = NULL;
  8.         }
  9.         else
  10.         {
  11.                 T = (BiTNode *)malloc(sizeof(BiTNode));
  12.                 T->data = c;
  13.                 CreateBiTree(T->lchild);
  14.                 CreateBiTree(T->rchild);
  15.         }
  16. }



  17. int main()
  18. {
  19.         int level = 1;
  20.         BiTree T = NULL;

  21.         CreateBiTree(T);
  22.         printf("%c",T->data);
  23.         PreOrderTraverse(T, level);

  24.         return 0;
  25. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-13 22:12:43 | 显示全部楼层
本帖最后由 lightninng 于 2015-5-13 22:16 编辑
study_ckj 发表于 2015-5-13 18:53
楼上是正确代码,我把CreateBiTree()参数修改后,就打印不出结果了
修改的部分:

楼主既然知道PreOrderTraverse的值,想必也能想到CreateBiTree函数并没有如你所想的那样创建一棵二叉树,其实原因我在上面已经指出来了,形参和实参的问题,举个简单的例子
  1. a=1;
  2. b=2;
复制代码
然后要求你写一个函数,作用是交换a和b的值,即你的函数运行之后,a=2, b=1
把这个例子完成基本你自己就能解决你的这个问题了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-28 20:12:45 | 显示全部楼层
形参和实参的区别,不加指针的只是在子函数中改变了,但是在主函数中没有改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-1 19:43:10 | 显示全部楼层
先回后看。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 12:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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