标题:关于循环链表的合并
只看楼主
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
结帖率:100%
已结贴  问题点数:20 回复次数:17 
关于循环链表的合并
不知道如何贴图片,口述好了,有两个循环链表AB,现在要将循环链表B的头接在循环链表A的尾,rearA是A表的尾指针,rearB是B表的尾指针

代码:
程序代码:
p = rearA->next ;                /* 保存A表的头结点 */
rearA->next = rearB->next->next ;      /* 将本是指向B表的第一个结点(不是头结点)赋值给rearA->next */ 
rearB->next = p ;                      /* 将远A表的头结点赋值给rearB->next */
free(p) ;                              /* 释放p */


///////////////////////////////////////
我不理解最后为什么要free(p),因为第一行代码这样赋值过:p = rearA->next,那这样不是相当于把A链表的头结构释放了,不是应该要释放B链表的头结构么。
搜索更多相关主题的帖子: 图片 如何 
2014-07-16 17:23
funyh250
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:26
帖 子:290
专家分:1573
注 册:2013-12-25
得分:5 
拿来做中转而已,用完就释放
不过看你合并的代码好像漏掉了b的头

学习是大事   吃喝拉撒睡是小事   其他的那都不是事
2014-07-16 19:16
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
得分:0 
回复 2 楼 funyh250
free(p)不是释放p所指向的空间么,p所指的就是A的头结构,这样不是把A的头结构给释放了么,指针的话不用了直接p = NULL ;不就行了么
2014-07-16 19:29
funyh250
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:26
帖 子:290
专家分:1573
注 册:2013-12-25
得分:0 
根据你贴出来的代码free的意思
  申请一个空间 复制 rearA->next 到这个空间  (或者说这个空间来存储rearA->next的副本)
  用完就释放这个空间

  还不懂的话  想想a=1 ,b=2怎么交换a b的值

[ 本帖最后由 funyh250 于 2014-7-16 19:58 编辑 ]

学习是大事   吃喝拉撒睡是小事   其他的那都不是事
2014-07-16 19:48
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
得分:0 
回复 4 楼 funyh250
还要分配内存存一整个结点?
只是将那个rearA->next的这个指针赋值给p啊,没有申请一段内存去存这个结点啊,然后当合并完毕后,p还是指向rearA->next这里,也就是A的头结点,这样直接free(p)不就相当于把头结点的空间给释放了么,指针如果用完了直接p = NULL ;不就可以了么?    还是没搞懂啊~
2014-07-16 20:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:15 
你是相信别人的代码还是相信自己的大脑?如果代码是你自己写出来,应该问自己,如果自己没觉得应该要free(),就不会写出来,这有什么问题呢。

[ 本帖最后由 TonyDeng 于 2014-7-16 20:12 编辑 ]

授人以渔,不授人以鱼。
2014-07-16 20:08
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
得分:0 
回复 6 楼 TonyDeng
这个是《大话数据结构》上的内容,恩,我是觉得这个代码有问题,没敢轻易相信,但又不敢轻易断定那就是错的,我只是怕万一有个什么特殊用法我没理解,所以来找找答案~   那这样是代码错了吗?
2014-07-16 20:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
错没错靠自己的理性分析,以及实践检验。把它的逻辑搞清楚了,是否需要这样做,很容易看出来的呀。

授人以渔,不授人以鱼。
2014-07-16 20:14
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
得分:0 
回复 8 楼 TonyDeng
恩,那应该这就是个错误的吧,我分析下来的话,因为第一条代码赋值是 p = rearA->next ;   在中途没有改变过p的指向,最后释放p所指内存的话也就是释放的是rearA->next,也就是头结构,所以我推断应该释放错了
2014-07-16 20:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
寻找答案的思路很简单:追踪这个指针所指向的数据对象,看它是不是用malloc()分配出来,这个真身数据到底是什么,找到后,自然知道是否应该或可以free()。

授人以渔,不授人以鱼。
2014-07-16 20:19



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-434103-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.505130 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved