初始化链表
实现接口:
尾插
头插
头删
尾删
任意插入,在pos的前面插入x
任意删除,删除pos位置的值
释放空间
上篇文章我们已经详细了解了初始化链表和尾插,那么本篇文章将和大家一起继续深入了解链表相关的知识。
头插
尾插顾名思义就是在尾部插入一个数据,而插入数据无疑要申请一块空间,所以我们可以单独写一个扩容函数。
//扩容
SListNote* SListBuyNote(SLTDateType x)
{
//申请一块空间
SListNote* newnote = (SListNote*)malloc(sizeof(SListNote));
newnote->data = x;
newnote->next = NULL;
return newnote;
}
有了扩容函数后,我们可以修改尾插函数了
void SListPushBack(SListNote** pphead, SLTDateType x)
{
//形参改变无法影响实参
//申请一块空间,node - 节点
SListNote* newnote = SListBuyNote(x);
//pphead是plist的地址
//*pphead是plist指针
//phead可能为空
if (*pphead == NULL)
{
*pphead = newnote;
}
else
{
//tail是当前位置
SListNote* tail = *pphead;
//找到尾节点的指针
//判下一个位置为空,可以避免自身变为空
while (tail->next != NULL)
{
//下一个位置
//tail是当前位置的地址,tail->next存的是下一个位置的地址
tail = tail->next;
}
//尾节点,链接新节点
tail->next = newnote;
}
}
其实这里如果有cpp基础的话我们也可以用“*&”,用一级指针也能解决。
接下来我们正式开始实现头插
首先我们先了解原理:
了解完原理后我们写代码就更加的得心应手
//头插
void SListPushFront(SListNote** pphead, SLTDateType x)
{
//申请一块空间
SListNote* newnote = SListBuyNote(x);
//把原来的地址*pphead赋给newnode->next
newnote->next = *pphead;
//*pphead存放原来位置的地址,只需把新地址newnote的地址赋给*pphead即可
*pphead = newnote;
}
实现完成头插之后建议大家可以测试一下,详见顺序表(三),这样可以避免我们写了几百行代码后找不到错误的尴尬局面。所以走一步测一步是很有必要的!
头删
老规矩我们首先要了解其中的原理,如此一来才能便于我们更好的写代码。
这里看似很简单,但是新手容易犯直接free的毛病。再次强调不能直接free!
弄清楚原理后,写代码就简单了
//头删
void SListPopFront(SListNote** pphead)
{
//先保存*pphead的下一个的地址,防止找不到
SListNote* next = (*pphead)->next;
//不能一上来就free,就找不到下一个了
free(*pphead);
//再把原来第二个的地址赋给*pphead
*pphead = next;
}
感兴趣大家可以点个关注,更多精彩内容稍后呈现。
都看到这里了不妨点个赞吧😘