Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 了解包含自己类型指针的结构_C_Pointers_Data Structures_Struct - Fatal编程技术网

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

C 了解包含自己类型指针的结构,c,pointers,data-structures,struct,C,Pointers,Data Structures,Struct,将结构的指针放在该结构本身内部意味着什么? 请详细解释上述结构 附加说明 我不是在说树的逻辑。我说的是C结构和指针的行为 编辑1: struct node*llink如何将内存分配给此节点?这是一种尚未出现的类型?指针只是对内存中某个位置(“地址”)的引用。对于节点,指向节点实例的指针是对存储该节点实例的内存位置的引用 对于定义的结构,如果一个节点的实例驻留在一个内存位置,它可以指向驻留在各自内存位置的两个其他节点实例(*llink,*rlink) 使用真实世界的树作为隐喻,*llink和*rl

将结构的指针放在该结构本身内部意味着什么?
请详细解释上述结构

附加说明
我不是在说树的逻辑。我说的是C结构和指针的行为

编辑1:
struct node*llink
如何将内存分配给此节点?这是一种尚未出现的类型?

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

对于定义的
结构
,如果一个
节点的实例驻留在一个内存位置,它可以指向驻留在各自内存位置的两个其他
节点
实例(
*llink
*rlink

使用真实世界的树作为隐喻,
*llink
*rlink
分别是指向树结构的根节点的左“分支”和右“分支”的指针。这些指针本身可能会分支到更深入的左、右“子树”中

读一读这个


此页面包含有关什么是树数据结构的信息:

)


树节点保存数据值(
info
成员)和指向左右子树的指针(
llink
rlink
指针)。子树也是节点,因此指针是指向
struct node
对象的指针。使用指针可以遍历树,因为所有节点都通过指针的存在进行链接。

二叉树可以这样递归定义:

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

typedef node *nodep;
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;
  • 每个节点(没有子树的节点)本身就是一棵二叉树
  • 如果一个节点有一个左子树、一个右子树或两者都有,那么它就是一个二叉树
结构节点的定义遵循二叉树的递归定义

例如:

上图表示一棵二叉树。我们可以用以下方式在C中表示此二叉树:

值为2的节点是一个没有子树的节点,可以表示为如下结构:

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

typedef node *nodep;
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;
llink
rlink
NULL
值表示节点没有子树。请注意,我们可以用值5(左下一,而不是右上)11和4表示节点

值为6的节点有两个子树(请记住,所有节点本身都是子树),假设值为5和11的节点分别由

struct node* node2 = malloc(sizeof(struct node));
node2->info = 2;
node2->llink = NULL;
node2->rlink = NULL;
我们可以像这样重复我们的节点:

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

typedef node *nodep;
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的使用允许树具有有限数量的元素,否则,二叉树将需要无限量的内存(包含自身的结构,包含自身的结构,包含自身的结构,包含自身的结构…需要无限量的内存)

(图片摘自维基百科文章,具体来说,摘自)

由于网络上关于“声明”和“定义”的信息相互矛盾,我将坚持以下两个术语的定义:-)

这是结构“节点”定义的开始。它还介绍了类型
节点

struct node
{
下面是一些字段声明。类型必须是已知的,并且是已知的,因为它已经被引入。
节点的实际大小与此无关

     int         info;
     struct node *llink;
     struct node *rlink;
现在,
节点
的定义已经完成,可以作为一种类型使用:

};
定义
节点
类型的变量时,将分配内存:

typedef node *nodep;

使用C++:但是如果要在彼此之间使用两种类型,该怎么办?然后介绍类型B,定义类型A和定义类型B:

node n = {42, NULL, NULL};
// or
nodep np = (struct node *)malloc(sizeof(struct node));
->这应该是为了展示想法,而不是生产代码。我不确定是否可以在C中使用它,而不是在上一个示例中使用
struct
,而不是
class
。如果这不是100%正确,请评论,我会纠正



链接不再有效

nodep是一个结构的指针。它在整个程序中用作这个结构(节点)的指针,假设我们创建一个任意整数的指针,就像这里一样*nodep是一个节点的指针structure@user1089679我不是说诺德普。我说的是
struct node*llink;结构节点*rlink它们在类型的结构中。到外面看一棵树。树干上有一个左右两侧的支柱。把它砍下来,塞进地里。看起来像棵树@Anisha Kaul好的,只是因为“请详细解释上述结构。”听起来像是教科书上的,如果是作业之类的话,最好贴上“家庭作业”的标签,以避免被否决……@AnishaKaul很抱歉让你困惑,我刚从Alex Reynolds那里学到答案,在二叉树中,孩子们被命名为“左”和“右”(外语和命名惯例…),所以忽略我之前的评论。前两段让我明白了我想要的。这就像
structk{int*m}这意味着struct k的实例可以包含指向int的实例的指针?对吗?类似地,它还可以包含指向其他结构实例的指针?毕竟,即使类型相同,位置也会不同,因此它不是
struct node{struct node*llink;}指向“自身”的指针?是吗?@AnishaKaul“所以它不是结构节点{struct node*llink;};指向“自身”的指针”?“->正确
llink
可以保存指向
struct节点实例的指针
。这不一定是同一个实例,尽管它当然可以。(带节点)