了解包含自己类型指针的结构

时间:2012-01-30 10:01:29

标签: c pointers data-structures struct

struct node
{
     int         info;
     struct node *llink;
     struct node *rlink;
};

typedef node *nodep;

在结构本身内部有一个结构指针是什么意思? 请详细解释上述结构。

P.S。
我不是在谈论树木的逻辑。我在谈论C结构和指针的行为。

编辑1:

struct node *llink内存如何分配给它?这种类型还没有出现?

4 个答案:

答案 0 :(得分:7)

指针只是对内存中某个位置的引用(“地址”)。对于node,指向node实例的指针是对存储该node实例的内存中位置的引用。

对于您定义的struct,如果您有一个驻留在一个内存位置的node实例,它可以指向驻留在自己内存中的另外两个node实例地点(*llink*rlink)。

使用真实世界树作为隐喻,*llink*rlink分别指向树结构的根节点的左右“分支”。那些指针本身可以分支成更深和更深的左右“子树”。

阅读此introduction to binary trees

binary tree

答案 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成员)和指向左右子树(llinkrlink指针)的指针。子树也是节点,因此指针是指向struct node个对象的指针。有了指针,你可以走树,因为所有节点都是通过指针的存在来链接的。

答案 3 :(得分:0)

可以递归地定义二叉树,如下所示:

  • 每个节点(没有子树的节点)本身就是二叉树。
  • 如果节点有左子树,右子树或两者,则它是二叉树。

struct node的定义遵循二叉树的递归定义。

例如:

Binary tree Example

上图代表二叉树。我们可以用以下方式在C中表示这个二叉树:

值为2的节点是没有子树的节点,可以表示为这样的结构:

struct node* node2 = malloc(sizeof(struct node));
node2->info = 2;
node2->llink = NULL;
node2->rlink = NULL;

NULLllink的{​​{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