我已经在谷歌和一些教科书上搜索了一段时间,我似乎无法理解为什么在构建链表时,节点需要是指针。
。如果我有一个节点定义为:
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;
根据我的理解,列表仍然可以像正常一样被引用和遍历,唯一的区别是使用点,&语法而不是箭头?
您可以用前面提到的方法创建列表。
但是你必须关心列表成员的生命周期。如果
节点a, b;
在函数的作用域中,则在该函数返回后丢失。
当你使用指针时,你通常会使用堆和实例,直到它们被删除。
您的第一个示例不起作用。你声明了两个Node
指针。然而,由于您没有将它们初始化为任何东西,因此遵从它们是非法的,因为它们不指向任何东西。您必须首先使用malloc
之类的东西来声明它们要指向的内存,或者将它们赋值给先前声明的局部变量。然而,你也必须记住调用free
当你用内存完成。
在第二个示例中,声明两个Node
变量,用于存储Node
的实例。如果它们是局部变量,它们将在堆栈上分配,并且只要它们在作用域中,它们就会存在。它们具有有效的内存,因此您可以按照您所演示的方式使用它们。