c中链表中的头节点

时间:2014-01-27 06:53:09

标签: c linked-list head

在研究c中的链表时,我遇到了头节点的两种不同实现。 如果以下是使用的结构:

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

然后第一个实现是头节点只是一个虚拟节点,其中没有实际数据,但只是到另一个节点(第一个有数据的实际节点)的链接,如下所示:

struct node *head;
head->next = NULL;  //head->next would then be linked to the first node.

第二个实现是头节点是第一个带有数据的实际节点,它使用malloc命令存储,以便为其分配空间。

我的问题是,我们如何在第一个实现中使用“head-> next”,我们还没有使用malloc为head配置空间?因为据我所知(如果我错了,请纠正我),只有在为该节点分配空间后才能使用该节点的两个字段。

3 个答案:

答案 0 :(得分:4)

仅在动态分配内存时才需要Malloc。如果在方法内部编写类似struct node head的内容,则头节点将在堆栈中分配,并将在那里生存(并死亡)。因此,您可以将数据写入此节点,但一旦方法完成,它将会死亡。

或者,您可以全局定义头部,在这种情况下,它将被静态分配,并将永远存在直到程序退出。只有当你想要创建一个在函数退出后仍然存在的内存时,才需要Malloc。只有在指针上调用free时才会清除它。

答案 1 :(得分:1)

您错过了C dynamic memory allocation

struct node *head = malloc(sizeof (struct node));
if (!head) { perror("malloc node"); exit(EXIT_FAILURE); };
head->next = NULL;
// initialize other fields of head

不要忘记初始化head的所有字段!阅读malloc(3)

你可以有一个包含第一个指针的全局变量full_list,例如

if (!full_list)
   full_list = head;

另请参阅this ...阅读linked list wikipage。

答案 2 :(得分:1)

你是对的,如果你没有初始化头部,那么head将不会指向下一个节点,所以你必须初始化它,这就是为什么一致使用第二个实现的原因。如果您使用第一种方法,仍然需要初始化它,如果您正在初始化它,为什么现在也使用它的数据变量。