基础不扎实的计算机小白 2021-10-30 14:30 采纳率: 100%
浏览 10
已结题

想用free释放malloc创建的头结点L内存但是报错了,最后只好将头结点L,指向NULL,请教一下各位,要怎么改进代码呢?



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
#define MAXSIZE 10
#define OK 1
#define ERROR 0
#define T 1
#define F -1
 
typedef int Status;
struct Student {
    int id;
    char name[20];
    float grade;
};
 
typedef struct Dlist {
    Student data;
    struct Dlist* next;
}Dlist,*Zdlist;
 
//创建
Status Cj_List(Zdlist& L) {
    L = (Zdlist)malloc(sizeof(Student));
    if (L) {
        L->next = NULL;
        printf("创建成功!\n");
        return OK;
    }
    printf("创建失败!\a\n");
    return ERROR;
}
 
//插入
Status Cr_List(Zdlist &L ,int i,Student e) {
    Zdlist p ,s;
    p = L;
    int j = 0;                          //判断是否有头结点,无头节点则创建失败。
    while (p && (j < i - 1)) {
        p = p->next;
        ++j;
    }
    if (!p || j > i - 1) {
        printf("插入失败!\a\n");
        return ERROR;
    }
    s = (Zdlist)malloc(sizeof(Student));//插入时先新建头结点
    s->next = NULL;                 //定义p=L用p代替L进行指针遍历,防止丢失头结点
    s->data = e;
    s->next = p->next;           
    p->next = s;
    printf("插入成功!\n");
    return OK;
    
}
 
//查找
Status Cz_List(Zdlist L, Student e) {
    Zdlist p ;
    int i = 1;
    p = L->next;
    while (p && strcmp(p->data.name, e.name) != 0) {  // 比较名字字符
        p = p->next;
        i++;
    }
    if (p) {
        printf("学生数据在第 %d 位\n", i);
        return OK;
    }
    printf("未找到该学生!\a\n");
    return ERROR;
}
 
//取值
Status Qz_List(Zdlist L, int i) {     //找到位置直接输出学生信息
    Zdlist p = L;
    int j = 0;
    while (p && (j < i )) {
        p = p->next;
        ++j;
    }
    if (!p || (j > i )) {
        printf("取值位置不合理!\a\n");
        return ERROR;
    }printf("该学生信息为:学号:%d 姓名:%s 成绩:%.2f\n", p->data.id, p->data.name, p->data.grade);
    return OK;
}
 
//删除
Status Sch_List(Zdlist& L, int i) {
    Zdlist p = L;
    int j = 0;
    while ((p->next) && (j < i - 1)) {
        p = p->next;
        ++j;
    }
    if (!(p->next) || (j > i - 1)) {
        printf("删除的位置不合理!\a\n");
        return ERROR;
    }
    Zdlist q = (Zdlist)malloc(sizeof(Student));
    Dlist* temp = q;
    q = p->next;
    p->next = q->next;
    free (temp);         //使指针指向删除节点的下一个节点,用free将删除节点内存释放
    temp->next = NULL;
    printf("删除成功!\n");
    return OK;
}
 
//输出
Status Sc_List(Zdlist L) {
    Zdlist p = L;
    int sum=0;
    if (!p->next) {
        printf("链表为空!\a\n");
        return ERROR;
    }
    printf("全部学生数据:\n");
    while (p->next!=NULL) {
        p = p->next;
        sum++;      //输出总人数
        printf("学号:%d 姓名:%s 成绩:%.2f\n学生总数量:%d个\n", p->data.id, p->data.name, p->data.grade,sum);
    }
    return OK;
}
 
 
//清空
Status Qk_List(Zdlist& L,int open) {
    if (open != T) {
        printf("内存未被创建!\a\n");
        return ERROR;
    }
    while (L->next!=NULL) {    //调用删除函数遍历清空链表所有元素及释放内存
        Sch_List(L, 1);
    }
    L = NULL;
    printf("清楚数据完成!\n内存已清空\n");
    return OK;
}
 
 
int main() {
    Zdlist L;
    Student e;
    int choose;
    int i;
    int open = F;    //判断内存是否已经创建,防止键盘非法输入造成遍历越界报错异常
    while (1) {
        printf("*******************************\n");
        printf("1.创建\n");
        printf("2.插入\n");
        printf("3.查找\n");
        printf("4.提取\n");
        printf("5.删除\n");
        printf("6.输出\n");
        printf("7.清空\n");
        printf("8.退出\n");
        printf("请选择操作:");
        scanf("%d", &choose);
        printf("\n");
        switch (choose) {
        case 1:
            if (open != F) {
                printf("请勿重复创建!\a\n");
                break;
            }
            Cj_List(L);
            open = T;          //open=T 已申请内存  open=F 内存未被申请
            break;
        case 2:
            if (open != T) {
                printf("内存未被创建!\a\n");
                break;
            }
            printf("输入插入的位置、学号、姓名、成绩(空格隔开)\n");
            scanf("%d %d %s %f", &i, &e.id, &e.name,&e.grade);
            Cr_List(L, i, e);
            break;
        case 3:
            if (open != T) {
                printf("内存未被创建!\a\n");
                break;
            }
            printf("输入需查找学生的姓名:");
            scanf("%s", e.name);
            printf("\n");
            Cz_List(L, e);
            break;
        case 4:
            if (open != T) {
                printf("内存未被创建!\a\n");
                break;
            }
            printf("输入提取的位置\n");
            scanf("%d", &i);
            Qz_List(L, i);
            break;
        case 5:
            if (open != T) {
                printf("内存未被创建!\a\n");
                break;
            }
            printf("输入删除的位置\n");
            scanf("%d", &i);
            Sch_List(L, i);
            break;
        case 6:
            if (open != T) {
                printf("内存未被创建!\a\n");
                break;
            }
            Sc_List(L);
            break;
        case 7:
            Qk_List(L,open);
            open = F;
            break;
        case 8:
            printf("已成功退出!\n");
            system("pause");
            return 0;
        }
    }
}
————————————————
版权声明:本文为CSDN博主「基础不扎实的计算机小白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_55797565/article/details/120975844
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月7日
    • 创建了问题 10月30日

    悬赏问题

    • ¥15 一道ban了很多东西的pyjail题
    • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
    • ¥15 C++识别堆叠物体异常
    • ¥15 微软硬件驱动认证账号申请
    • ¥15 有人知道怎么在R语言里下载Git上的miceco这个包吗
    • ¥15 GPT写作提示指令词
    • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
    • ¥20 关于DAC输出1.000V对分辨率和精度的要求
    • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题
    • ¥15 哪位能做百度地图导航触点播报?