这不是我的代码。我从这个网站上获取了这段代码:
http://www.macs.hw.ac.uk/~rjp/Coursewww/Cwww/linklist.html
我正在使用它作为构建链表的参考资料。我有一点困惑,不太清楚发生了什么。能否请有经验的人解释一下呢?我将用1-5标记我感到困惑的地方。
#include<stdlib.h>
#include<stdio.h>
struct list_el {
int val;
struct list_el * next;
};
typedef struct list_el item;
void main() {
item * curr, * head;
int i;
head = NULL; //1
for(i=1;i<=10;i++) {
curr = (item *)malloc(sizeof(item));
curr->val = i;
curr->next = head; //2
head = curr; //3
}
curr = head; // 4
while(curr) { //5
printf("%d\n", curr->val);
curr = curr->next ;
}
head = NULL → 为什么要将head设置为NULL?我知道应该这样做(我习惯性地这样做),但我不是很清楚为什么。
curr->next = head → 我也从来没有真正理解过这个。也许我的“头”节点定义有误,但在常规链表中,它是起始节点还是列表中的最后一个节点?我一直认为它是起始节点,但在这行代码中,它看起来像是最后一个节点。
head = curr → 为什么我们要将它设置为curr?
curr = head → 然后在循环结束后将curr = head。
while(curr) → 只是为了确保,这是遍历列表,等价于 while(curr != NULL) 对吗?