[C语言] 链表的删除疑惑

[复制链接]
1413|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)。
我感觉这代码有点问题。看看我修正的对不对?

  1. LinkList *p,*q,*s;
  2. p=head;
  3. q=head->next;
  4. while(q)
  5. {
  6. if(q->data==m){
  7. p->next=q->next;
  8. s=q;
  9. free(s);
  10. break;
  11. }
  12. q=q->next;
  13. }


 楼主| 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

粉丝
快速回复 在线客服 返回列表 返回顶部