链表 free 问题

UIUI 2019-05-15 09:18:53

void DelHeadNode(List * p)
{
if (p->next != NULL)
{
p->next = p->next->next; //移动到下一节点
}

}

请问,删除头节点下面的的一个节点的时候,要不要 free ? 该在哪儿 free ?
搜索过,另一个帖子中,有句话是
引用
把所有节点free之后head就要指向NULL

如果free单个,把前一个节点的next指向后一个即可

意思是不是就是不用 free .

该在什么 情况 下要 要 free ?
...全文
161 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
CaptainXue 2019-05-16
  • 打赏
  • 举报
回复
像你这种写法的话,必须把p→next用一个指针变量temp保存起来,用free(temp)实现就可以了
拥抱Linux 2019-05-15
  • 打赏
  • 举报
回复
意思是,想 删除 p 后面的 那个 节点, 是吧?既然不用了,当然应该 free() ,否则就造成 内存泄漏哇!

void DelHeadNode(List *p)
{
if (p->next != NULL) {
List *temp = p->next; //把要删除的节点暂存起来

p->next = p->next->next; //链表跨到下一节点,把要删除的节点从链表中断开

free(temp); // 释放 temp 指向的内存块
temp = NULL;
}
}
UIUI 2019-05-15
  • 打赏
  • 举报
回复
引用 3 楼 Italink 的回复:
对哦,失误了=.=

void DelHeadNode(List * p)
{
    if (p->next != NULL)
    {
        List *s=p->next;
        p->next = p->next->next;   //移动到下一节点
        free(s);
   
      
}

引用 3 楼 Italink 的回复:
对哦,失误了=.=

void DelHeadNode(List * p)
{
    if (p->next != NULL)
    {
        List *s=p->next;
        p->next = p->next->next;   //移动到下一节点
        free(s);
    }
      
}

多谢~ 确实这样才能释放那个结点. 像题目那样写,那个节点的数据并没有被释放掉. 这种情况下,没有释放掉,其它程序是不是也不会再使用这个内存? 你这样写,确实释放了那个内存. if (p->next != NULL) { DelNode = p->next; //保存要释放的节点 printf("%d\t", *DelNode); //打印节点内的数据 p->next = p->next->next; //移动到下一节点 free(DelNode); //释放节点 printf("%d\t", *DelNode); //打印保存的节点内容. } /* 两次打印的数据不相同,第一次打印为结点内的数值.第二次是一个不确定的值. */
Italink 2019-05-15
  • 打赏
  • 举报
回复
对哦,失误了=.=

void DelHeadNode(List * p)
{
    if (p->next != NULL)
    {
        List *s=p->next;
        p->next = p->next->next;   //移动到下一节点
        free(s);
    }
      
}

UIUI 2019-05-15
  • 打赏
  • 举报
回复
引用 1 楼 Italink 的回复:
只要是动态分配的空间,你不free,它就一直占着,然后要不要free,这就得问你了。

void DelHeadNode(List * p)
{
    if (p->next != NULL)
    {
       //应在此处free(p->next)
        p->next = p->next->next;   //移动到下一节点
    }
     
}

直接在此处 free 是有问题的. 整个链表被 释放了.
Italink 2019-05-15
  • 打赏
  • 举报
回复
只要是动态分配的空间,你不free,它就一直占着,然后要不要free,这就得问你了。

void DelHeadNode(List * p)
{
    if (p->next != NULL)
    {
       //应在此处free(p->next)
        p->next = p->next->next;   //移动到下一节点
    }
     
}

69,377

社区成员

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

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