转载自:http://blog.sina.com.cn/s/blog_d71cfd5b0102v61x.html
因为在复习数据结构的时候看到了二叉树这一章,想要自己实现一下具体的代码,但是在使用中发现了问题,这里简单的记载一下,方便以后查看。
- #include
- #include
- typedef structBiTNode
- {
-
int data; -
struct BiTNode *lchild, *rchild; - }BiTNode, *BiTree;
首先问题是定义结构体时,因为用到了结构体指针,所以在结构内部必须指明BiTNode是一个结构,即必须加上struct关键字,否则编译的时候会出现BiTNode是未知的类型名。
- void createTree(BiTree*T)
- {
-
int i; -
scanf("%d", &i); -
if(i == -1) -
{ -
*T =NULL; -
} -
else -
{ -
*T =(BiTNode *)malloc(sizeof(BiTNode)); -
(*T)->data = i; -
createTree(&(*T)->lchild); -
createTree(&(*T)->rchild); -
} - }
在做这个代码的时候,我出现的主要问题是如何想办法从main函数中创建一个节点,然后用参数的形式传递给函数,并让函数在处理完相应的内容后,能够保存改变的内容,当然这里最简单的办法是用c++的reference(引用)特性,但是由于c语言不支持这中特性,所以不能够使用。还有一个办法是通过函数的返回值返回结构指针,但是这里我想通过传地址的方式处理,所以只能想办法把地址作为函数的参数传进去,然后在函数内部创建这个地址有关的内容,具体的内容就是上面的代码所示。
上面这段代码最主要的是里面的处理过程,可以看到,T是“BiTree *”型的,也就是“BiTNode**”型的,所以在对结构赋值时,要用(*T)来取得T所指向的单元的内容,它是一个指向“BiTNode”结构体的指针,这里不懂的话,建议去看c语言里面的指针的指针部分。
- void visit(BiTree*T)
- {
-
if(*T) -
{ -
visit(&(*T)->lchild); -
printf("%d\n", (*T)->data); -
visit(&(*T)->rchild); -
} - }
这段代码没什么作用,就是跟上面的一样的。
- int main(void)
- {
-
BiTNode* root = NULL; -
createTree(&root); -
visit(&root); -
return 0; - }
注意这里的传参数的方式,在传参数的使用,我们用“&”操作符来取得root的地址,然后传递进去。这里创建的root是一个“BiTNode*”型的指针!!!
就说这么多吧,
如果还是没怎么懂的话,可以去看一下stackoverflow上面的帖子。