雷与火之歌 2019-07-27 17:27 采纳率: 50%
浏览 386

c语言使用malloc导致程序退出,问题zai第37行到第50行

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define strcpy strcpy_s

//定义基本结构体
struct sorenote
{
    int number;             //学号
    char name[10];          //姓名
    float chinese;          //语文成绩
    float mathmatic;        //数学成绩
    float english;          //英语成绩
    struct sorenote *next=NULL;
};

typedef struct sorenote sore;
//链表节点计数
int jishu(sore*p)
{
    int n = 0;
    while (p!=NULL)
    {
        n = n + 1;
        p = p->next;

    }
    return n;
}

//输入或添加学生信息
sore *shuru(sore*head)
{
    sore  *p1, *p2, *p3;

    p2 = head;
    if (head != NULL)
    {
        p2 = head;//取链表头指针
        while (head != NULL)
        {
            head = head->next;
        }
        p1 = head = (sore*)malloc(sizeof(sore));
    }
    else
    {
        p1 = p2 = head = (sore*)malloc(sizeof(sore));
    }

    printf("请输入学生资料(输入0退出)!\n");
    while (1)
    {
    repeat1:
        printf("请输入学生学号(学号应大于0):");
        scanf_s("%d", &p1->number);

        while (p1->number < 0)
        {
            getchar();
            printf("输入错误,请重新输入学生学号(输入0退出):");
            scanf_s("%d", &p1->number);
        }

        if (p1->number == 0)
        {
            return p2;
        }
        else
        {
            p3 = p2;
            int n;
            n=jishu(p3);
            if (n > 0)
            {
                for (int i = 0; i < n; i++)
                {
                    if (p1->number != p3->number)
                    {
                        p3 = p3->next;
                    }
                    else
                    {
                        printf("学号重复,请重新输入!\n");
                        goto repeat1;
                    }
                }
            }
        }

        printf("请输入学生姓名:");
        scanf_s("%s", &p1->name,10);

        printf("请输入语文成绩(0~100):");
        scanf_s("%f", &p1->chinese);
        for (; p1->chinese < 0 || p1->chinese > 100;)
        {
            getchar();
            printf("输入错误,请重新输入语文成绩:");
            scanf_s("%f", &p1->chinese);
        }

        printf("请输入数学成绩(0~100):");
        scanf_s("%f", &p1->mathmatic);
        for (; p1->mathmatic < 0 || p1->mathmatic > 100;)
        {
            getchar();
            printf("输入错误,请重新输入数学成绩:");
            scanf_s("%f", &p1->mathmatic);
        }

        printf("请输入英语成绩(0~100):");
        scanf_s("%f", &p1->english);
        for (; p1->english < 0 || p1->english> 100;)
        {
            getchar();
            printf("输入错误,请重新输入英语成绩:");
            scanf_s("%f", &p1->english);
        }
        p1 = p1->next = (sore*)malloc(sizeof(sore));
    }
    return p2;
}


//链表按学号排序
sore *paixu(sore *head)
{
    int n, k;
    n = jishu(head);
    float fen;
    char t[10];
    sore *p1, *p3, *max;
    p1 = head;
    p3 = head;
    //冒泡排序学号
    for (int i = 1; i < n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            max = p1;
            p1 = p1->next;
            if (max->number > p1->number)
            {
                //交换节点学号
                k = max->number;
                max->number = p1->number;
                p1->number = k;

                //交换节点姓名
                strcpy(t, max->name);
                strcpy(max->name, p1->name);
                strcpy(p1->name, t);

                //交换节点语数外成绩
                fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen;
                fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen;
                fen = max->english; max->english = p1->english; p1->english = fen;
            }
        }
        max = head;
        p1 = head;
    }
    return head;
}

