之前已经介绍过单链表及其一些简单的功能
这次来简单介绍单链表一些的其他接口
1.在指定位置之前插入数据
具体原码,三个参数,phead是链表的指针,pos是节点的地址,x是需要插入的数据。
pos不能为空指针,因为pos为空指针我们就无法插入了,其次是phead和*phead也不能是空指针,*phead是空链表就无法从其中一个链表之前插入数据了。然后通过BuyNode得到要插入的数据的地址,用tmp来接收,然后考虑如果pos 是头结点的话,直接让pos的next等于链表地址,然后再让链表地址等于pos的地址,这样就完成插入了。
如果pos不是头节点的话就进入else,首先定义一个pcur指针,通过循环,当pcur的next不是pos就一直向后走,直到pcur的next是pos时,此时就退出循环,先将pos插入tmp上,再将tmp插入到pcur-next就可以了,然后达到了指定数据前插入数据的效果。
2.在指定数据之后插入数据
在指定数据之后插入数据有两种思路,第一种是先将plist->next等于newnode再将后面数据拼到newnode后面,第二种是直接将pos后面数据插入到newnode然后再将newnode插入到pos->next上。想一下,这两种哪种不可行,仔细一想,第一种是不可行的,为什么呢,因为当把pos->的数据存储newnode时,此时后面的数据就找不到了啊。但是也不是不可解决的, 我们可以用一个临时指针来存储后面那个地址,这样就可以找到后面的地址。
源代码
这个代码就很简单就不简述了。
3.删除节点
要删除节点,首先能肯定的是*phead和phead不能为空指针,其次pos也不能为空指针,因为pos如果为空的话就没必要删除了,源代码
void SLTErase(SLTNode** phead, SLTNode* pos)
{
assert(phead, *phead);
assert(pos);
if (*phead == pos)
{
SLTPopFront(phead);
}
else
{
SLTNode* ptail = *phead;
while (ptail->next != pos)
{
ptail = ptail->next;
}
ptail->next = pos->next;
free(pos);
pos = NULL;
}
}
4.删除pos之后的节点
删除pos之后的数据不用修改链表,只用把pos的next的next的值存放到pos的next上就行,用临时指针来接收pos—>next,然后销毁这个数据的空间即可。
void SLTEraseAfter(SLTNode* pos)
{
assert(pos);
SLTNode* tmp = pos->next;
pos->next = tmp->next;
free(tmp);
tmp = NULL;
}
5.销毁链表
销毁链表需要将链表的每一个数据都要进行销毁,首先要保证phead和*phead都不是空指针。
然后通过一个循环来遍历链表,先定义while循环,然后循环终止的条件是链表走到NULL了,此时就可以退出循环了,先定义一个pcur来接收*phead,条件就为pcur,先进入循环,定义一个中间指针,next,然后释放pcur再让pcur指向中间指针的地址,通过这个循环,就可以释放所有的链表数据,最后将链表置为空,这样就实现了链表的释放。
void SLTDestory(SLTNode** phead)
{
assert(phead && *phead);
SLTNode* pcur = *phead;
while (pcur)
{
SLTNode* next = pcur - next;
free(pcur);
pcur = next;
}
*phead = NULL;
}