这些声明有什么不同?

时间:2016-01-17 02:44:29

标签: c data-structures

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

struct node
{
  int data;
  struct node *next;
}*head;

问题1:在上面的结构中,在结构中声明 struct node * next 的意思是什么?它与仅仅在结构中将指针变量声明为 int * next

有何不同

问题2:我们可以看到,在结构定义的最后,指针 * head 被声明为node类型,如果我是正确的,则用于访问结构成员。这就像声明它一样:

                            struct node *head;

对此的任何帮助都会很棒。提前谢谢大家。

3 个答案:

答案 0 :(得分:1)

" struct node * next"声明一个名为next的变量,它指向一个" struct node"。换句话说,一个单链表。

你说得对,声明做了两件事:

  1. 声明一个名为node的结构(带有一个名为data的数据和一个 指向下一个struct node的指针)
  2. 声明一个名为head的变量,指向struct node。
  3. 这些可以单独完成如下:

    struct node
    {
      int data;
      struct node *next;
    };
    
    struct node *head;
    

答案 1 :(得分:0)

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

问题2的答案是肯定的。他们只是简单地将struct node的定义与head的声明结合起来。如你所示,它们可以分开。

答案 2 :(得分:0)

这通常是如何在C中声明链接列表的。召回 - 链接列表是一系列节点,其中包含数据以及链接(在本例中为指针)系列中的下一个节点。

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

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

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

struct node {
    int data;
    struct node * next;
} * head;

head = malloc(sizeof(struct node));

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