| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 511 人关注过本帖
标题:这个动态链表的销毁问题出在在哪里?
只看楼主 加入收藏
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:5 
这个动态链表的销毁问题出在在哪里?
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*Linklist;
void initial(Linklist L)
{
    Linklist p;
    p=(Linklist)malloc(sizeof(LNode));
    if(!p) exit(0);
    L=p;
    L->next=NULL;
}
void creatlist(Linklist L)
{
    Linklist p,q;
    int m;
    q=L;
    printf("请输入若干个正整数,输入非正整数时结束:\n");
    while(1)
    {
        scanf("%d",&m);
        if(m>0)
        {
            p=(Linklist)malloc(sizeof(LNode));
            p->data=m;
            q->next=p;
            q=p;
        }
        else break;
    }
    p->next=NULL;
}
void displaylist(Linklist L)
{
    Linklist p=L;
    for(p=L->next;p!=NULL;p=p->next)
        printf("%d  ",p->data);
    printf("\n");
}
void destory(Linklist L)
{
    Linklist temp;
    temp=L;
    while(temp!=NULL)
    {
        free(temp);
        temp=temp->next;
    }
}
void main()
{
    LNode A;
    initial(&A);
    creatlist(&A);
    printf("输出单向链表A的元素:\n");
    displaylist(&A);
    destory(&A);
}
帮忙看看我的destory()函数问题在哪里?
搜索更多相关主题的帖子: 动态 链表 
2010-03-26 10:25
秀痘魔导士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:250
专家分:1150
注 册:2009-12-23
收藏
得分:0 
    while(temp!=NULL)
    {
        free(temp);
        if (temp->next != NULL)
            temp=temp->next;
    }
2010-03-26 10:28
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
还是不对啊!运行后还是弹出警告。
2010-03-26 15:58
秀痘魔导士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:250
专家分:1150
注 册:2009-12-23
收藏
得分:0 
代码写的很多问题,指针使用不当,改好了

程序代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*Linklist;
void initial(Linklist L)
{
    L->data = 0;
    if(!L) exit(0);
    L->next=NULL;
}
void creatlist(Linklist L)
{
    Linklist p,q;
    int m;
    q=L;
    p=L;
    printf("请输入若干个正整数,输入非正整数时结束:\n");
    while(1)
    {
        scanf("%d",&m);
        if(m>0)
        {
            p=(Linklist)malloc(sizeof(LNode));
            p->data=m;
            q->next=p;
            q=p;
        }
        else break;
    }
    p->next=NULL;
}
void displaylist(Linklist L)
{
    Linklist p=L;
    for(p=L->next;p!=NULL;p=p->next)
        printf("%d  ",p->data);
    printf("\n");
}
void destory(Linklist L)
{
    Linklist temp;
    while(L!=NULL)
    {
        temp=L->next;
        free(L);
        if (temp != NULL)
            L=temp;
        else
            break;
    }
}
void main()
{
    Linklist A;
    A=(Linklist)malloc(sizeof(LNode));
    initial(A);
    creatlist(A);
    printf("输出单向链表A的元素:\n");
    displaylist(A);
    destory(A);
}


[ 本帖最后由 秀痘魔导士 于 2010-3-26 16:33 编辑 ]
2010-03-26 16:06
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
再麻烦你解释下为什么不能直接删除头结点,而必须先让temp=L->next;再 free(L);直接free(L)为什么不对呢?在网上搜索了一下原因,感觉还是不太明白。谢了!这个问题解决了就结贴!

2010-03-26 16:50
秀痘魔导士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:250
专家分:1150
注 册:2009-12-23
收藏
得分:10 
以下是引用xichong在2010-3-26 16:50:44的发言:

再麻烦你解释下为什么不能直接删除头结点,而必须先让temp=L->next;再 free(L);直接free(L)为什么不对呢?在网上搜索了一下原因,感觉还是不太明白。谢了!这个问题解决了就结贴!
直接删除头结点,头结点就不存在了,那么他的next当然是一个错误的值,所以必须先备份一份next的指针,这样在删除之后才能定位到next
2010-03-26 16:52
快速回复:这个动态链表的销毁问题出在在哪里?
数据加载中...
 
   



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

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