PTA:简易学籍管理系统(3)--插入结点并排序

计算机某班有若干学生,每个学生的信息包括班级、学号、姓名、程序设计成绩、高数成绩、电路成绩,以及3门课总分。学生信息可用如下结构体定义:

struct stud
{
    char clas[20];//班级
    double num; //学号
    char name[10];//姓名
    float program; //程序设计成绩
    float math; //高数成绩
    float circuit; //电路成绩
    float sum; //3门总分
    struct stud *next;
};

(1)编程创建动态链表,由键盘输入学生的信息(输入已默认按3门总分降序排列),当班级为x表示输入结束;
(2)向已建立的简易学籍管理系统中插入若干学生信息(保持原总分降序排列),并输出排序后的所有学生信息。

输入格式:

每个学生信息占一行,信息之间用空格分隔。

输出格式:

每个学生信息占一行,各信息之间以空格分隔,需输出表头(空格分隔),每一行前需标识序号。

输入样例:

在这里给出一组输入。例如:

计算机1602 3161301108 王子 100 100 44
计算机1601 3161911108 徐丑 55 100 88
计算机1602 3161911215 黄午 65 100 76
计算机1601 3141910130 李未 65 100 71
计算机1601 3161911117 张申 70 100 64
计算机1603 3161911307 谢酉 80 94 60
计算机1603 3161911313 李戌 75 100 59
计算机1602 3161911205 冯亥 60 100 73
计算机1601 3161911112 林子 75 82 75
计算机1601 3161911101 陈丑 75 100 56
计算机1602 3151911126 刘寅 100 88 41
计算机1602 3161911219 甘卯 85 94 48
计算机1603 3161911301 王辰 80 60 87
计算机1602 3161911203 经巳 55 100 71
计算机1601 3160107308 张午 55 94 75
计算机1602 3161911220 吴未 65 100 59
计算机1603 3161911315 王申亥 75 100 49
计算机1603 3161911309 经酉 65 100 57
计算机1601 3161911128 叶戌 100 53 68
计算机1601 3161911116 高亥 45 100 75
计算机1601 3161911123 许子 100 60 60
x
计算机1607 3161911722 经镕 64 68.1 60
计算机1606 3161911623 黄耕 6 8 7
计算机1606 3161911625 谢晋 83.1 80 48.8
计算机1605 3161911526 林一平 79.5 61.1 75.3
计算机1605 3161911528 甘实田 85 58 8
计算机1607 3161911729 曹伟奇 70 88.1 84.3
计算机1607 3161912713 许山骐 92.5 98.5 92.5
计算机1607 3161914715 林子威 89.8 94.1 84
x

输出样例:

在这里给出相应的输出。例如:

班级 学号 姓名 程序 高数 电路 3门总分
 1:计算机1607 3161912713 许山骐 92.5 98.5 92.5 283.5
 2:计算机1607 3161914715 林子威 89.8 94.1 84.0 267.9
 3:计算机1602 3161301108 王子 100.0 100.0 44.0 244.0
 4:计算机1601 3161911108 徐丑 55.0 100.0 88.0 243.0
 5:计算机1607 3161911729 曹伟奇 70.0 88.1 84.3 242.4
 6:计算机1602 3161911215 黄午 65.0 100.0 76.0 241.0
 7:计算机1601 3141910130 李未 65.0 100.0 71.0 236.0
 8:计算机1601 3161911117 张申 70.0 100.0 64.0 234.0
 9:计算机1603 3161911307 谢酉 80.0 94.0 60.0 234.0
