对于上一篇的实现单链表的博客,我总感觉还有那么一点点的小问题还没有想明白。
这个问题仍然是为什么在实现尾插尾删的地方要传二级指针而不是一级指针?
我听到过最多的原因就是为了处理当链表为空的时候,对空链表进行插入数据。
这种话听了也就听了,是真是假还是得动手实验。
首先来写一段代码来模拟传一级指针看看能不能实现尾插。
由于要传一级指针,因此在主函数中的SL sl只能是定义成一个结构体,并不能定义成一个结构体指针,然后在往PushBack里传一个地址,然后在实现PushBack的那边使用一级指针来接收。
此时发现,代码已经是崩溃了的
这是为什么呢?
进入调试看看
可以看到,此时的sl由于没有进行初始化,里面可以说是一片混乱,是一个野指针,空间是混乱的。
因此在执行到这行代码的时候,由于传过来的地址并不是NULL,这句就不成立,进不去if语句,所以就没法处理链表为空的情况。没办法给空链表进行插入数据。
而要想初始化sl,那就直接给sl赋一个NULL指针过去,就像这样
可以看到,这边赋值过去是报错的。这是因为sl此时仍然是一个结构体,而NULL是一个指针,这样是不可以直接赋值的。所以只能是把空指针赋值给结构体指针
这样就可以看到,是不会出现报错了。此时此刻,&sl代表的就不是结构体的地址了,而是代表指向结构体指针的地址,因此在PushBack那里,如果想改变*sl,就要使用**二级指针来接收*sl。
当这里变成二级指针的时候,相对应的,相关代码也应该跟着做些微调
首先来解释一下。
这个时候传过来的就是一个指针了,if里面判断的是当指针指向空的时候,就进入if语句。如果if指向空,那么就将*phead指针指向新开的节点node,在下面的输出中,由于->的优先级比*大,因此要先把前面的括起来,进行解引用后取结构体里面的值