线性表存储容量问题

snfeng 2009-12-21 09:02:55
void MergeList(SqList La,SqList Lb,SqList *Lc) /* 算法2.7 */
{ /* 已知顺序线性表La和Lb的元素按值非递减排列。 */
/* 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列 */
ElemType *pa,*pa_last,*pb,*pb_last,*pc;
pa=La.elem;
pb=Lb.elem;
(*Lc).listsize=La.length+Lb.length;/*不用InitList()创建空表Lc */
(*Lc).length=La.length+Lb.length;
pc=(*Lc).elem=(ElemType *)malloc((*Lc).listsize*sizeof(ElemType));
if(!(*Lc).elem) /* 存储分配失败 */
exit(OVERFLOW);
pa_last=La.elem+La.length-1;
pb_last=Lb.elem+Lb.length-1;
while(pa<=pa_last&&pb<=pb_last) /* 表La和表Lb均非空 */
{ /* 归并 */
if(*pa<=*pb)
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=pa_last) /* 表La非空且表Lb空 */
*pc++=*pa++; /* 插入La的剩余元素 */
while(pb<=pb_last) /* 表Lb非空且表La空 */
*pc++=*pb++; /* 插入Lb的剩余元素 */
}
以上是线性表的合并函数 我把分配的内存容量改为:
(*Lc).listsize=0
程序还是能运行 ,甚至是把(*Lc).listsize=La.length+Lb.length;去掉也能运行,请问是怎么回事,谢谢!
...全文
144 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cattycat 2009-12-23
  • 打赏
  • 举报
回复
你修改的只是size信息,并没有实际改变链表的长度,最后释放链表空间需要这个size信息,没有这个的话,就会内存泄露。
selooloo 2009-12-23
  • 打赏
  • 举报
回复
以上是线性表的合并函数 我把分配的内存容量改为:
(*Lc).listsize=0
这只是个表象,根据listsize的意义,从逻辑上讲是这样。
实际上listsize并不是链表的必备要素,分配空间和释放空间并不是它来决定的,是由幕后的malloc,和free来实现的。listsize只是个描述要素.也不会对链表的根本

就像一座楼高H=100米,你把高H改成10米,楼就变成10米了吗
zengcan 2009-12-23
  • 打赏
  • 举报
回复
运行时没有问题的。listsize 用来记录链表的长度,合并的算法中并没有使用listsize来计数。
不过 还是 正确的设置listsize, 放置listsize设置不正确, 根据这个变量名引起歧义,导致程序错误。

如果后来使用listsize计数,listsize比实际值小,这都会内存泄露,比实际值大,则出现访问过界的现象。
东大坡居士 2009-12-21
  • 打赏
  • 举报
回复
只要你的pc通过malloc分配了地址后就能够运行了.
在你合并的过程中,pc++会使pc指向下一个地址,只要此地址合法,程序就能够继续执行.
snfeng 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tauren_chieftan 的回复:]
那样会造成内存污染


[/Quote]
还有没有其他解释 能不能详细点
Tauren_Chieftan 2009-12-21
  • 打赏
  • 举报
回复
那样会造成内存污染

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