| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3068 人关注过本帖
标题:初学,如何删除单链表
只看楼主 加入收藏
T1165170241
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-12-9
结帖率:33.33%
收藏
已结贴  问题点数:20 回复次数:9 
初学,如何删除单链表
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define N 3
#define LEN sizeof(struct grade)
struct grade
{
    char no[7];
    int score;
    struct grade *next;
};
struct grade *create(void)
{
    struct grade *head=NULL,*new1,*tail;
    int i=1;
    for(;i<=N;i++)
    {
        new1=(struct grade *)malloc(LEN);
        printf("Input the number of student NO.%d(6 bytes):",i);
        scanf("%s",new1->no);
    if(strcmp(new1->no,"000000")==0)
        {  
            free(new1);
            break;
        }
        printf("Input the score of student NO.%d:",i);
        scanf("%d",&new1->score);
        if(i==1) head=new1;
        else tail->next=new1;
        tail=new1;
    }
    return(head);
}
    struct grade *del(struct grade *head)
    {
        struct grade *p1;
        struct grade *p2;
        p1=head;
        while(p1)
        {
            p2=p1->next;
            free(p1);
            p1=p2;
        }
    };

void main()
    {
    struct grade *p;
    p=del();
    if(p==NULL)
        printf("链表删除成功");
}
不太会,,求大神
2016-04-10 17:52
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:14 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>

#define N 100
#define LEN sizeof(struct grade)

struct grade
{
    char no[7];
    int score;
    struct grade *next;
};

struct grade *create()
{
    struct grade *head=NULL,*new1,*tail;
    int i=1;
    for(;i<=N;i++)
    {
        new1=(struct grade *)malloc(LEN);
        printf("Input the number of student NO.%d(6 bytes):",i);
        scanf("%s",new1->no);
        
        if(strcmp(new1->no,"000000")==0)
        {  
            free(new1);
            tail->next=NULL;  //the end node
            break;
        }
        
        printf("Input the score of student NO.%d:",i);
        scanf("%d",&new1->score);
        
        if(i==1) head=new1;
        else tail->next=new1;
        
        tail=new1;

        if(i==N)  tail->next=NULL;
    }
    
    return  head;
}
void del(struct grade *head)  //void,nothing return
{
    struct grade *p1;
    struct grade *p2;
    p1=head;
    
    while(p1->next!=NULL)
    {
        p2=p1->next;
        free(p1);
        p1=p2;
    }
    free(p1);  //free the last node
}

void main()
{
    struct grade *head;
    head=creat();
    del(head);
}


[此贴子已经被作者于2016-4-10 18:17编辑过]


   唯实惟新 至诚致志
2016-04-10 18:10
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:6 
删除单项链表必须遍历整个链表,并依次free:
struct grade*head;
struct grade*temp=head;
while(temp){
temp=temp->next;
free(head);
head=temp;
}

我感觉写得很烂,

φ(゜▽゜*)♪
2016-04-10 18:14
T1165170241
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-12-9
收藏
得分:0 
回复 2楼 qq1023569223
运行后我怎么知道是否已经删除了整个链表
2016-04-10 18:18
T1165170241
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-12-9
收藏
得分:0 
回复 3楼 书生牛犊
由于删除过程不管是先释放还是先取的后一个元素都有问题,所以我用了两个指针来删除整个链表,一个指向当前要删除的元素,而另外一个指向该删除元素的下一个元素.
我是这么觉得的
2016-04-10 18:20
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 5楼 T1165170241
对的,至少必须有两个指针才能进行删除操作。
/*************************************
至于你怎么验证这个链表有没有删除成功;;
我建议你写一个程序,不断malloc空间,直到不能malloc了,然后调用删除的那个函数,再接着malloc,如果这个时候你能malloc的空间和删除之前的一样大,那就说明你的删除函数成功了。
/*************************************
然后还有一个不知道靠不靠谱的方法,先malloc几个空间,记录下他们的指针数值(%p),然后free,然后再malloc,看看能不能把刚刚释放掉的空间又申请回来。。。说不定就凑巧又申请回来了呢?
*/


φ(゜▽゜*)♪
2016-04-10 18:31
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
这个不好说,只能测试头指针指向的数据是否和原来一样就行。

   唯实惟新 至诚致志
2016-04-10 18:38
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 7楼 qq1023569223
free函数不会往那个地址写入任何信息,他只是把之前声明的一个{这个地盘归我了,你们谁都别碰}给删掉了。你如果在free一个结构体之前把他的指针保留下来了,然后你声明一个void指针,指向那个位置,通过类型强制转换之后,你会发现那上面的信息,全部都还在,没有发生改变。

这就好像我们使用电脑把硬盘里的文件删除了,可是实际上电脑并不会真的往那个文件所在的地址段覆盖写入0,他只是在一个“资产信息表”里面把指向那个地址段的标识打叉掉,然后这个地址段就会在下次你往硬盘里写入信息的时候被拿去使用。

φ(゜▽゜*)♪
2016-04-10 18:49
T1165170241
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-12-9
收藏
得分:0 
回复 7楼 qq1023569223
能不能检验它的头指针存在与否?怎么突然运行出错了
2016-04-10 18:52
未来大仙
Rank: 6Rank: 6
来 自:黑窟窿
等 级:侠之大者
威 望:4
帖 子:263
专家分:491
注 册:2015-6-20
收藏
得分:0 
删除单链表?
把头结点删掉就万事大吉了,没必要遍历全部节点,如果你不担心内存不够用的话

好好学习,天天向上!
2016-04-10 21:01
快速回复:初学,如何删除单链表
数据加载中...
 
   



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

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