功能介绍
接下来把我们没有写完的5个功能前置删除,后置删除,前置插入,后置插入,节点销毁一起写一下。
链表---在目标前面插入值
思路解析:
1、建立一个新指针指向第一个节点利用while函数找到pos的上一个节点,再创建一个要插入的节点把创建的节点的地址赋给创建的tmp指针,最后把pos位置的地址赋给newnode的next就行。
2、如果是在第一个的位置插入就是头插就只需要调用头插就行了。
代码展示:
void SLTInsert(SLNode ** pphead,SLNode* pos, SLDataType x)
{
assert(*pphead);
assert(pos);
assert(pphead);
if (*pphead==pos)
{
SLIPushFront(pphead, x);
}
else {
SLNode* newnode= CreatNode(x);
SLNode* tmp = *pphead;
while (tmp->next != pos)
{
tmp=tmp->next;
}
tmp->next = newnode;
newnode->next = pos;
}
}
链表---删除目标位置的值
思路解析:
利用指针寻找pos节点的上一个节点再把pos节点存放的地址赋给上一个节点然后free(pos)位置的节点最后把pos置空就行。
代码展示:
void SLTErase(SLNode** pphead, SLNode* pos)
{
assert(*pphead);
assert(pos);
SLNode* prev = *pphead;
while (prev->next!=pos)
{
prev = prev->next;
}
prev->next=pos->next;
free(pos);
pos = NULL;
}
链表---在目标后面插入
思路解析:
创建一个新的节点,把pos位置下一个节点的地址赋给newnode最后把newnode的地址赋给pos就行了。
代码展示:
void SLInsertAfter(SLNode* pos, SLDataType x)
{
assert(pos);
SLNode* newnode = CreatNode(x);
newnode = pos->next;
pos->next = newnode;
}
链表---删除目标后面的值
思路解析:
利用指针指向pos位置的下一个,从pos位置往下第二个节点的地址赋给pos,free(tmp)指针的节点就行,最后为了防止数据泄露把tmp置为空就可以了。
代码展示:
void SLEraseAfter(SLNode* pos, SLDataType x)
{
assert(pos);
assert(pos->next);
SLNode* tmp = pos->next;
pos->next = pos->next->next;
free(tmp);
tmp = NULL ;
}
链表的销毁
思路解析:
利用两个指针,一个指针遍历整个节点另一个指针存放第一个指针的下一个节点。
代码展示:
void SLDestroy(SLNode** pphead)
{
assert(pphead);
SLNode* cur = *pphead;
while (cur)
{
SLNode* tmp = cur->next;
free(cur);
cur = tmp;
}
*pphead = NULL;
}
以上就把不带哨兵位的单向链表的接口就实现完了。