#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
int data;
struct Node *lchild,*rchild;
}BiTree,*BiTNode;
void CreateBiTree(BiTNode* T)
{
int ch;
printf("输入子节点:");
scanf("%d",&ch);
if(ch == 0)
{
*T = NULL;
}
else
{
*T = (BiTree*)malloc(sizeof(BiTNode));
(*T)->data = ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
void TraverseBiTree(BiTree *T)
{
if (T != NULL )
{
printf("%d ", T->data);
TraverseBiTree(T->lchild);
TraverseBiTree(T->rchild);
}
}
void main()
{
BiTNode T;
CreateBiTree(&T);
TraverseBiTree(T);
}
您好!该段代码为二叉树的建立赋值以及先序遍历。在void CreateBiTree(BiTNode* T)函数中,BiTNode为二叉树的指针类型别名,BiTNode* T 也就相当于 BiTree *(*T)。在此,我想询问一下,为什么要使用BiTNode* T ,而不是BiTNode T? 即 void CreateBiTree(BiTNode T),代码其余部分做相应的修改。
因为CreateBiTree函数里面涉及到分配内存操作,必须传递二级指针才能真正将实参指向分配的内存,否则只是形参指向了该块内存,而形参在函数调用结束后就清空了。
受教育了
可以再详细点解说么,谢谢
看来这位同学要好好补补指针了,这是基础。如果不用指针则是用的BiTNode的副本,并未对原内存中的数据进行操作,而只是对其副本操作的。估计你也被我说晕了,还是多看看一些基础性原理性的书吧。