关于昨天那个二叉树的帖子

nanjingnew4 2012-03-21 09:52:50
昨天看到有人发了个二叉树的帖子,因为自己也不太熟,所以拿来练了练手,带来几个疑惑,希望大家能讨论讨论,帮我解决一下,谢谢各位了
下面帖子上注释写的我的问题

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct BiNode
{
char data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
void CreateBiTree(BiTree &T) /*这个地方加了个&符号,我在gcc下编译会出错,所以我想问下大家,
这个&符号有没有问题,当然我也查了下,发现很多C++代码里写了这个 */
{
char ch;
ch=getchar();
fflush(stdin); //这句话是我加的,我觉得有必要,不然输入有回车字符残留,程序会直接跳出
if(ch!='\n')
{
if(ch=='#') T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiNode)); /*在这个地方动态分配内存空间,是否能起到给
传址的树分配,我测试了我觉得不能*/
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
}
void Xianxu(BiTree T)
{
if(T)
{
printf("%c",T->data);
Xianxu(T->lchild);
Xianxu(T->rchild);
}
}
int main()
{
BiTree T;
printf("请输入:\n");
CreateBiTree(T);
Xianxu(T);
return 0;
}


昨天的帖子地址 http://topic.csdn.net/u/20120319/15/6bdbcc56-13c4-4760-b40e-4fcaa69e0476.html
1L给出我自己的代码
...全文
148 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
nanjingnew4 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 pengzhixi 的回复:]
你需要理解的是修改的是指针变量本身的值还是说指针所指对象的值。
[/Quote]
换句话说,我用void CreateBiTree(BiTree T)也行,所以很疑惑
qixing1115 2012-03-21
  • 打赏
  • 举报
回复
不错不错,值得学习,爱学习的好孩子啊
nanjingnew4 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 pengzhixi 的回复:]
你需要理解的是修改的是指针变量本身的值还是说指针所指对象的值。
[/Quote]
拿你这句话去套那段代码似乎有点懂。。。但是你看我1楼写的代码,用的就是void CreateBiTree(BiTree T)
pengzhixi 2012-03-21
  • 打赏
  • 举报
回复
你需要理解的是修改的是指针变量本身的值还是说指针所指对象的值。
nanjingnew4 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pengzhixi 的回复:]
额你需要去看下函数参数的传值方式了。
[/Quote]
传值调用不改变实参值,传地址调用改变实参值
nanjingnew4 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 csnd_life 的回复:]
引用 6 楼 nanjingnew4 的回复:
引用 4 楼 csnd_life 的回复:
建议用g++编译,gcc是按照c语言编译的,c中没有引用。编译C++用g++

这是c写的吧
那为什么里面会出现引用void CreateBiTree(BiTree &T) 呢?
[/Quote]
所以我提出来这句话不对,你看我的注释,我拿的别人的帖子来编译的,1L是我自己改的
csnd_life 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 nanjingnew4 的回复:]
引用 4 楼 csnd_life 的回复:
建议用g++编译,gcc是按照c语言编译的,c中没有引用。编译C++用g++

这是c写的吧
[/Quote]那为什么里面会出现引用void CreateBiTree(BiTree &T) 呢?
pengzhixi 2012-03-21
  • 打赏
  • 举报
回复
额你需要去看下函数参数的传值方式了。
nanjingnew4 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 pengzhixi 的回复:]
这个用什么方式就自己选择了。
[/Quote]
还有个问题想问一下,BiTree 本身就是指针了,BiTree T,这个T传的不就是地址么,为何还需要void CreateBiTree(BiTree *T)
老鼠期待爱 2012-03-21
  • 打赏
  • 举报
回复
你看的代码,应该是书上面的,数据结构上的基本上都是这样的,最少我不习惯这样,C很少这样用的饿,你直接改指针啊,这样你就会习惯点了,不要用引用
huojicha 2012-03-21
  • 打赏
  • 举报
回复
你的BiTree相当于 BiNode*,
而你的Create函数参数为一个引用, 而这个引用又没有初始化,肯定会出错的.
你需要BiTree tree = NULL;
pengzhixi 2012-03-21
  • 打赏
  • 举报
回复
这个用什么方式就自己选择了。
nanjingnew4 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pengzhixi 的回复:]
我记得你上一个帖子是有scanf的。只需要在scanf后面加上getchar即可。这样就可以吃掉回车。
[/Quote]
这个还真没有,我更喜欢用fflush(stdin);
nanjingnew4 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 csnd_life 的回复:]
建议用g++编译,gcc是按照c语言编译的,c中没有引用。编译C++用g++
[/Quote]
这是c写的吧
pengzhixi 2012-03-21
  • 打赏
  • 举报
回复
我记得你上一个帖子是有scanf的。只需要在scanf后面加上getchar即可。这样就可以吃掉回车。
csnd_life 2012-03-21
  • 打赏
  • 举报
回复
建议用g++编译,gcc是按照c语言编译的,c中没有引用。编译C++用g++
nanjingnew4 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengzhixi 的回复:]
1.&是c++里面的引用,属于c++里面的概念,所以c里面不适用。你可以改成BitTree*T
直接getchar()即可,不需要将getchar返回的值付给ch,否则你就将回车也添加到二叉树了。
3.如果是c++里面的引用那么你那个malloc是没任何问题的,但是c的话改成BitTree *T;然后那句改成
*T=(BiTree)malloc(sizeof(BiNode)); *T……
[/Quote]
getchar()的原型就是 int getchar(void)吧,不写ch=getchar()怎么给ch赋值呢
pengzhixi 2012-03-21
  • 打赏
  • 举报
回复
1.&是c++里面的引用,属于c++里面的概念,所以c里面不适用。你可以改成BitTree*T
直接getchar()即可,不需要将getchar返回的值付给ch,否则你就将回车也添加到二叉树了。
3.如果是c++里面的引用那么你那个malloc是没任何问题的,但是c的话改成BitTree *T;然后那句改成
*T=(BiTree)malloc(sizeof(BiNode)); *T=NULL;(*T)->data=ch;
Xianxu(&((*T)->lchild));
Xianxu(&((*T)->rchild));
nanjingnew4 2012-03-21
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct BiNode
{
char data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;

BiTree initList()
{
BiTree head;
head = (BiTree)malloc(sizeof(BiNode));
if(head == NULL)
return NULL;
head->lchild = NULL;
head->rchild = NULL;
return head;
}

void CreateBiTree(BiTree T)
{
char ch;
//fflush(stdin);
ch=getchar();
fflush(stdin);
if(ch!='\n')
{
if(ch=='#')
{
T->data=NULL;

}
else
{
//T=(BiTree)malloc(sizeof(BiNode)); //另外开辟了内存空间赋值,所以无法打印
T->data=ch;
//printf("赋值为%c\n",T->data);
T->lchild=initList();
CreateBiTree(T->lchild);
T->rchild=initList();
CreateBiTree(T->rchild);
}
}
}

void Xianxu(BiTree T)
{
if(T!=NULL)
{
if(T->data!=NULL)
{

printf("%c\n",T->data);

Xianxu(T->lchild);

Xianxu(T->rchild);

}
}
}

int main()
{
BiTree T;
T=initList();
printf("请输入:\n");
CreateBiTree(T);
//printf("运行1\n");
//printf("赋值为%c\n",T->data);
Xianxu(T);
return 0;
}


palm_m 2012-03-21
  • 打赏
  • 举报
回复
二叉树结构中比较难点的是 线索化 和 树的平衡(旋转)
希望哪位前辈能给出 线索化 和 旋转的算法

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