鱼C论坛

 找回密码
 立即注册
查看: 3942|回复: 5

这是小甲鱼老师的 删除链表的 问题

[复制链接]
发表于 2013-9-15 00:08:14 | 显示全部楼层 |阅读模式
5鱼币
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

#define LEN sizeof (struct student )//student结构的大小

struct student *creat();//自定义函数--创建链表
struct student *del(struct student *head,int num);//自函数--del函数用于删除结点,*head即链表
                                                  //的头指针,num是要删除的结点num

void print(struct student *head);//自定义函数--打印链表

struct student
{
        int num;
        float score;
        struct student *next;
};

int n;   //全局变量,用来记录存放了多少数据

int main()
{
        struct student *stu,*p;
        int n;

        stu=creat(); //得到创建后的链表的头指针
        p=stu;
        print(p);

        printf("Please enter the num to delete\n");
        scanf("%d",&n);
        print(del(p,n));  //调用函数del 进行删除

        printf("\n\n");
        system("pause");
}
//  创造链表
struct student *creat()
{
        struct student *head;     //头指针
        struct student *p1,*p2; 
        
        p1=p2=(struct student *)malloc(LEN); 
        
        printf("Please enter the num\n");
        scanf("%d",&p1->num);
        printf("Please enter the score\n");
    scanf("%f",&p1->score);
        
        head=NULL;
        n=0;
        while(p1->num)
        {
                n++;
                if(1==n)
                {
                        head=p1;
                }
        else
                {
                        p2->next=p1;
                }
            p2=p1;
                p1=(struct student *)malloc(LEN);
                
                printf("Please enter the num:\n");
                scanf("%d",&p1->num);
                printf("Please enter the score:\n");
                scanf("%f",&p1->score);
        }
        p2->next = NULL;

        return head;
}
void print(struct student *head)
{
        struct student *p;
        printf("\nThere are %d records!\n",n);
        p=head;
        if(head)
        {
                do
                {
                        printf("学号是为%d的成绩是 %f \n",p->num,p->score);
                        p=p->next;
                }while(p);
        }
}
struct student *del(struct student *head,int num)
{
        struct student *p1,*p2;

        if(NULL==head) // 如果头结点指向NULL,这是一个空指针,直接结束
        {
                printf("\nThis list is null!\n");
                goto end;
        }
        
        p1=head;
        while(p1->num!=num && p1->next!=NULL)
        {
                p2=p1;
                p1=p1->next;
        }
        if(num==p1->num) //将要删除的结点位于头结点的时候(特殊情况)
        {
                if(p1==head)
                {
                        head=p1->next;
                }
                else                //一般情况
                {
                        p2->next=p1->next;
                }
                printf("\nDelete No:%d succeed!\n",num);
                n=n-1;  //全局变量,记录链表的数据个数
        }
        else
        {
                printf("%d not been found!\n",num);

        }
end:
     return head; 
}

其中用到了malloc分配内存
可是并没有用 free 释放。。难道不释放无所谓吗?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-15 13:28:26 | 显示全部楼层
首先这个貌似是定义在函数里的函数运行完就会自动释放
再者反正就几个指针而已这还真的无所谓 撑死都不会到1kb 现在内存都是X GB的 无伤大雅
如果讲错请一笑而过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-19 14:13:55 | 显示全部楼层
我看del的时候没有free,这个的确是问题。
在大的工程里面,可能会千百次调用这个链表函数,那么内存泄露就很多了。
我关于链表做了一个帖子你可以搜搜看,但是都是自己做的,仅仅供参考即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-25 10:30:53 | 显示全部楼层
新人,来看学习的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-26 13:27:21 | 显示全部楼层
用malloc函数申请的内存,最后应该要用free函数释放掉的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-26 21:16:28 | 显示全部楼层
真是难得给力的帖子啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 18:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表