//链表按姓名排序
sore *namepaixu(sore *head)
{
    int n,k;
    n = jishu(head);
    float fen;
    char t[10];
    sore *p1, *p3, *max;
    p1 = head;
    p3 = head;
    //冒泡排序学号
    for (int i = 1; i < n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            max = p1;
            p1 = p1->next;
            if (strcmp(max->name , p1->name)>0)
            {
                //交换节点学号
                k = max->number;
                max->number = p1->number;
                p1->number = k;

                //交换节点姓名
                strcpy(t, max->name);
                strcpy(max->name, p1->name);
                strcpy(p1->name, t);

                //交换节点语数外成绩
                fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen;
                fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen;
                fen = max->english; max->english = p1->english; p1->english = fen;
            }
        }
        max = head;
        p1 = head;
    }
    return head;
}

//链表按语文成绩排序
sore *chinesepaixu(sore *head)
{
    int n,k;
    n = jishu(head);
    float fen;
    char t[10];
    sore *p1, *p3, *max;
    p1 = head;
    p3 = head;
    //冒泡排序学号
    for (int i = 1; i < n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            max = p1;
            p1 = p1->next;
            if (max->chinese > p1->chinese)
            {
                //交换节点学号
                k = max->number;
                max->number = p1->number;
                p1->number = k;

                //交换节点姓名
                strcpy(t, max->name);
                strcpy(max->name, p1->name);
                strcpy(p1->name, t);

                //交换节点语数外成绩
                fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen;
                fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen;
                fen = max->english; max->english = p1->english; p1->english = fen;
            }
        }
        max = head;
        p1 = head;
    }
    return head;
}

//链表按数学成绩排序
sore *mathpaixu(sore *head)
{
    int n,k;
    n = jishu(head);
    float fen;
    char t[10];
    sore *p1, *p3, *max;
    p1 = head;
    p3 = head;
    //冒泡排序学号
    for (int i = 1; i < n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            max = p1;
            p1 = p1->next;
            if (max->mathmatic > p1->mathmatic)
            {
                //交换节点学号
                k = max->number;
                max->number = p1->number;
                p1->number = k;

                //交换节点姓名
                strcpy(t, max->name);
                strcpy(max->name, p1->name);
                strcpy(p1->name, t);

                //交换节点语数外成绩
                fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen;
                fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen;
                fen = max->english; max->english = p1->english; p1->english = fen;
            }
        }
        max = head;
        p1 = head;
    }
    return head;
}

//链表按英语成绩排序
sore *englishpaixu(sore *head)
{
    int n, k;
    n = jishu(head);
    float fen;
    char t[10];
    sore *p1, *p3, *max;
    p1 = head;
    p3 = head;
    //冒泡排序学号
    for (int i = 1; i < n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            max = p1;
            p1 = p1->next;
            if (max->english > p1->english)
            {
                //交换节点学号
                k = max->number;
                max->number = p1->number;
                p1->number = k;

                //交换节点姓名
                strcpy(t, max->name);
                strcpy(max->name, p1->name);
                strcpy(p1->name, t);

                //交换节点语数外成绩
                fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen;
                fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen;
                fen = max->english; max->english = p1->english; p1->english = fen;
            }
        }
        max = head;
        p1 = head;
    }
    return head;
}

//生成链表
sore *creatlink()
{
    sore *head=NULL;
    head = shuru(head);                     //生成链表,写入链表数据
    head = paixu(head);                     //链表排序
    printf("输入学生个数为:%d个!\n",jishu(head));
    printf("生成完成,已退出");
    return head;            
}

//显示学生信息
void print(sore *head)
{
    int n,k;
    sore *p;
    if (head == NULL)
    {
        printf("\n没有任何学生资料\n");
    }
    else 
    {
        printf("%d\n", jishu(head));
        printf("-----------------------------------------\n");
        printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n");
        printf("-----------------------------------------\n");
        p = head;
        for (; p->next == NULL;)
        {
            printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->chinese,p->mathmatic,p->english);
            printf("-----------------------------------------\n");
            p = p->next;
        }
    }
    printf("显示完毕");
}

//添加学生数据
sore *add(sore*head)
{
    head = shuru(head);                     //添加学生数据
    head = paixu(head);                     //链表排序
    printf("现在学生数为:%d个!",jishu(head));
    return 0;
}

