C语言手写链表犯错指南

最近在学习链表,惊闻不能把链表手写出来就不能算是掌握了,我只好花功夫在理解+手写上。过程中犯了许多错误,简单记录一下,顺便加深一下印象,避免以后再犯同样的错误。

问题一:到底是p->next = p,还是p = p->next ?
对于我来说,这个问题极易搞混。我第一面默写时写成了前者,结果就翻车了——输出陷入了无限循环。
没办法,只好运用单步调试大法。找了好久才找到原因,也就是将题目中的两种描述搞混了。
C语言手写链表犯错指南
这就是问题所在了。按上图的写法,相当于是将当前节点的指针域赋值为当前节点的地址,示意图如下:
C语言手写链表犯错指南
查看节点地址,发现所有节点地址都和头节点一样,链表陷入了无穷循环。

C语言手写链表犯错指南
将这个问题改正后,程序能正常运行。

问题二:pr和head的区别?
先看下面这段代码,这是错误情况:
C语言手写链表犯错指南
这是正确情况:
C语言手写链表犯错指南
错误情况下发生了什么呢?结果是head之后根本没有插入新的节点,head还是一个空节点。我当时的想法是,既然pr和head地址相同,那么赋值pr与赋值head没有什么区别呀。可是,那针对的是赋值,而我们这里是“赋地址”。这可与赋值不同,你将pr地址赋值后,pr与head就有了不同的地址,所以你是相当于将节点插入到pr后面了,而不是head后面。
总结:赋地址一定不能像赋值一样等同,必须作用于head,而不是pr。