[C语言]

链表的删除疑惑

[复制链接]
1055|8
手机看帖
扫描二维码
随时随地手机跟帖
yanghelovehuang|  楼主 | 2018-6-29 14:02 | 显示全部楼层 |阅读模式
各位大佬,我查找c语言链表节点删除的时候,有段代码不太明白,希望大神指点 我是新手一枚:
LinkList *p,*q,*s;
p=head;
q=head->next;
while(q){
if(q->data==m){
p->next=q->next;
s=q;
q=q->next;

free(s);
}
其他的抖动就是红色标识的那两行有点不明白,p->next = q->next已经把要删除节点前面的节点的next指向了要删除节点后面的节点,剩下的就是要删除节点的next指向删除。
可是s=q然后又free(s)那这个赋值有啥用呢?q=q->next把要删除节点的下个节点的地址给要删除的节点有什么意思呢?求大神分别对这两句话解释下,跪求!!!!!!!

相关帖子

gujiamao12345| | 2018-6-29 14:10 | 显示全部楼层
是不是有好几个节点要删

使用特权

评论回复
yanghelovehuang|  楼主 | 2018-6-29 14:12 | 显示全部楼层
gujiamao12345 发表于 2018-6-29 14:10
是不是有好几个节点要删

大神 就删除一个节点。

使用特权

评论回复
fengfeng的恒| | 2018-6-29 14:28 | 显示全部楼层
你是不是写少了一半括号啊,看起来怪怪的。

链表需要上一个节点(暂定为节点1)的next可以找到下一个节点(暂定为节点2),节点2的next也能找到下一个节点(暂定为节点3),如果要删除节点2,首先要找到节点2,那个if就是查找,然后需要把节点1的next指向节点3(上面代码也实现了),同时把节点2占用的空间释放掉,free(s)。
我感觉这代码有点问题。看看我修正的对不对?

LinkList *p,*q,*s;
p=head;
q=head->next;
while(q)
{
if(q->data==m){
p->next=q->next;
s=q;
free(s);
break;
}
q=q->next;
}


使用特权

评论回复
yanghelovehuang|  楼主 | 2018-6-29 15:16 | 显示全部楼层
fengfeng的恒 发表于 2018-6-29 14:28
你是不是写少了一半括号啊,看起来怪怪的。

链表需要上一个节点(暂定为节点1)的next可以找到下一个节点 ...

我和你的观点相同,可是s=q是什么作用啊 直接free(q)为啥不行啊?

使用特权

评论回复
sjnh| | 2018-6-29 16:27 | 显示全部楼层
本帖最后由 sjnh 于 2018-6-29 16:30 编辑
fengfeng的恒 发表于 2018-6-29 14:28
你是不是写少了一半括号啊,看起来怪怪的。

链表需要上一个节点(暂定为节点1)的next可以找到下一个节点 ...

不能这样,free(s)之后,q指向的内存已经释放,q->next还有没有效不确定如果删除1个节点到可以

使用特权

评论回复
sjnh| | 2018-6-29 16:34 | 显示全部楼层
yanghelovehuang 发表于 2018-6-29 15:16
我和你的观点相同,可是s=q是什么作用啊 直接free(q)为啥不行啊?

不行,因为q还要用,q=q->next后,q已经不再指向要删除的节点,执行free(q)会误删除;
如果先free(q),则q=q->next会出问题;

使用特权

评论回复
fengfeng的恒| | 2018-6-29 16:45 | 显示全部楼层
sjnh 发表于 2018-6-29 16:27
不能这样,free(s)之后,q指向的内存已经释放,q->next还有没有效不确定如果删除1个节点到可以
...

我的代码是加了break的,即free(s)之后就退出循环了,不再需要q了。所以我觉得可以的。

使用特权

评论回复
fengfeng的恒| | 2018-6-29 16:46 | 显示全部楼层
yanghelovehuang 发表于 2018-6-29 15:16
我和你的观点相同,可是s=q是什么作用啊 直接free(q)为啥不行啊?

如果按我刚那样的写法是可以直接free(q)的,因为我直接退出了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

324

帖子

1

粉丝