之前一直对数据结构中
1 | typedef struct xxx |
中*yyy
一处与xxx
的关系感觉比较迷茫,这里整理一下。
关于struct xxx
显式使用struct xxx
的原因在于需要在struct
结构体中嵌套定义一个下级同数据类型节点的指针,而在这个结构体的定义过程中,struct xxx
= xxx
这个结构是定义完成后才生效的,在定义过程中要引用这个数据结构则必须先用struct xxx
这种形式,所以需要显式定义一个struct xxx
。
关于后面的*yyy
在定义后面跟一个*yyy
表示的是yyy是xxx的指针型的别名(yyy
=*xxx
),而非是*yyy
=xxx
【有点绕】
通过下图解释:
以二叉树为例
BiTNode
是二叉树的数据节点
左右的变量为指向下面一个数据节点的指针,这个指向数据节点的指针(*BiTNode
)又是一个子树(BiTree
)
而对整个二叉树,也是由一个指向BiTNode
的指针定义的,也就是整个二叉树也可以表示为一个BiTree
的数据类型。
总而言之,上面的解释可以总结为,一个数据结构的整体可以由一个指向基础数据节点(头结点)的指针表示。
最后补一个问题,就是在函数传参时有时候需要传入一个*BiTree
,这是因为如果传BiTree
即*BiTNode
时,则函数中只能更改指向子树内存里的内容,也就是下面子树中的数据,必须传*BiTree
才能更改上面结构中*lChild
是指向一个子树还是指向一个Null