今天再写链表的过程中,引发了思考,为什么链表要用指针?
比如,有这样一个结构体:
struct Node {
int data;
struct Node* next;
}
平常我们创建空链表是这样的:
struct Node* head;
那为什么不是:
struct Node head;
如果你创建一个结构体变量:struct Node head
。那么,就不能当成中间结点,因为 Node
的 next
必须是指针。只能作为头结点使用,而且使用起来非常麻烦,比如你要调用下一个结点:head.next
而不是 head->next
。这样就要重写一部分代码,从而使得维护困难。
另一个是,创建这样的结构体:
struct Node {
int data;
struct Node next; ---> is not pointer
}
这样创建相同的结果,首先是编译器会编译错误。
另外,这样来看:比如你要为上述结构体开辟空间:
malloc(sizeof(Node));
这样就会开辟 sizeof(int) + sizeof(Node) 的空间,这样进一步开辟 sizeof(int) + (sizeof(int) + sizeof(Node)) 的空间,这样递归下去。所以定义这样的结构是没有意义的,故编译器就禁止了这一行为。