标题:解决释放问题
只看楼主
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
已结贴  问题点数:20 回复次数:22 
解决释放问题
程序目的如图:

程序代码如下:
程序代码:
#include  <stdio.h>
#include  <stdlib.h>
#define  LEN  sizeof(NodeList)

struct NodeList {
   int  number;
   NodeList  *next;
};

void OutputList(NodeList *);
NodeList *CreateList(int a[], int );
NodeList *DeleteList(NodeList *);

int  main()
{
    int array[100] ;
    int length = 0;
    NodeList  *head;
    char ch;

    printf("Please input a number sequence:\n");
    do
    {
        scanf("%d", &array[length++]);
            ch = getchar();
    }while (ch != '\n');
    head = CreateList(array, length);
    printf("The original list is:\n");
    OutputList(head);
    printf("\n");
    printf("The list after delete is:\n");
    DeleteList(head);
    OutputList(head);
    printf("\n");
    return 0;
}

NodeList *CreateList(int a[], int length)
{
    NodeList  *head, *p1, *p2;
    int i = 0;

    head = p1 = p2 = (NodeList *)malloc(LEN);
    do{
        p2 -> number = a[i++];   
        p1 = (NodeList *)malloc(LEN);
        p2 -> next = p1;
        p2 = p1;
    }while (i < length);
    p2 -> next = NULL;
    return head;
}

void OutputList(NodeList *head)
{
     NodeList  *p;
     p = head;
     while (p -> next != NULL)
     {
         printf("%d ", p -> number);
         p = p -> next;
     }
}

NodeList *DeleteList(NodeList *head)
{
     NodeList  *p1, *p2, *p3;

     p3 = p2 = head;
     p1 = p3 -> next;
    while (p3 -> next  != NULL)
    {
       while (p1 != NULL)
       {        
          if (p1 -> number == p3 -> number)
          {
            p1 = p1 -> next;
            p2 -> next = p1;
          }
          else
          {
              p2 = p1;
              p1 = p1 -> next;
          }
       }
       p3 = p2 = p3 -> next;
       p1 = p3 -> next;
    }
    return head;
}
我现在的问题是,CreateList()函数使用malloc()申请了内存,为了不使内存泄露必须手动free();那么是在主函数中释放还是在子函数中释放?由于是一个链表,那么怎么释放每一个结点内存?我看到很多程序就直接写个
    free(p)完事,这能达到目的吗?比如我上面的程序,怎么释放?
搜索更多相关主题的帖子: next number 
2012-02-06 13:44
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:3 
你不是写了个DeleteList函数么,在这里释放不就挺好。这个函数没必然返回值。另外你好像也在学C++,写一个链表类,在析构函数里释放内存。

重剑无锋,大巧不工
2012-02-06 13:55
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:3 
自动释放,https://hi.bccn.net/space-383031-do-blog-id-34432.html
第四节,第二个例子代码。

我们都在路上。。。。。
2012-02-06 14:20
离开天空的云
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:110
专家分:198
注 册:2011-8-12
得分:3 
那里释放好像都无所谓吧?,别释放了在当返回值..使用就好了。直接一个free(p)可能不行,一个一个节点慢慢释放吧 ,释放就从头节点开始释放(假设a指向头节点),让一个指针(假设B)指向头节点的下一个节点,释放完在让a指向b,b在指向b指向的下一个节点,然后循环判断a是不是尾节点 在相应操作就行啦   我没实践过啊,可以参考一下
2012-02-06 14:30
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 2楼 beyondyf
if (p1 -> number == p3 -> number)
          {
            p2 -> next = p1 -> next;        
            free(p1);
            p1 = p2 -> next;
          }
这样释放被删除的结点内存,未被删除的结点内存就要用list_destroy()函数来释放了吧?

