树的形参

efenwu 2009-08-31 07:51:28
请问建树的时候形参的传递为什么要这样传递?
BiTree &T,三级指针吗?要怎样理解
还有建树后返回的是 头指点T吗,生成结点时T不是移动了吗?
请各位指点指点了


typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void CreatBiTree(BiTree &T) // BiTree &T
{
TElemType ch;
scanf("%c",&ch);
if(ch==" ") T=NULL:
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(-1);
T->data = ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
...全文
200 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yueyucanyang 2009-09-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 efenwu 的回复:]
各位!我用的是C
也就是说要改成二级指针吗?
但是我改成后
报错了,left of '->lchild' must point to class/struct/union

C/C++ codevoid CreatBiTree(BiTree*T)//?? &T与*T{//递归先序建树 TElemType ch;
scanf("%c",&ch);if(ch=='')
{
(*T)->data=NULL;
}else
{if(!(*T=(BiTree)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
(*T)->data=ch;
CreatBiTree(T->lchild);//报错了 CreatBiTree(T->rchild);
}
}
[/Quote]


BiTree这个本身就是有个指针了BiTree*T就是指向指针的指针了。
CreatBiTree(*T->lchild)这样才可以。
versaariel2009 2009-09-01
  • 打赏
  • 举报
回复
变量在FUNC内通过指向他的指针返回,RETURN返回,引用返回都可以
一般变量
int a
int func(int)func(a) return a
int func(int*)func(&a)
int func(int&)func(a)
指针
int *a
int* func(int *)func(a) return a
int func(int **)func(&a)
int func(int *&)func(a)
fx397993401 2009-09-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kakashi0309 的回复:]
  按引用传递  可以修改本身值 
[/Quote]

同意
abcdef0966 2009-09-01
  • 打赏
  • 举报
