| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6461 人关注过本帖
标题:创建了一个链表,但不知道如何来释放分配的内存
只看楼主 加入收藏
q215236213
Rank: 4
等 级:业余侠客
威 望:1
帖 子:148
专家分:276
注 册:2012-7-24
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:11 
创建了一个链表,但不知道如何来释放分配的内存
程序代码:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct student
{
    int date; //数据域
    struct student * pNext; //指针域
}* PNODE, NODE;
//函数前置声明
PNODE create_list(void);
void traverse_list(PNODE pHead);
//主函数
int main(void)
{
    PNODE pHead = NULL; //定义一个指针变量
    pHead = create_list(); //用来接受链表的头指针
    traverse_list(pHead);  //遍历输出链表中的每一个节点中数据域中的数据

    return 0;
}
//创建链表
PNODE create_list(void)
{
    int len; //节点的个数
    int temp = 0; //临时存放用户输入的节点中数据域的数据
    int i;
   
    PNODE pHead = (PNODE)malloc(sizeof(NODE)); //创建头指针
    if (NULL == pHead)
    {
        printf("内存分配失败,程序退出!\n");
        exit(-1);
    }

    PNODE pTail = pHead; //定义一个指针变量,并赋值
    pTail->pNext = NULL; //pTail 尾节点,此节点的指针域为空

    printf("请输入节点的个数:\n");
    printf("len = ");
    scanf("%d", &len);
   
    for(i = 0; i < len; i++)
    {
        PNODE pNew = (PNODE)malloc(sizeof(NODE)); //生成节点,节点的个数等于用户输入的个数,即len的值
        if(NULL == pNew)
        {
            printf("内存分配失败,程序退出!\n");
            exit(-1);
        }
        printf("请输入数值\n");
        printf("temp = ");
        scanf("%d", &temp); //输入节点数据域的值
        pNew->date = temp; //把输入的值赋给节点的数据域中存放
        //把生成的新的节点挂在pNew 后面
        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail = pNew;
    }
   
    return pHead;
}
//对链表中的每个节点,遍历输出
void traverse_list(PNODE pHead)
{
    PNODE p = pHead->pNext ;
    while(NULL != p)
    {
        printf("%d\n", p->date );
        p = p->pNext ;
    }
    return;
}
是不是只需要 释放 pHead 的内存 ?
搜索更多相关主题的帖子: 如何 内存 
2012-08-15 13:29
rokatu
Rank: 1
等 级:新手上路
帖 子:2
专家分:7
注 册:2012-8-13
收藏
得分:2 
因该需要循环释放链表各成员的动态内存。
2012-08-15 13:58
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:2 
遍历释放内存

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2012-08-15 14:14
q215236213
Rank: 4
等 级:业余侠客
威 望:1
帖 子:148
专家分:276
注 册:2012-7-24
收藏
得分:0 
遍历 释放内存会报错~~
2012-08-15 14:28
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:6 
楼主可以写一个函数在显示链表元素后调用
//释放链表节点
void release_list(PNODE pHead)
{
    PNODE p=pHead;
    PNODE t=p;
    while(NULL != p->pNext)
    {
        t=p->pNext;
        free(p);
        p=t;
    }
    return;
}
2012-08-15 15:22
q215236213
Rank: 4
等 级:业余侠客
威 望:1
帖 子:148
专家分:276
注 册:2012-7-24
收藏
得分:0 
回复 5楼 stophin
专门建一个函数来释放这些内存?好的,我回去试试!
2012-08-15 16:29
q215236213
Rank: 4
等 级:业余侠客
威 望:1
帖 子:148
专家分:276
注 册:2012-7-24
收藏
得分:0 
回复 5楼 stophin
这个循环会不会导致尾节点的内存没能被释放 ??
p->pNext 为空的时候,循环不执行,而尾节点的指针域本来就是空的!
2012-08-16 12:53
q215236213
Rank: 4
等 级:业余侠客
威 望:1
帖 子:148
专家分:276
注 册:2012-7-24
收藏
得分:0 
void release_list (PNODE pHead)
{
    PNODE p = pHead;
    PNODE q ;
    while(NULL != p )
    {
        q = p->pNext ;
        free(p);
        p = q;
    }

    return;
}
不知道怎样写是不是对的,在运行的时候不会报错!
2012-08-16 13:18
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
回复 8楼 q215236213
很对,我写的太急没注意到。我的代码循环完后加一个free就可以了,但如果pHead本来就是NULL会出错,所以加一个判断。你的代码没有这些问题
void release_list(PNODE pHead)
{
    if (NULL == pHead)
        return;
    PNODE p=pHead;
    PNODE t=p;
    while(NULL != p->pNext)
    {
        t=p->pNext;
        free(p);
        p=t;
    }
    free(p);
    pHead=NULL;    //忘了这个了,不置空后面如果再使用的话会出错的
    return;
}

[ 本帖最后由 stophin 于 2012-8-16 16:20 编辑 ]
2012-08-16 16:15
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
以下是引用q215236213在2012-8-15 14:28:28的发言:

遍历 释放内存会报错~~
写法问题?我没报错啊

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2012-08-16 17:12
快速回复:创建了一个链表,但不知道如何来释放分配的内存
数据加载中...
 
   



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

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