梅尚程荀
马谭杨奚







                                                       
2012-02-06 15:19
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
得分:3 
你的程序是去重吧   直接开哈希表效率最高  对于链表释放是要用递归
程序代码:
void del(Node *root)
{

    if(root->next)
        del(root->next);
    delete root;
}


                                         
===========深入<----------------->浅出============
2012-02-06 15:27
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 3楼 hellovfp
里面的函数套了好几层,有点晕。
#include "list.h"
#include "list_impl.h" 这个头文件很少看到啊,库里没有怎么办。
assert(data_size > 0);有什么用,防御编程吗?
NEWC又是什么东东?
destruct_func()这个函数整篇都没提及,那里来的?



梅尚程荀
马谭杨奚







                                                       
2012-02-06 15:33
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 6楼 laoyang103
哈哈 ,这个好。

梅尚程荀
马谭杨奚







                                                       
2012-02-06 15:34
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
改进了下,大家看有没有错误的地方:
程序代码:
#include  <stdio.h>
#include  <stdlib.h>
#define  LEN  sizeof(NodeList)

struct NodeList {
   int  number;
   NodeList  *next;
};

void OutputList(NodeList *);
NodeList *CreateList(int a[], int );
NodeList *DeleteList(NodeList *);
void  FreeList(NodeList *head);

int  main()
{
    int array[100] ;
    int length = 0;
    NodeList  *head;
    char ch;

    printf("Please input a number sequence:\n");
    do
    {
        scanf("%d", &array[length++]);
            ch = getchar();
    }while (ch != '\n');
    head = CreateList(array, length);
    printf("The original list is:\n");
    OutputList(head);
    printf("\n");
    printf("The list after delete is:\n");
    DeleteList(head);
    OutputList(head);
    FreeList(head);
    printf("\n");
    return 0;
}

NodeList *CreateList(int a[], int length)
{
    NodeList  *head, *p1, *p2;
    int i = 0;

    head = p1 = p2 = (NodeList *)malloc(LEN);
    do{
        p2 -> number = a[i++];   
        p1 = (NodeList *)malloc(LEN);
        p2 -> next = p1;
        p2 = p1;
    }while (i < length);
    p2 -> next = NULL;
    return head;
}

void OutputList(NodeList *head)
{
     NodeList  *p;
     p = head;
     while (p -> next != NULL)
     {
         printf("%d ", p -> number);
         p = p -> next;
     }
}

NodeList *DeleteList(NodeList *head)
{
     NodeList  *p1, *p2, *p3;

     p3 = p2 = head;
     p1 = p3 -> next;
    while (p3 -> next  != NULL)
    {
       while (p1 != NULL)
       {        
          if (p1 -> number == p3 -> number)
          {
            p2 -> next = p1 -> next;       
            free(p1);                         // 循环释放删除的结点内存
            p1 = p2 -> next;
          }
          else
          {
              p2 = p1;
              p1 = p1 -> next;
          }
       }
       p3 = p2 = p3 -> next;
       p1 = p3 -> next;
    }
    return head;
}

void  FreeList(NodeList *head)             //  递归释放结点内存,参考老杨的方法
{
    if (head -> next)
    {
        FreeList(head -> next);
    }
    free(head);
}



[ 本帖最后由 有容就大 于 2012-2-6 15:43 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-02-06 15:40
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
以下是引用有容就大在2012-2-6 15:33:22的发言:

里面的函数套了好几层,有点晕。
#include "list.h"
#include "list_impl.h" 这个头文件很少看到啊,库里没有怎么办。
assert(data_size > 0);有什么用,防御编程吗?
NEWC又是什么东东?
destruct_func()这个函数整篇都没提及,那里来的?

里面的函数套了好几层,有点晕。
不就是C代码么?哪里让你头晕了?写法多种多样罢了。

这两个头都是自己写的。。。不存在库里面有没有。
所有的代码都在下载包里。

assert(data_size > 0);有什么用?你编程从来不用这个么?

NEWC 是一个宏,在《C和C指针》一书里有提到。

destruct_func()这个函数,自己写的。就是用来释放如果节点数据也是动态分配的情况。
它的由来。。。第五点中有述。类似于C++的析构函数。

[ 本帖最后由 hellovfp 于 2012-2-6 15:47 编辑 ]

我们都在路上。。。。。
2012-02-06 15:43



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




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

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