链表中指定结点的删除
书接上回,当时是将指定结点赋予特定指限制输出。
原文链接如下:
https://editor.csdn.net/md/?articleId=114953286
转换下思路:不把该结点的地址保存在上一个结点的指针域中,相当于把指定结点之外的结点再次串为一个新链表。
遍历链表查找指定结点
int del = 0;
scanf("%d", &del);
struct a* cur = list;
while (cur)
{
if (cur->data == del)
{
}
else
{
cur = cur->next;
}
}
用cur变量去遍历链表。
当要删除的是第一个结点时
while (cur)
{
if (cur->data == del)
{
if (cur == list)
{
list = cur->next;
cur = list;
}
else
{
}
}
else
{
cur = cur->next;
}
}
不为第一个结点时
根据上述分析,再创建一个变量用于为指定结点的前一个结点的指针域赋值
struct a* pre = NULL;
while (cur)
{
if (cur->data == del)
{
if (cur == list)
{
list = cur->next;
cur = list;
}
else
{
pre->next = cur->next;//保存指定结点后面一个结点的地址
cur = pre->next;
}
}
else
{
pre = cur;
cur = cur->next;
}
}
此时就完成了新链表的链接。该链表不含指定结点
动态开辟的内存需要去释放!!
cur = list;
struct a* pd = list;
while (cur)
{
printf("%d ", cur->data);
pd = cur;
cur = cur->next;
free(pd);
}
此处用free函数来释放malloc开辟的内存空间。
but,此处还有一个问题,那些没被链起来的指定结点去哪了呢
它们还存在于堆上,所以说,代码还是有一定的问题。
改进
struct a* fr = NULL;
while (cur)
{
if (cur->data == del)
{
if (cur == list)
{
fr = list;
list = cur->next;
cur = list;
free(fr);
}
else
{
fr = cur;
pre->next = cur->next;
cur = pre->next;
free(fr);
}
}
else
{
fr = cur;
pre = cur;
cur = cur->next;
}
}
再创建变量fr用于指定结点的释放。