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

程序代码如下:
程序代码:
#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
有容就大
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
有容就大
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
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
以下是引用hellovfp在2012-2-6 15:43:04的发言:

 
里面的函数套了好几层,有点晕。
不就是C代码么?哪里让你头晕了?写法多种多样罢了。
 
这两个头都是自己写的。。。不存在库里面有没有。
所有的代码都在下载包里。
 
assert(data_size > 0);有什么用?你编程从来不用这个么?
 
NEWC 是一个宏,在《C和C指针》一书里有提到。
 
destruct_func()这个函数,自己写的。就是用来释放如果节点数据也是动态分配的情况。
类似于C++的析构函数。
啊,我刚刚学才3个月,不好意思啊,洗把脸好多了。看你的博客我学到不少啦。

梅尚程荀
马谭杨奚







                                                       
2012-02-06 15:47
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 12楼 hellovfp
谢谢你的建议,下了个电子版的。不过要是有本书就好了。

梅尚程荀
马谭杨奚







                                                       
2012-02-06 16:08
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 13楼 TonyDeng
嗯嗯,老大多多指教啊。

梅尚程荀
马谭杨奚







                                                       
2012-02-06 16:09
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 16楼 hellovfp
谢谢指点。

梅尚程荀
马谭杨奚







                                                       
2012-02-06 16:18
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 18楼 TonyDeng
老大你的话让俺受宠若惊啊,我要要要好风格。

梅尚程荀
马谭杨奚







                                                       
2012-02-06 16:22



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




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

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