鱼C论坛

 找回密码
 立即注册
查看: 3507|回复: 11

C中关于链表释放内存的问题。

[复制链接]
发表于 2012-5-14 23:49:07 | 显示全部楼层 |阅读模式
10鱼币
我现在在写一个人事管理系统,系统是用结构体链表存储员工信息的,但突然有一个员工离职了,我要把他从链表中移去,移去的操作我能完成,但就是不知道如何释放掉那块被移去的内存,用free( )实现不 了,因为free( )要和malloc( )配合使用的,那我应该如何办?还有就是我想问一下原来存储那个离职员工的内存我是用malloc( )分配的,现在我把指向它的指针都去掉,系统会自动释放掉那块内存吗????????????  

最佳答案

查看完整内容

同意7楼所说 比如有单链表:...node1 node2 node3... 若你要删除node2: node1->next=node2->next free(node2) 关键点是:由于是单链表,所以查找的时候还需要一个临时指针存放node1:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-14 23:49:08 | 显示全部楼层
同意7楼所说
比如有单链表:...node1 node2 node3...
若你要删除node2:
node1->next=node2->next
free(node2)

关键点是:由于是单链表,所以查找的时候还需要一个临时指针存放node1:
  1. ChainList *ListDelete(ChainList *Head,char *key)
  2. {
  3.         ChainList *h,*node;
  4.         h=node=Head;
  5.         while(h)
  6.         {
  7.                 if (strcmp(h->data.key,key)==0)
  8.                         break;
  9.                 node=h;                  //node就相当于上面的node1
  10.                 h=h->next;             //h就相当于node2
  11.         }
  12.         if (node->next==NULL)
  13.         {
  14.                 printf("can't find the key!\n");
  15.                 return NULL;
  16.         }
  17.         node->next=h->next;
  18.         free(h);
  19.         return Head;
  20. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-15 09:34:34 | 显示全部楼层
表示路过 强力抢占沙发  闪人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-15 09:39:07 | 显示全部楼层
额,,不知道是我没看懂还是怎么的,,既然你是人事管理系统,事先员工的数据一定存在一个文件中了撒,,那么有员工离职,你将文件中的数据一链表的形式读取,在移除离职人员的信息。。再覆盖掉原文件。这不就好了么。。我个人觉得不存在什么释放内存的步骤。。本人小菜,,大牛勿黑。。求指导。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-15 11:58:09 | 显示全部楼层
:dizzy::L不懂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-5-15 11:59:21 | 显示全部楼层

当你把链表中的一个结点移除后,被移除的结点还占内存的,可能我没表达清楚,我这个问题跟文件无关,我的本意只是想问如何释放掉被移除结点所占的内存,即堆空间……我想到一个办法,就是为移除后的结点建立另一个链表,待有新的员工加入时先检查那个链表是否有移除的结点,若有,覆盖结点,否则再新建一个结点,这样就不至于太浪费堆空间,但我想知道有没有更好的办法!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-15 16:58:02 | 显示全部楼层
就用free()释放啊,不懂为什么不行~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-15 20:24:59 | 显示全部楼层
用一个结构体指针指向要删除的节点,然后让被删节点的上一个节点的下一个节点指向被删节点的下一个节点
然后 free(临时的结构体指针) 就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-15 20:44:57 | 显示全部楼层
直接delete p;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-15 22:10:41 | 显示全部楼层
用MFC类做起来不是更简单,先创建一个CObject派生出来的用来描述员工信息的类,然后再用CObList将每个对象串起来就行了,用CObList的成员函数处理员工的增减,绝对不会出错,还支持串行化与转储。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-16 19:24:31 | 显示全部楼层
如果你想释放离职员工的那个节点所占用的内存,首先可以调用free()函数,而free()函数里面要有一个参数 ,而这个参数就是你要释放内存的那个节点的地址,而这个地址是保存在你要释放内存的那个节点的前一个节点中,所以你在前一个节点中拿到这个地址不久可以了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-5-17 22:24:12 | 显示全部楼层
littleevil 发表于 2012-5-14 23:49
同意7楼所说
比如有单链表:...node1 node2 node3...
若你要删除node2:

谢了!不过 我那问题还是没解决,可能问题不是出在这吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-26 02:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表