struct node
{
int info;
struct node *llink;
struct node *rlink;
};
typedef node *nodep;
在结构本身内部有一个结构指针是什么意思? 请详细解释上述结构。
P.S。
我不是在谈论树木的逻辑。我在谈论C结构和指针的行为。
struct node *llink
内存如何分配给它?这种类型还没有出现?
答案 0 :(得分:7)
指针只是对内存中某个位置的引用(“地址”)。对于node
,指向node
实例的指针是对存储该node
实例的内存中位置的引用。
对于您定义的struct
,如果您有一个驻留在一个内存位置的node
实例,它可以指向驻留在自己内存中的另外两个node
实例地点(*llink
,*rlink
)。
使用真实世界树作为隐喻,*llink
和*rlink
分别指向树结构的根节点的左右“分支”。那些指针本身可以分支成更深和更深的左右“子树”。
阅读此introduction to binary trees。
答案 1 :(得分:3)
由于网络中有关于“声明”与“定义”的信息存在一些矛盾,我将坚持{ - 3}} 之后这两个术语的定义:-)。
struct node
{
这是struct“node”的定义的开头。它还引入了类型node
。
int info;
struct node *llink;
struct node *rlink;
以下是一些字段声明。该类型必须是已知的并且已知,因为它已经被引入。 node
的实际大小无关紧要。
};
现在node
的定义已完成,可以用作类型:
typedef node *nodep;
当定义类型为node
的变量时,内存将被分配:
node n = {42, NULL, NULL};
// or
nodep np = (struct node *)malloc(sizeof(struct node));
使用C ++ :但是如果你想在彼此之间使用两种类型呢?然后引入类型B,定义类型A并定义类型B:
class B;
class A
{
class B *pointerToB;
};
class B
{
class A *pointerToA;
};
- >这应该表明这个想法,而不是生产代码。我不确定您是否可以在C中使用struct
而不是class
在上一个示例中使用它。如果这不是100%正确,请发表评论,我会更正。
this post 链接无效
答案 2 :(得分:1)
此页面包含有关树数据结构的信息:
http://en.wikipedia.org/wiki/Tree_(data_structure)
树节点保存数据值(info
成员)和指向左右子树(llink
和rlink
指针)的指针。子树也是节点,因此指针是指向struct node
个对象的指针。有了指针,你可以走树,因为所有节点都是通过指针的存在来链接的。
答案 3 :(得分:0)
可以递归地定义二叉树,如下所示:
struct node
的定义遵循二叉树的递归定义。
例如:
上图代表二叉树。我们可以用以下方式在C中表示这个二叉树:
值为2的节点是没有子树的节点,可以表示为这样的结构:
struct node* node2 = malloc(sizeof(struct node));
node2->info = 2;
node2->llink = NULL;
node2->rlink = NULL;
NULL
和llink
的{{1}}值表示该节点没有子树。请注意,我们可以用值5表示节点(左下角一个,而不是右上角的一个),11和4。
值为6的节点有两个子树(请记住,所有节点本身都是子树),并假设值分别为5和11的节点由
表示rlink
我们可以像这样重新发布我们的节点:
struct node* node5 = malloc(sizeof(struct node));
node5->info = 5;
node5->llink = NULL;
node5->rlink = NULL;
struct node* node11 = malloc(sizeof(struct node));
node11->info = 11;
node11->llink = NULL;
node11->rlink = NULL;
二叉树的所有其他节点也是如此。
请注意,我们正在使用指针来表示子树。原因是使用NULL允许树具有有限数量的元素,否则,二叉树将需要无限量的内存(包含自身的结构,其包含自身,其包含自身,其包含自身。需要无限量的记忆。)
(图片来自维基百科的Binary Tree文章,特别是来自http://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Binary_tree.svg/200px-Binary_tree.svg.png)