//查询学生成绩
sore *search(sore *head)
{
    int number;
    sore *p1;
    if (head == NULL)
    {
        printf("\n没有学生资料!\n");
        return head;
    }
    while (1)
    {   
        printf("输入要查询的学生的学号(输入0退出):");
        scanf_s("%d", &number);
        getchar();
        if (number == 0)
        {
            break;
        }
        else
        {

            printf("-----------------------------------------\n");
            printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n");
            printf("-----------------------------------------\n");
            p1 = head;
            while (p1->number != number && p1->next != NULL)
            {
                p1 = p1->next;
            }
            if (p1->number == number)
            {
                printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english);
                printf("-----------------------------------------\n");
            }
            else
            {
                printf("%d不存在此学生!\n", number);
            }
        }
    }
    printf("已经退出!\n");
    return 0;
}

//删除数据
sore *dele(sore *head)
{
    int number;
    sore *p1,*p2;
    if (head == NULL)
    {
        printf("\n没有学生资料!\n");
        return head;
    }
    while (1)
    {
        printf("输入要删除的学生的学号(输入0退出):");
        scanf_s("%d", &number);
        getchar();
        if (number == 0)
        {
            break;
        }
        else
        {

            p1 = head;
            p2 = head;
            while (p1->number != number && p1->next != NULL)
            {
                p2 = p1;
                p1 = p1->next;
            }
            if (p1->number == number)
            {
                p2->next = p1->next;
                free(p1);
            }
            else
            {
                printf("%d不存在此学生!\n", number);
            }
        }
    }
    printf("已经退出!\n");
    return head;
}

//链表排序
sore *sortdata(sore *head)
{
    int n;
    if (head == NULL)
    {
        printf("\n没有任何学生资料!\n");
    }
    else
    {
        for (int i = 0; i < 80; i++)
        {
            printf("*");
        }
        printf("1按学号排序\t2按姓名排序\t3按语文成绩排序\n");
        printf("4按数学成绩排序\t5按英语成绩排序\t\n");
        for (int i = 0; i < 80; i++)
        {
            printf("*");
        }
        printf("请选择操作:");
        scanf_s("%d", &n);
        getchar();
        switch (n)
        {
        case 1:head = paixu(head); break;
        case 2:head = namepaixu(head); break;
        case 3:head = chinesepaixu(head); break;
        case 4:head = mathpaixu(head); break;
        case 5:head = englishpaixu(head); break;
        default:printf("输入错误请重新输入");
        }
        print(head);
    }
    return head;
}

//保存数据
int save(sore *p1)
{
    int n;
    FILE *fp;
    char filepn[20];    //存放文件名及保存路径
    printf("请输入文建路径及文件名:");
    scanf_s("%s", filepn,20);
    n = fopen_s(&fp, filepn, "w+");
    if (n!=0)
    {
        printf("文件无法打开!\n");
        return 0;
    }
    while (p1 != NULL)
    {
        fprintf(fp,"|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english);
        p1 = p1->next;
    }
    fclose(fp);
    printf("文件已保存!\n");
    return 0;
}

//从文件读取数据
sore *loadfile()
{
    int n;
    sore *p1, *p2;
    char filepn[20];    //存放文件名及保存路径
    FILE *fp;
    printf("请输入文件路径及文件名:");
    scanf_s("%s", &filepn,20);
    n= fopen_s(&fp,filepn, "r+");
    if ( n!= 0)
    {
        printf("无法打开文件!\n");
        return 0;
    }
    printf("         学生成绩管理系统       \n");
    printf("-----------------------------------------\n");
    printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n");
    printf("-----------------------------------------\n");
    p1 = p2 = (sore *)malloc(sizeof(sore));
    do
    {
        fscanf_s(fp,"|%d\t|%s\t|%f\t|%f\t|%f\t|\n", &p1->number, &p1->name,10, &p1->chinese, &p1->mathmatic, &p1->english);
        printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english);
        printf("-----------------------------------------\n");
        p1=p1->next= (sore *)malloc(sizeof(sore));
    } while (!feof(fp));
    free(p1);
    fclose(fp);
    return p2;
}

