二级指针与一级指针重温

今天在和同学讨论为了接口的一致性,怎么处理野指针的问题,我就想在以前写过的链表中练习一下。
选择了在双向循环链表中Erase节点时,传入二级指针并置空他。没想到遇到了问题,曾经以为对二级指针,一级指针的问题已经了解了,因为在单链表中,头插,尾插中已经训练过,在链表为空时有3种处理办法。
第一种,是需要传入二级指针也就是一级指针的地址,然后再继续对指针进行操作,这样才能改变他的值。
第二种,借助函数的返回值,让他外面接收到变化的节点。
第三种,创建一个哨兵位头结点,这个节点没有具体的值,如果要进行操作就修改哨兵节点后面的节点。

在我对双向链表进行删除节点,我传入了二级指针
先来个例子:
在这里插入图片描述

函数调用:
在这里插入图片描述
函数内部:
在这里插入图片描述
要删除*pos(5对应的节点),我先保存了他的前面与后面,也就是 (*pos)->prev(4对应的节点)和(*pos)->next(head节点),接着就是让posNext->prev(0)指向4,posPrev->next(4)指向0,一切似乎都很美好。然后free掉(*pos),但是我忘记了这里传入的是地址。

这里传入的是&pHead->prev

在这里插入图片描述

posNext->prev
=pHead->prev
=*pos
同一个值互相影响

在这里插入图片描述

在这里插入图片描述
然后*pos变成了4,在free,把4对应的节点free掉了。
在这里插入图片描述

如果以后看到这还没想明白,就要骂人了,再看一级指针的情况
在这里插入图片描述

posPrev->prev与pos不是同一个值,互不影响

在这里插入图片描述

可以看到pos始终是5的节点

在这里插入图片描述
最终修改,在*pos没有变成4之前free掉他并置空
在这里插入图片描述
最后来个灵魂一击

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45928272/article/details/113359328