Sha*_*ars 11 c linked-list head
这不是我的代码.我把这个代码从这个网站上删除了:
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 ;
}
Run Code Online (Sandbox Code Playgroud)
head = NULL→为什么head被设置为NULL?我知道你应该(我是出于习惯),但我不知道为什么.
curr-> next = head→我也从未真正理解过这一点.也许我对"head"的定义错了,但是在常规链表中,它是列表中的起始节点还是最后一个节点?我一直认为它是起始节点,但在这一行中它看起来像是最后一个节点.
head = curr→为什么我们将它设置为curr?
curr = head→然后在循环完成后设置curr = head.
虽然(curr)→只是为了确保,这是遍历列表,它相当于while(curr!= NULL)对吗?
mel*_*kim 20
#1:
head = NULL
初始化指针.它通常推荐初始化指针或者(1)在声明或(2)的声明之后立即为NULL.如果程序员错误地取消引用未初始化的指针,则返回垃圾值.如果静态分析器和编译器没有显示未初始化指针的警告或错误消息,通常很难调试.
有关更多信息,请参阅Steve McConnell的代码完成:软件构建实用手册或防御性编程的维基百科页面.
#2:
curr->next = head
构建链表.该curr节点与序列中先前创建的节点"链接".
#3:
head = curr
更新头指针.该head指针被更新为指向最近malloc编节点.
下面的插图可视化步骤#2和#3:

#4:
curr = head
重新初始化指针.此步骤类似于步骤#2 : curr->next = head. 通过将currnode 设置为head,curr为while循环中的链表遍历"准备好" .从类比来说,它就像在循环开始时将迭代变量初始化为0(即i = 0).要显示此步骤,请参阅下面的插图,显示执行此语句之前/之后:


#5:
while(curr)
遍历清单.
鉴于它curr指向第一个节点(来自步骤#4),此while循环遍历列表直到curr->next返回NULL.在一个不太抽象的形式中,我们可以将此语句重写为while(curr != NULL).
| 归档时间: |
|
| 查看次数: |
15727 次 |
| 最近记录: |