10:计算机1603 3161911313 李戌 75.0 100.0 59.0 234.0
11:计算机1602 3161911205 冯亥 60.0 100.0 73.0 233.0
12:计算机1601 3161911112 林子 75.0 82.0 75.0 232.0
13:计算机1601 3161911101 陈丑 75.0 100.0 56.0 231.0
14:计算机1602 3151911126 刘寅 100.0 88.0 41.0 229.0
15:计算机1602 3161911219 甘卯 85.0 94.0 48.0 227.0
16:计算机1603 3161911301 王辰 80.0 60.0 87.0 227.0
17:计算机1602 3161911203 经巳 55.0 100.0 71.0 226.0
18:计算机1601 3160107308 张午 55.0 94.0 75.0 224.0
19:计算机1602 3161911220 吴未 65.0 100.0 59.0 224.0
20:计算机1603 3161911315 王申亥 75.0 100.0 49.0 224.0
21:计算机1603 3161911309 经酉 65.0 100.0 57.0 222.0
22:计算机1601 3161911128 叶戌 100.0 53.0 68.0 221.0
23:计算机1601 3161911116 高亥 45.0 100.0 75.0 220.0
24:计算机1601 3161911123 许子 100.0 60.0 60.0 220.0
25:计算机1605 3161911526 林一平 79.5 61.1 75.3 215.9
26:计算机1606 3161911625 谢晋 83.1 80.0 48.8 211.9
27:计算机1607 3161911722 经镕 64.0 68.1 60.0 192.1
28:计算机1605 3161911528 甘实田 85.0 58.0 8.0 151.0
29:计算机1606 3161911623 黄耕 6.0 8.0 7.0 21.0

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stud
{
    char clas[20];//班级
    double num; //学号
    char name[10];//姓名
    float program; //程序设计成绩
    float math; //高数成绩
    float circuit; //电路成绩
    float sum; //3门总分
    struct stud *next;
};
int len = sizeof(struct stud);
struct stud* creat()
{
    struct stud* head, *tail;
    head = tail = NULL;
    while(1)
    {
        struct stud* pnew = (struct stud*)malloc(len);
        scanf("%s", pnew->clas);
        if(strcmp(pnew->clas, "x") == 0)
        {
            free(pnew);
            break;
        }
        scanf("%lf%s%f%f%f", &pnew->num, pnew->name, &pnew->program, &pnew->math, &pnew->circuit);
        pnew->sum = pnew->program + pnew->math + pnew-> circuit;
        pnew->next = NULL;
        if(head == NULL)
        {
            head = pnew;
            tail = pnew;
        }
        else
        {
            tail->next = pnew;
            tail= pnew;
        }
    }
    return head;
}
struct stud* insert(struct stud* head)
{
    struct stud* p1, *p2;
    p1 = p2 = NULL;
    char input[20];
    scanf("%s", input);
    while(strcmp(input, "x") != 0)
    {
        struct stud* t = (struct stud*)malloc(len);
        strcpy(t->clas, input);
        scanf("%lf%s%f%f%f", &t->num, t->name, &t->program, &t->math, &t->circuit);
        t->next = NULL;
        t->sum = t->program + t->math + t->circuit;
        p1 = head;//注意每次遍历之前p1要先重置,使其指向头节点
        while(p1)
        {
            if(p1->sum <= t->sum)//找插入位置
            {
                if(p1 == head)//插入到头节点之前
                {
                    head = t;
                    t->next = p1;
                    break;
                }
                else
                {
                    p2->next = t;
                    t->next = p1;
                    break;
                }
            }
            p2 = p1;//p2可以理解为p1的前驱指针,即p2指向p1的前一个节点
            p1 = p1->next;
        }
        if(head == NULL)//链表为空
        {
            head = t;//头指针直接指向t节点
        }
        else if(head != NULL && p1 ==NULL)//插入到尾部
        {
            p2->next = t;//前驱指针p2的next域指向t节点
        }
        scanf("%s", input);//注意这里要重新输入input,来更新input的值
    }
    return head;
}
int main()
{
    struct stud* head = creat();
    struct stud* p = insert(head);
    printf("班级 学号 姓名 程序 高数 电路 3门总分\n");
    int cnt = 1;
    while(p)
    {
        printf("%2d:%s %.f %s %.1f %.1f %.1f %.1f\n", cnt, p->clas, p->num, p->name, p->program, p->math, p->circuit, p->sum);
        cnt++;
        p = p->next;
    }
    return 0;
}

 

 

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值