| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1330 人关注过本帖
标题:求个关于链表释放的问题 。
取消只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏
已结贴  问题点数:100 回复次数:15 
求个关于链表释放的问题 。
写了一个用链表输出1-N之间素数的程序 结果应该没错 但是在释放删除结点和遍历释放时出错了
可是俺不知道怎么改 求大牛指教。
程序代码:
/*
Print the prime numbers between 1-N
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 1000
#define M (int)sqrt((double)N)

typedef struct Node
{
    int num;
    struct Node *next;
}SNode, *LinkList;

LinkList CreateList(LinkList head);
void PrintPrime(LinkList head);
LinkList GetPrimes(LinkList head);
void FreeList(LinkList head);

int main(void)
{
    LinkList head = NULL;
    head = CreateList(head);  
    GetPrimes(head);
    PrintPrime(head);
    //FreeList(head);   加这个会出错
    return 0;
}

LinkList CreateList(LinkList head)
{
    LinkList p, q;
    if (NULL == head)
    {
        head = (LinkList)malloc(sizeof(LinkList));
        if (NULL == head)
        {
            printf("Memory allocation error!\n");
            return NULL;
        }
    }
    head->next = NULL;

    p = (LinkList)malloc(sizeof(LinkList));
        if (NULL == p)
        {
            printf("Memory allocation error!\n");
            return NULL;
        }
        p->num = 2;
        head->next = p;
        p->next = NULL;

    int i;
    for (i = 3; i <= N; i += 2)
    {
        q = (LinkList)malloc(sizeof(LinkList));
        if (NULL == q)
        {
            printf("Memory allocation error!\n");
            return NULL;
        }
        q->num = i;
        q->next = p->next;
        p->next = q;
        p = p->next;
    }
    return head;
}

void PrintPrime(LinkList head)
{
    LinkList p;
    int count = 0;
    if (NULL == head || NULL == head->next)
    {
        printf("This is an empty linklist!\n");
        return;
    }
    p = head->next;
    while (NULL != p)
    {
        printf("%-6d", p->num);
        p = p->next;
        count++;
        if (0 == count % 10)
            printf("\n");
        if (0 == count %200)
            getchar();
    }
    printf("\nThere are %d prime nunbers.\n", count);
}


LinkList GetPrimes(LinkList head)
{
    LinkList p, pre, div;
    div = head->next->next;
    while (div->num <= M)
    {
        pre = div;
        p = div->next;
        while (NULL != p)
        {
            if (0 == ((p->num) % (div->num)))
            {
                pre->next = p->next;
                //free(p);   加这个也会错
                p = pre->next;
            }
            else
            {
                pre = pre->next;
                p = p->next;

            }   

        }
        div = div->next;
    }
    return head;
}

////// 难道我释放函数写错了 貌似没问题啊
void FreeList(LinkList head)
{
    LinkList p;
    if (NULL == head)
        return;
    else
    {
        while (NULL != head)
        {
            p = head;
            head = head->next;
            free(p);
        }
    }
}
百分求解


[ 本帖最后由 有容就大 于 2012-11-26 23:19 编辑 ]
收到的鲜花
  • 寒风中的细雨2012-11-27 09:40 送鲜花  10朵   附言:Lz真实财大气粗呀 随便一帖就是满分....
搜索更多相关主题的帖子: numbers between 
2012-11-26 14:41
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
如果不释放 能显示结果
图片附件: 游客没有浏览图片的权限,请 登录注册

为防止内存泄露 去释放 但是出错
图片附件: 游客没有浏览图片的权限,请 登录注册

貌似是说我的程序试图在堆的最后面去写东西 不太懂 求解。

梅尚程荀
马谭杨奚







                                                       
2012-11-26 14:48
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
who帮搞定了 100 分 全送he/she.

我的目的很简单就是要
1.能在循环删除里实现free
2.要能遍历free。


[ 本帖最后由 有容就大 于 2012-11-26 15:06 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-11-26 15:00
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用lz1091914999在2012-11-26 15:22:39的发言:

head = (LinkList)malloc(sizeof(LinkList));
楼主你不觉得sizeof(LinkList)有问题吗?LinkList根据typedef它应该是一个指针啊,也就是说它只有4个字节(x86)。
是不是应该写成sizeof(*LinkList)或sizeof(SNode)?

谢谢L版花时间来帮忙 不过改成sizeof(*LinkList)是错误的写法
改成sizeof(SNode)后运行和原来是一样的结果 。

梅尚程荀
马谭杨奚







                                                       
2012-11-26 15:28
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
呵呵 都改成head = (SNode *)malloc(sizeof(SNode));的形式就OK了
先送分 望L版多阐述下机理 和 重点 。

梅尚程荀
马谭杨奚







                                                       
2012-11-26 15:33
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用newdos在2012-11-26 15:35:24的发言:

改成sizeof(SNode)
释放那里:         
while (NULL != head)
        {
        p = head->next;
            free(head);
        head = p;
        }

谢谢
不过我遍历释放的那种写法应该也可以吧
还想向你请教下SNode 和 LinkList 的区别。

梅尚程荀
马谭杨奚







                                                       
2012-11-26 22:14
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用lz1091914999在2012-11-26 15:35:38的发言:

你别着急啊,你这有些强制的意思哦。

呵呵 你一眼就看到问题的本质了 说明很里手呢 可以向大家宣讲下嘛
学链表的那些教程对这方面的解释比较少呢。

梅尚程荀
马谭杨奚







                                                       
2012-11-26 22:16
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用lz1091914999在2012-11-26 16:05:34的发言:


应该说的是你写的数据写到了堆缓冲区之后,设个断点调试看看。

调试过 到哪里就跳出那个错误了


梅尚程荀
马谭杨奚







                                                       
2012-11-26 22:16
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用bccnyouke在2012-11-26 15:37:28的发言:

#ifdef __WRONG_CODE__
#define STRUCT_SIZE    sizeof(LinkList)
#else
#define STRUCT_SIZE    sizeof(struct Node)
#endif
楼主这底子不行

基础不劳 地动山摇 被你说中了
我想问的是 假如已经知道sizeof(LinkList)是会出问题的 为什么还用个条件编译
万一我#define 了__WRONG_CODE__呢 。
你的意思是sizeof(LinkList)还是可以胜任某些工作?

梅尚程荀
马谭杨奚







                                                       
2012-11-26 22:19
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
不好意思 现在才给各位信息反馈 望谅解 请多多指教。

梅尚程荀
马谭杨奚







                                                       
2012-11-26 22:20
快速回复:求个关于链表释放的问题 。
数据加载中...
 
   



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

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