我正在学习数据结构的使用,并遇到了一些疑问:
struct node
{
int data;
struct node *next;
}*head;
问题1:在上面的结构中,在结构中声明 struct node * next 的意思是什么?它与仅仅在结构中将指针变量声明为 int * next
有何不同问题2:我们可以看到,在结构定义的最后,指针 * head 被声明为node类型,如果我是正确的,则用于访问结构成员。这就像声明它一样:
struct node *head;
对此的任何帮助都会很棒。提前谢谢大家。
答案 0 :(得分:1)
" struct node * next"声明一个名为next的变量,它指向一个" struct node"。换句话说,一个单链表。
你说得对,声明做了两件事:
这些可以单独完成如下:
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()
分配的内存。从函数返回时,或者当程序在任何函数之外声明时终止时,为结构分配的内存将被释放。