回复
void CreatBiTree(BiTree *T)//??  &T与*T 
{ //递归先序建树
TElemType ch;
scanf("%c",&ch);
if(ch==' ')
{
(*T)->data=NULL;
}
else
{
if(!(*T=(BiTree)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
(*T)->data=ch;
CreatBiTree(&((*T)->lchild)); //报错了
CreatBiTree(&((*T)->rchild));
}
}


记住要用&T来调用,(T是BiTree类型)!
selooloo 2009-09-01
  • 打赏
  • 举报
回复
void CreatBiTree(BiTree *T)//?? &T与*T
{ //递归先序建树
TElemType ch;
scanf("%c",&ch);
if(ch==' ')
{
(*T)->data=NULL;
}
else
{
if(!(*T=(BiTree)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
(*T)->data=ch;
CreatBiTree(&((*T)->lchild)); //报错了
CreatBiTree(&((*T)->rchild));
}
}
efenwu 2009-08-31
  • 打赏
  • 举报
回复
啊...
那可以写一下用C建树吗?
我想参考一下..


[Quote=引用 11 楼 yueyucanyang 的回复:]
引用 6 楼 efenwu 的回复:
各位!我用的是C
也就是说要改成二级指针吗?
但是我改成后
报错了,left of '->lchild' must point to class/struct/union

C/C++ codevoid CreatBiTree(BiTree*T)//??  &T与*T{//递归先序建树    TElemType ch;
    scanf("%c",&ch);if(ch=='')
    {
        (*T)->data=NULL;
    }else
    {if(!(*T=(BiTree)malloc(sizeof(BiTNode))))
            exit(OVERFLOW);
        (*T)->data=ch;
        CreatBiTree(T->lchild);//报错了        CreatBiTree(T->rchild);
    }
}


你这个代码和你原来的那份代码不是一回事,而且功能也不一样。
[/Quote]

yueyucanyang 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 efenwu 的回复:]
各位!我用的是C
也就是说要改成二级指针吗?
但是我改成后
报错了,left of '->lchild' must point to class/struct/union

C/C++ codevoid CreatBiTree(BiTree*T)//?? &T与*T{//递归先序建树 TElemType ch;
scanf("%c",&ch);if(ch=='')
{
(*T)->data=NULL;
}else
{if(!(*T=(BiTree)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
(*T)->data=ch;
CreatBiTree(T->lchild);//报错了 CreatBiTree(T->rchild);
}
}
[/Quote]

你这个代码和你原来的那份代码不是一回事,而且功能也不一样。
yueyucanyang 2009-08-31
  • 打赏
  • 举报
回复
BiTree &T,三级指针吗?不是指针形式。你可以建立一个纯c的工程,它是不支持这样的传参的。这是c
++特有的传参方式。
yueyucanyang 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 efenwu 的回复:]
各位!我用的是C
也就是说要改成二级指针吗?
但是我改成后
报错了,left of '->lchild' must point to class/struct/union

C/C++ codevoid CreatBiTree(BiTree*T)//?? &T与*T{//递归先序建树 TElemType ch;
scanf("%c",&ch);if(ch=='')
{
(*T)->data=NULL;
}else
{if(!(*T=(BiTree)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
(*T)->data=ch;
CreatBiTree(T->lchild);//报错了 CreatBiTree(T->rchild);
}
}
[/Quote]

如果是c文件的话,你那样写是错误的。你的文件应该.cpp的吧!~C里边没有你说的那个形式,那个形式只有是取地址,但是函数的形参是错误的。
xiaoshi935 2009-08-31
  • 打赏
  • 举报
回复
下面是我之前写的一个程序,可以跟LZ分享一下:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define STACK_INT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2

typedef char TElemType;
typedef int Status;
typedef char SElemType;

//二叉树的二叉链表存储表示
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild; //左右孩子指针
}BiTNode, *BiTree;


typedef struct {
BiTree *base;
BiTree *top;
int stacksize; //当前已分配的存储空间
}SqStack;

Status InitStack(SqStack &S) {
S.base = (BiTree *) malloc(sizeof(BiTree));
if(!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INT_SIZE;
return OK;
}

Status GetTop(SqStack &S, BiTree &e) {
//若栈不空,则用e返回S的栈顶元素
if(S.top == S.base) return ERROR;
e = *(S.top-1);
return OK;
}

Status Push(SqStack &S, BiTree e) {
//插入元素e为栈顶元素
if(S.top - S.base >= S.stacksize) { //若栈满,则追加存储空间
S.base = (BiTree *) realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(BiTree));
if(!S.base) return ERROR;
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top = e;
S.top++;
return OK;
}

Status Pop(SqStack &S,BiTree &e) {
//删除S的栈顶元素,并用e返回
if(S.base == S.top) return ERROR;
S.top--;
e = *S.top;
return OK;
}

Status StackEmpty(SqStack S) {
// 若栈S为空栈,则返回TRUE,否则返回FALSE
if(S.top == S.base) return TRUE;
else return FALSE;
}

Status CreateBiTree(BiTree &T) {
//按先序次序输入二叉树中结点的值
//构造二叉链表表示的二叉树T
char ch;
scanf("%c",&ch);
if(ch == '0') T = NULL;
else {
if(!(T = (BiTNode *) malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data = ch; //生成根结点
CreateBiTree(T->lchild); //构造左子树
CreateBiTree(T->rchild); //构造右子树
}
return OK;
} //CreateBiTree


Status PreOrderTraverse(BiTree T) {
//中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit
SqStack S;
InitStack(S);
BiTree p;
p = T;
while(p || !StackEmpty(S)) {
if(p) {
printf("%c",p->data);
Push(S,p);
p = p->lchild; //根指针进栈,遍历左子树
}
else{ //根指针退栈,访问根结点,遍历右子树
Pop(S,p);
p = p->rchild;
}
}//while
return OK;
} //InOrderTraverse

Status InOrderTraverse(BiTree T) {
//中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit
SqStack S;
InitStack(S);
BiTree p;
p = T;
while(p || !StackEmpty(S)) {
if(p) {
Push(S,p);
p = p->lchild; //根指针进栈,遍历左子树
}
else{ //根指针退栈,访问根结点,遍历右子树
Pop(S,p);
printf("%c",p->data);
p = p->rchild;
}
}//while
return OK;
} //InOrderTraverse

Status PostOrderTraverse(BiTree T) {
//运用非递归的方法遍历二叉树 数据结构为栈
SqStack S;
InitStack(S);
BiTree p, lastvisit;
p = T;
lastvisit = NULL;
while(p || !StackEmpty(S)) {
while(p) {
Push(S,p);
p = p->lchild;
}
Pop(S,p);
S.top++;
if(p->rchild == NULL || p->rchild == lastvisit) {
printf("%c",p->data);
S.top--;
lastvisit = p;
p = NULL;
}
else {
p = p->rchild;
}
}
return OK;
}

void main() {
printf("请输入先序建立二叉树所需要的数据(例如ABD0000):");
BiTree t;
CreateBiTree(t);
printf("中序输出为:");
InOrderTraverse(t);
printf("\n");
printf("先序输出为:");
PreOrderTraverse(t);
printf("\n");
printf("后序输出为:");
PostOrderTraverse(t);
printf("\n");
}

/*
A
/ \
B 0
/ \
D 0
/ \
0 0


*/

在VC6.0下编译通过。
xiaoshi935 2009-08-31
  • 打赏
  • 举报
回复

Status CreateBiTree(BiTree &T) {
//按先序次序输入二叉树中结点的值
//构造二叉链表表示的二叉树T
char ch;
scanf("%c",&ch);
if(ch == '0') T = NULL;
else {
if(!(T = (BiTNode *) malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data = ch; //生成根结点
CreateBiTree(T->lchild); //构造左子树
CreateBiTree(T->rchild); //构造右子树
}
return OK;
} //CreateBiTree

刚看过的内容。
这个是我写的程序,已经运行通过的。

这里面确实该用&,表示引用的意思。如同2楼4楼说的那样。


建树后返回的是根结点。那里面递归都是递归的T->lchild或者T->rchild,所以最终返回的是根结点而已。
efenwu 2009-08-31
  • 打赏
  • 举报
回复
各位!我用的是C
也就是说要改成二级指针吗?
但是我改成后
报错了,left of '->lchild' must point to class/struct/union


void CreatBiTree(BiTree *T)//?? &T与*T
{ //递归先序建树
TElemType ch;
scanf("%c",&ch);
if(ch==' ')
{
(*T)->data=NULL;
}
else
{
if(!(*T=(BiTree)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
(*T)->data=ch;
CreatBiTree(T->lchild); //报错了
CreatBiTree(T->rchild);
}
}
selooloo 2009-08-31
  • 打赏
  • 举报
回复
BiTree &T 是二级指针,也就是BiTNode ** 。书上的都是伪码,应该写为void CreatBiTree(BiTree *T)
如定义一个树 BiTree B;传递进函数就为CreatBiTree(BiTree &B)
建树返回的就是头指针,如上就是返回 B的值,T只是形参,不要被递归函数迷惑,递归只是引用的函数是自己罢了
yueyucanyang 2009-08-31
  • 打赏
  • 举报
回复
这个是引用传递,在C++有,C中是没有引用的。
引用简单来说就是给变量起个别名。例如,你一个人名字叫张三,小名叫小三。当你打小三一下的时候,张三也能感觉到疼,因为就是一个人。引用的道理类似,函数带有引用的参数可以作为输出来看待,例如函数为理发店,小三进去理个发,出来张三边精神了。
而你这里的引用是一个地址的引用。刚进来的时候地址可能为分配空间,进到函数内部他就会分配空间,而且分配好的空间在出函数时也不会消失。
InwIvled 2009-08-31
  • 打赏
  • 举报
回复
BiTree &T,可以理解为BiTNode **

生成节点时传的是T的成员,T本身不会变
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
kakashi0309 2009-08-31
  • 打赏
  • 举报
回复
按引用传递 可以修改本身值
asimay 2009-08-31
  • 打赏
  • 举报
回复
BiTree &T,按引用传递,可以理解为根指针传递类似,直接对变量进行修改。

69,382

社区成员

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

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