𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk
⸝⋆ ━━━┓
- 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━ ➴ ⷯ本人座右铭 : 欲达高峰,必忍其痛;欲戴王冠,必承其重。
👑💎💎👑💎💎👑
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑 希望在看完我的此篇博客后可以对你有帮助哟👑👑💎💎💎👑👑 此外,希望各位大佬们在看完后,可以互赞互关一下,看到必回
👑👑👑💎👑👑👑
相信大家各位学习双向链表的时候对链表的销毁,都或多或少有些小疑惑,我到底是传一级指针还是传二级指针
木关系,这些都是小意思,今天我将为大家share 一下关于到底如何进行正确传指针
对于链表是销毁其实就是对链表进行一个结点一个结点的删除
注意,最后不要忘了还需要对哨兵位(phead)进行free
方法一:传一级指针
void Destroy(ListNode* phead)//链表销毁;想一下,传一级指针还是二级? 在这里我们传入一级指针,为了保持接口一致性
{
//销毁我们是一个一个进行删除,自然就需要遍历
assert(phead);
ListNode* del = phead->next;
while (del != phead)
{
ListNode* next = del->next;
free(del);
/*del = NULL;*/ // ?
del = next;
}
//来到这说明,此时只有一个哨兵位
free(phead);
phead = NULL;
}
调试结果如下:
显而易见,当我们把哨兵位这个结点进行free的之后,他确实是为空了但是此时我们的plist这个结点并没有置空,这是为什么呢???
函数的形参是对实参的一份临时拷贝,对形参的临时修改并不会影响实参的变化
因此有时我们就需要传地址来进行
我们不妨试一下,我们手动把plist这给结点进行free
结果如下:
报错显示:无效的堆上的指针。换言之就是我们已经把plist这个结点进行free了,无需在进行一次free了,所以在传一级指针时,我们只需手动把plist 这个结点进行置为空即可
方法2:传二级指针
代码如下;
void LTDestroy(ListNode** pphead)
{
assert(pphead && *pphead);//确保我们头节点地址以及哨兵位职工地址有效
ListNode* cur = (*pphead)->next;
while ( cur!=*pphead )
{
ListNode* next = cur->next;
free(cur);
cur = next;
}
free(*pphead);//对哨兵位进行释放
*pphead = NULL;
}
调试结果如下:
显然此时plist这个指针是置空了
但是当我们把自己所写的代码交给用户使用的时候,或许存在一些小问题
我们用户是很懵的,因为他不知道自己要什么时候传二级指针,什么时候传一级指针;其次为了保持接口一致性,我们还是传一级指针就Ok~~~
结语:
以上 就是我今日要share的内容,传一级指针还是二级指针就看具体需求,怎么合适怎么来,希望各位能够有所收获,接下来你懂滴!