创建链接列表而不将节点声明为指针

时间:2016-10-30 16:30:45

标签: c linked-list

我现在在Google和一些教科书上搜索了一段时间,我似乎无法理解为什么在构建链表时,节点需要指针

EG。如果我有一个节点定义为:

typedef struct Node{
    int value;
    struct Node *next;
} Node;

为什么要创建链表,我会说:

Node *a = malloc(sizeof(Node));
Node *b = malloc(sizeof(Node));
a->value = 1;
b->value = 2;

a->next = b;
b->next = NULL;

而不是:

Node a, b;
a.value = 1;
b.value = 2;

a.next = &b;
b.next = NULL;

根据我的理解,列表仍然可以正常引用和遍历,唯一的区别是使用点,符号语法而不是箭头?

2 个答案:

答案 0 :(得分:2)

您可以按照提到的方式创建列表。

但是你必须关心列表成员的生命周期。如果你的

  

节点a,b;

在函数范围内,然后在返回该函数后丢失。

当你使用指针时,你通常会使用堆,实例会一直存在,直到它们被删除。

答案 1 :(得分:0)

你的第一个例子不起作用。您正在声明两个Node指针。但是,由于您没有将这些内容初始化为任何内容,因此他们不应该指出任何内容是非法的。您必须首先使用malloc之类的内容为它们指定内存,或者将它们分配给先前声明的局部变量。但是,您还必须记得在完成内存后调用free

在第二个示例中,您声明了两个Node变量,用于存储Node的实例。如果它们是局部变量,它们将在堆栈上分配,并且只要它们在范围内,它们就会存在。它们保存有效的内存,因此您可以按照演示的方式使用它们。