//菜单
int menu()
{
    int a=0;
    int i;
    printf("\t\t\t\t学生管理系统\n");
    printf("\n");
    for (i = 0; i < 80; i++)
    {
        printf("*");
    }
    printf("\n");
    printf("1编辑学生的成绩\t\t\t2显示学生的成绩\t\t\t3查询学生的成绩\n");
    printf("4添加学生的成绩\t\t\t5删除学生的成绩\t\t\t6学生成绩排序\n");
    printf("7保存学生的成绩\t\t\t8统计学生的成绩\t\t\t9读取学生的成绩\n");
    for (i = 0; i < 80; i++)
    {
        printf("*");
    }
    printf("\n");
    printf("欢迎进入学生成绩管理系统,请选择您说要的操作(选择(0)退出):");
    scanf_s("%d", &a);
    getchar();
    return a;
}

//成绩统计
sore *tongji(sore *head)
{
    float sum1=0, sum2=0, sum3=0;
    float ave1=0, ave2=0, ave3=0;
    float max=0, min=0;
    char maxname[10], minname[10];
    sore *p;
    p = head;
    int x, y = 0;
    printf("1个人总分和平均分\t2单科平均分\t3总分最高分和最低分\n");
    scanf_s("%d", &x);
    getchar();
    if (head == NULL)
    {
        printf("\n没有学生资料!\n");
        return 0;
    }
    else
    {
        switch (x)
        {
        case 1:
            printf("---------------------------------------------------------\n");
            printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|总分\t|平均分\t|\n");
            printf("---------------------------------------------------------\n");
            while (p != NULL)
            {
                sum1 = p->chinese + p->mathmatic + p->english;
                ave1 = sum1 / 3;
                printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n", p->number, p->name, p->chinese, p->mathmatic, p->english, sum1, ave1);
                printf("---------------------------------------------------------\n");
                p = p->next;
            }
            break;
        case 2:
            while (p != NULL)
            {
                sum1 = sum1 + p->chinese;
                sum2 = sum2 + p->mathmatic;
                sum3 = sum3 + p->english;
            }
            y = jishu(head);
            ave1 = sum1 / y;
            ave2 = sum2 / y;
            ave3 = sum3 / y;
            printf("语文平均分是:%.1f\n", ave1);
            printf("数学平均分是:%.1f\n", ave2);
            printf("英语平均分是:%.1f\n", ave3);
            break;
        case 3:
            for (int i = 0; i < jishu(head); i++)
            {
                sum1 = p->chinese + p->mathmatic + p->english;
                if (max < sum1)
                {
                    max = sum1;
                    strcpy(maxname, p->name);
                }
                if (min < sum1)
                {
                    min = sum1;
                    strcpy(minname, p->name);
                }
                p = p->next;
            }
            printf("最高分为:%.1f,姓名:%s\n", max, maxname);
            printf("最低分为:%.1f,姓名:%s\n", min, minname);
            break;
        default:printf("输入错误,请重新输入!\n");
        }
    }
    return 0;
}

//主函数
int main()
{
    int k;
    sore *head =NULL,*stu=NULL;
    k = 100;
    while (k!=0)
    {
        k = menu();
        switch (k)
        {
        case 1:head = creatlink(); break;
        case 2:print(head); break;
        case 3:search(head); break;
        case 4:head = add(head); break;
        case 5:head = dele(head); break;
        case 6:head = sortdata(head); break;
        case 7:save(head); break;
        case 8:tongji(head); break;
        case 9:head = loadfile(); break;
        case 0:return 0;
        default:printf("输入错误,请重新输入!\n");
        }

    }

}
  • 写回答

1条回答 默认 最新

  • Toblerone_Wind 2019-07-27 17:40
    关注

    这种问题一般都是自己找的,我看了下你的代码,觉得你对链表的掌握还是有点欠缺,而且代码结构性比较差。
    出错方面看看书吧,也可以写一个小demo自己试着调。
    看样子你是在写学生信息管理系统,如果有需要我可以发你一份。

    评论

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置