我现在在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;
根据我的理解,列表仍然可以正常引用和遍历,唯一的区别是使用点,符号语法而不是箭头?
答案 0 :(得分:2)
您可以按照提到的方式创建列表。
但是你必须关心列表成员的生命周期。如果你的
节点a,b;
在函数范围内,然后在返回该函数后丢失。
当你使用指针时,你通常会使用堆,实例会一直存在,直到它们被删除。
答案 1 :(得分:0)
你的第一个例子不起作用。您正在声明两个Node
指针。但是,由于您没有将这些内容初始化为任何内容,因此他们不应该指出任何内容是非法的。您必须首先使用malloc
之类的内容为它们指定内存,或者将它们分配给先前声明的局部变量。但是,您还必须记得在完成内存后调用free
。
在第二个示例中,您声明了两个Node
变量,用于存储Node
的实例。如果它们是局部变量,它们将在堆栈上分配,并且只要它们在范围内,它们就会存在。它们保存有效的内存,因此您可以按照演示的方式使用它们。