一. 主要介绍
本篇博客将会着重介绍三个接口函数
- 查找指定位置的链表
- 在指定位置插入数据
- 在指定位置删除数据
二. 查找指定位置的链表
我们这里首先画出一个单链表的逻辑图
我们要查找最好再定义一个cur来表示phead,如果我们直接用phead来查找首先是“吃相”不太好看,其次如果我们后面调用phead,phead值可能改变,所以我们最好再定义一个cur。
代码如下
SLTFind(SLTNode* phead, SLTDateType x) { SLTNode* cur = phead; while (cur) { if (cur->date == x) { return cur; } cur = cur->next; } return NULL; }
操作结果如下:
三. 在指定位置插入数据(前)
我们还是画图来看一下
我们要在pos前插入一个数据需要找到他前一个位置,我们给他前一个位置定义一个prev
我们想想看 假如说Find找不到值 我们就让它返回一个空指针
如果说要我们在空的位置插入数据 这不就是难为人嘛
直接给它断言一下,再考虑一个节点的问题和多个节点的问题
直接上代码
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x) { assert(pphead); assert(pos); if (pos == *pphead) { SLTPushFront(pphead, x); } else { //找到pos之前的一个位置 SLTNode* prev = *pphead; while (prev->next != pos) { prev = prev->next; } SLTNode* newnode = BuySLTNode(x); prev->next = newnode; newnode->next = pos; } }
演示结果
四. 在指定的位置插入数据(后)
还是一样看图分析
这里我们在pos后面插入一个数据可以不需要head指针 我们只需要将pos指向的下一位指向新创建的数据 另外将原来的pos next赋值给新数据
代码如下
void SLTInsertAfter(SLTNode* pos, SLTDateType x) { assert(pos); SLTNode* newnode = BuySLTNode(x); newnode->next = pos->next; pos->next = newnode; }
我们可以发现 pos位置后面插入数据比前面插入数据简单多了
演示结果
五. 删除指定位置的数据
还是看图
pos位置的删除其实在pos位置前插入有点类似,同样需要知道前一个位置,再让前一个位置指向pos后一个位置,释放pos即可,也是两种情况一个节点和多个节点
直接上代码
void SLTErase(SLTNode** pphead, SLTNode* pos) { assert(pos); assert(pphead); if (pos == *pphead) { free(pos); } else { //找到pos之前的一个位置 SLTNode* prev = *pphead; while (prev->next != pos) { prev = prev->next; } prev->next = pos->next; free(pos); } }
演示结果
六. 删除指定位置后的数据
还是看图
很简单直接上代码
void SLTEraseAfter(SLTNode* pos) { assert(pos); assert(pos->next); SLTNode* del = pos->next; pos->next = pos->next->next; free(del); del = NULL; }
再注意一点:这里我们定义一个del来表示pos后的一个位置,预防释放错误,避免野指针问题
以上便是本文所有内容了,如有错误,请各位大佬不吝赐教,感谢留言