| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 809 人关注过本帖
标题:链表的销毁函数 求教
只看楼主 加入收藏
紫色的自由
Rank: 1
等 级:新手上路
帖 子:21
专家分:7
注 册:2011-6-8
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:6 
链表的销毁函数 求教
# include <stdio.h>
# include<malloc.h>
# include<stdlib.h>

typedef struct Node
{
    int data;
    struct Node *pNext;
}NODE,*PNODE;

PNODE InitList();                    //创建链表
void DestroyList(PNODE );            //销毁链表
//void ClearList();                    //重置链表
bool ListEmpty(PNODE );                //判断链表是否为空
int ListLength(PNODE );                //链表长度
int GetElem(PNODE ,int ,int );        //返回第i个元素的值
//void LocateElem();            //
//    PriorEmele();
//    NextEmele();
void ListTraverse(PNODE );                    //遍历链表
void SortList(PNODE);                        //链表排序
bool ListInsert(PNODE ,int , int );            //将某个元素插入到某个位置
bool ListDelete(PNODE ,int , int * );        //将某个位置的元素删除

//MAIN
int main(void)
{

    PNODE pHead = NULL;
    pHead = InitList();                //创建链表
    ListEmpty(pHead);        //判断链表是否为空
    ListTraverse(pHead);    //遍历链表
    DestroyList(pHead);        //销毁链表
    ListTraverse(pHead);    //遍历销毁链表
    return 0;
}

//创建链表
PNODE InitList()
{
    int val,len;                            //输入链表元素的变量
    PNODE pHead=NULL;                            //头结点

    pHead = (PNODE)malloc(sizeof(NODE));
    if( NULL == pHead )
    {
        printf("动态内存分配失败!\n");
        exit(-1);
    }
    PNODE pTail = pHead;
    pTail->pNext = NULL;
    printf("请输入链表长度:");
    scanf("%d",&len);
    for(int i=0;i<len;++i)
    {
        printf("请输入第%d个位置的元素:",i+1);
        scanf("%d",&val);
        PNODE pNew = (PNODE) malloc(sizeof(NODE));
        if( NULL == pNew )
        {
            printf("内存分配失败!\n");
        }
        else
        {
            pNew->data = val;
            pTail->pNext = pNew;
            pNew->pNext = NULL;
            pTail = pNew;
        }
    }

    return pHead;
}
//销毁链表
void DestroyList(PNODE pHead)
{
    PNODE q , p = pHead;
    int len = ListLength(pHead);
    int j = 0;
    while(j <= len)
    {
        q = p->pNext;
        p->pNext = q->pNext;
        free(q);
        ++j;
    }
    free(p);


}

//判断链表是否为空
bool ListEmpty(PNODE pHead)
{
    int len = ListLength(pHead);
 
    if( NULL == pHead->pNext)
    {   
        printf("链表为空!\n");
        return true;
    }
    else
    {
        printf("链表非空!\n");
        printf("链表长度为:%d\n",len);
        return false;
    }
}

//遍历链表
void ListTraverse(PNODE pHead)
{
    PNODE p = pHead->pNext;
    printf("链表的元素排列如下:");
    while(p)
    {
        printf("%d ",p->data);//p->data要加(&)p->data
        p = p->pNext;
    }
    printf("\n");

    return;
}

//求链表长度
int ListLength(PNODE pHead)
{
    int length = 0;
    PNODE p = pHead->pNext;

    while(NULL != p)
    {
        ++length;
        p = p->pNext;

    }
    return length;

}
/*
void DestroyList(LinkList *L)//初始条件:线性表L已存在。 操作结果:销毁线性表L。
{
LNode Head, P;
if(*L)//若线性表L已存在
{
Head = *L;
P = Head->next;
while(!P) //把链表中除头结点外的所有结点释放
{
free(Head);
Head = P;
P = Head->next;
}
free(Head); //释放头结点
}
}
*/
//在链表某位置插入某个元素
bool ListInsert(PNODE pHead,int pos, int val)
{
    PNODE p = pHead;
    int j=0;
    while( p&& j < pos - 1)
    {
        p = p->pNext;
        ++j;
    }
    if( !p || j> pos - 1)
        return false;

    PNODE pNew = (PNODE) malloc(sizeof(NODE));
    pNew->data = val;
    pNew->pNext = p->pNext;
    p->pNext = pNew;
    return true;
   
}
//在链表某个位置将元素删除并返回该值
bool ListDelete(PNODE pHead,int pos, int *pVal )
{
    PNODE p = pHead;
    int j=0;
    while(p->pNext && j < pos - 1)
    {
        p = p->pNext;
        ++j;
    }
    if(!(p->pNext)|| j > pos - 1 )
        return false;
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    pNew = p->pNext;
    p->pNext = pNew->pNext;
    pVal = &(pNew->data);
    free(pNew);
    return true;
}
//-----END
       我的代码运行到销毁链表就出错求教问题所在
搜索更多相关主题的帖子: void include 元素 
2012-11-08 22:31
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:7 
程序代码:
     PNODE p = pHead;
     int len = ListLength(pHead);
     while (len)
     {
         p = pHead->pNext;
         pHead->pNext = p->pNext;
         free(p);
         --len;
     }
     //int j = 0;
     //while(j <= len)
     //{
     //    q = p->pNext;
     //    p->pNext = q->pNext;
     //    free(q);
     //    ++j;
     //}
     free(pHead);
      
程序代码:
    PNODE pHead = NULL;
     pHead = InitList();                //创建链表
     ListEmpty(pHead);        //判断链表是否为空
     ListTraverse(pHead);    //遍历链表
     DestroyList(pHead);        //销毁链表
   //  ListTraverse(pHead);    //遍历销毁链表
    这样链表销毁后就不能再用了

2012-11-09 13:11
紫色的自由
Rank: 1
等 级:新手上路
帖 子:21
专家分:7
注 册:2011-6-8
收藏
得分:0 
哦 链表销毁貌似意义不大啊。程序结束了,链表还存在吗?如果存在那样不就造成内存泄露,若是不存在了,那就没关系了啊
2012-11-09 14:20
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
回复 3楼 紫色的自由
看在什么环境下了   

如果是像这样“一次性”的  可以不处理  用完了 系统就回收了

如果是长期运行的(服务器端)   就要注意内存泄露问题
2012-11-09 14:27
一个孩子
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:356
专家分:954
注 册:2012-10-1
收藏
得分:7 
学习了,我也在学数据结构,以后多多指教啊!

重要的不是结果,是求一个结果的过程,哪怕千难万难,当你有想要的结果时,你已走的很远
2012-11-10 12:42
duotianshi
Rank: 2
等 级:论坛游民
帖 子:7
专家分:13
注 册:2012-11-10
收藏
得分:7 
内存申请了,肯定要还的,试想如果你的程序足够大,运行的次数足够多,那么还有内存供你申请吗?
2012-11-10 15:07
紫色的自由
Rank: 1
等 级:新手上路
帖 子:21
专家分:7
注 册:2011-6-8
收藏
得分:0 
这样说是没错,但是一直都是假想,不知不觉间就忽略了。
2012-11-16 22:25
快速回复:链表的销毁函数 求教
数据加载中...
 
   



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

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