首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这些声明有什么不同?

这些声明有什么不同?
EN

Stack Overflow用户
提问于 2016-01-17 02:44:28
回答 3查看 65关注 0票数 1

我正在学习数据结构的使用,并遇到了一些疑问:

代码语言:javascript
运行
复制
struct node
{
  int data;
  struct node *next;
}*head;

Question1:在上面的结构中,在结构中声明一个结构节点*next意味着什么?它与简单地将结构中的指针变量声明为int *next有什么不同?

Question2:我们可以看到,在结构定义的末尾,一个指针*head被声明为节点类型,并用于访问结构成员(如果我是正确的)。这和这样声明是一样的吗?

代码语言:javascript
运行
复制
                            struct node *head;

如果能帮上忙就太好了。先谢谢大家。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-17 02:54:22

在C中,链接列表通常是这样声明的--链接列表是包含数据的一系列节点,以及指向该系列中下一个节点的链接(在本例中是一个指针)。

因此,struct node类型的每个对象都应该包含指向另一个struct node的指针。它的特点是在结构中声明一个字段next,并使用struct node *类型。

至于第二个问题:您提供的代码都定义了struct node (允许实例化struct node类型的对象),并声明了一个指向这样一个名为head的结构的指针。您当然可以按照您所要求的方式定义变量head,但是您仍然需要在代码的早期位置定义结构。这通常是在一个单独的头文件中完成的,但为了简洁起见,可以在同一个.c源代码文件中完成。

现在,请注意,这两个方法实际上都不会创建一个struct node对象。你所做的就是声明一个指向一个指针。对象在任何地方都不存在,因为您从未为它分配空间。要做到这一点,您需要使用malloc

代码语言:javascript
运行
复制
struct node {
    int data;
    struct node * next;
} * head;

head = malloc(sizeof(struct node));

您还可以声明结构的运行时堆栈实例,这仅仅意味着您不需要显式地释放您用malloc()分配的内存。当您从函数返回时,或者当程序在任何函数之外声明时终止时,为结构分配的内存将被取消分配。

票数 0
EN

Stack Overflow用户

发布于 2016-01-17 02:52:24

"struct节点* next“声明了一个名为next的变量,该变量指向"struct节点”。换句话说,是一个单一链接的列表。

您是正确的,因为该语句做了两件事:

  1. 声明一个称为节点的结构(带有一个名为数据的int和指向下一个struct节点的指针)
  2. 声明一个指向struct节点的名为head的变量。

这些工作可以单独进行,具体如下:

代码语言:javascript
运行
复制
struct node
{
  int data;
  struct node *next;
};

struct node *head;
票数 1
EN

Stack Overflow用户

发布于 2016-01-17 02:54:07

next声明为struct node *next意味着它指向一个struct node,可能是列表中的下一个节点。如果它被声明为int *next,那么它将指向一个int,它似乎没有任何必要。

对问题2的答复是肯定的。他们只是简单地将struct node的定义与head的声明结合起来。他们可以像你说的那样被分开。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34834542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档