| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1330 人关注过本帖
标题:求个关于链表释放的问题 。
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏
已结贴  问题点数:100 回复次数:30 
求个关于链表释放的问题 。
写了一个用链表输出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
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:100 
head = (LinkList)malloc(sizeof(LinkList));
楼主你不觉得sizeof(LinkList)有问题吗?LinkList根据typedef它应该是一个指针啊,也就是说它只有4个字节(x86)。
是不是应该写成sizeof(*LinkList)或sizeof(SNode)?

My life is brilliant
2012-11-26 15:22
有容就大
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
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 5楼 有容就大
额,我的想说的是该类型的变量间接引用(dereference)的意思。

My life is brilliant
2012-11-26 15:34
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:0 
改成sizeof(SNode)
释放那里:        
while (NULL != head)
        {
        p = head->next;
            free(head);
        head = p;
        }
2012-11-26 15:35
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 6楼 有容就大
你别着急啊,你这有些强制的意思哦。

My life is brilliant
2012-11-26 15:35
bccnyouke
Rank: 2
等 级:论坛游民
帖 子:26
专家分:49
注 册:2012-11-23
收藏
得分:0 
#ifdef __WRONG_CODE__
#define STRUCT_SIZE    sizeof(LinkList)
#else
#define STRUCT_SIZE    sizeof(struct Node)
#endif
楼主这底子不行
2012-11-26 15:37
快速回复:求个关于链表释放的问题 。
数据加载中...
 
   



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

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