C语言链表实现校运动会成绩管理系统

夏知夏
夏知夏
发布时间:2026-10-16 | 4人浏览过
原创

本方案通过C语言的标准库实现了一个轻量级的校运动会成绩管理程序,重点展示了利用单向链表进行数据的动态增删查改,以及如何结合排序算法处理成绩排名逻辑。

系统功能与核心逻辑

该系统主要解决多学院、多项目的复杂成绩统计问题。相比静态数组,使用链表可以灵活处理不同年份或批次的项目数量变化。系统需完成以下核心任务:

  1. 数据持久化(内存级):通过 struct project 结构体存储项目名称、各学院名称、分数及名次,并利用指针构建链表。
  2. 单项排名:针对每个比赛项目,根据各学院得分从高到低排序并分配名次。
  3. 总积分统计:遍历所有项目,累加同一学院的得分,最终生成学院总排名榜。
  4. 交互菜单:提供直观的命令行选项,控制系统的生命周期。

第1步:准备环境与基础数据结构

在开始编码前,需引入标准输入输出和内存管理头文件。定义一个名为 Proj 的结构体,用于承载单个运动项目的全部信息。同时定义一个辅助结构体 SumNo 用于临时存储学院总分以便排序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3 //参与运动会的学院数目
//定义比赛项目结构体
typedef struct project {
    char xiangmu[40];     // 比赛项目名称
    char name[N][40];     // 参与的学院名称
    float score[N];       // 各学院在该项目的单项成绩
    int no[N];            // 各学院在该项目的单项名次
    struct project *next; // 指向下一个项目节点的指针
} Proj;
//定义用于总成绩排序的结构体
typedef struct sumno {
    char name[40];
    float sum;
} SumNo;

第2步:初始化与主循环控制

main 函数负责程序的入口与流程控制。首先为头节点 L 分配内存,并将其 next 置空以标记链表为空。随后进入 do-while 循环,每次循环开始时调用 Menu() 打印界面,等待用户指令。

指令通过 switch-case 分发:输入 1 到 6 分别对应不同的业务逻辑,输入 0 则调用 exit(0) 终止进程,其他输入视为错误指令。

int main() {
    int item, n;
    Proj *L = NULL;
    L = (Proj *)malloc(sizeof(Proj)); // 开辟头节点空间
    L->next = NULL;
    
    do {
        Menu();
        printf("请输入相应的数字,进行相应的操作:\n");
        scanf("%d", &item);
        system("cls"); // Windows环境下清屏
        switch (item) {
            case 1: // 录入信息
                printf("请输入您要录入的项目数目:");
                scanf("%d", &n);
                ListCreate(L, n); 
                getchar();
                printf("\n请按任意键返回主菜单\n");
                getchar();
                break;
            // ... 其他 case 分支 ...
            case 0:
                printf("即将退出校运动会项目管理系统.....");
                exit(0);
        }
    } while (item);
    return 0;
}

第3步:执行具体管理操作

  • 创建链表:ListCreate 函数接收节点数 n,通过循环多次调用 Input 读取数据,并将新节点插入链表头部。Input 函数负责提示用户依次输入项目名称及 N 个学院的分数。
  • 查找与修改:ListSearch 和 ListModify 首先遍历链表匹配项目名称。若找到目标节点,可进一步查询单项明细或在修改模式下更新项目名称、特定学院的分数或名称。
  • 删除节点:ListDelete 需要同时维护当前节点指针 p 和前驱节点指针 pre。匹配成功后,将 pre->next 指向 p->next,解除链接后调用 free(p) 释放内存。

第4步:排名算法与结果输出

排名的计算是系统的核心逻辑,分为两步:

  1. 单项排名 (PerRank):遍历链表中的每一个项目节点。在每个节点内部,获取其所属的 score 数组,使用冒泡排序算法根据分数从大到小排列,并同步交换对应的学院名称 name。排序完成后,按索引顺序赋值名次 no(即 k+1)。
  2. 总排名 (SumRank):新建一个 SumNo s[N] 数组初始化学院总分。再次遍历整个项目链表,将所有项目的分数累加到对应学院的 sum 字段中。最后对 s 数组按总分降序排序,并按索引输出排名。

以下是系统的实际运行界面截图,展示了主菜单的状态:

总结与注意事项

该实现利用了C语言强大的指针机制,完成了复杂数据的动态管理。在实际应用中需注意:scanf 后的 getchar() 主要用于吸收缓冲区内的换行符,防止影响后续字符串输入。此外,由于使用了 system("cls"),该代码仅在 Windows 环境下表现一致,在 Linux 或 macOS 下建议使用 system("clear")。

以上就是C语言实现校运动会项目管理系统的具体代码,更多关于C语言数据结构实战的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表