第 9 课:linked list 综合与 exam-style debugging
非 UNSW 官方材料。本文基于官方 linked list 后续 lecture、Exam information lecture、Debugging Guide 和公开复习入口做中文转述;不复制真实考试题正文。[S019][S020][S004][S001]
今天只做:写一个 linked list 长度函数,并测空链表。 下一步:主控台 · 上一课 · 下一课:期末复习焚诀 别乱跳:查错先测空、一个节点、三个节点。
本课目标
第 9 课把 linked list 题从“会写模板”推进到“能查错”;先保 traversal,再保 insert/delete,再看输出差异。[S019][S020][S004]
| 症状 | 先查 |
|---|---|
| 崩溃 | curr != NULL 有没有守住 |
| 输出少一个 | 循环有没有提前停 |
| 删除后乱了 | prev->next 有没有接对 |
| 内存问题 | malloc / free 是否成对 |
exam-style 查错顺序
官方 Debugging Guide 把错误分成 compile、autotest、run time、logic;链表题也按这个顺序查,不要一上来重写整题。[S004]
- 先让它编译。
- 再跑一个最小手动测试。
- 再跑公开允许的 autotest。
- 最后看边界:空链表、一个节点、删头、删尾、找不到。
综合模板:数节点
这题型常用来确认 traversal 是否安全;下面是原创模板,用来练 curr != NULL 的手感。[S019]
int list_length(struct node *head) {
int length = 0;
struct node *curr = head;
while (curr != NULL) {
length++;
curr = curr->next;
}
return length;
}
5 分钟练习
- 写
list_length。 - 给空链表、一个节点、三个节点各写一个预期。
- 写一条错因:我这次错在
curr、prev、还是head?
本课过关标准
- 我能说出链表题先测哪三个边界。
- 我能按 Debugging Guide 分类错误。
- 我知道 autotest 失败时要看输出差异。
- 我不会因为一题失败就整题重写。
引用
- [S001] COMP1511 course homepage: https://cgi.cse.unsw.edu.au/~cs1511/current/
- [S004] COMP1511 Debugging Guide: https://cgi.cse.unsw.edu.au/~cs1511/26T1/resources/debugging_guide.html
- [S019] Lecture 13/14 PDF: https://cgi.cse.unsw.edu.au/~cs1511/26T1/slides/week_9/COMP1511_26T1_Lecture1314.pdf
- [S020] Lecture 15 PDF: https://cgi.cse.unsw.edu.au/~cs1511/26T1/slides/week_9/COMP1511_26T1_Lecture15.pdf