C语言链表实现足球比赛积分排名系统

温以宁
温以宁
发布时间:2026-10-15 | 4人浏览过
原创

本文介绍如何使用C语言的单向链表(Linked List)来实现一个简单的足球比赛积分统计与管理系统。该系统允许用户输入球队名称、胜平负场次及得失球数,自动计算积分和净胜球,并支持对球队列表进行增删改查操作。核心亮点在于利用指针移动实现节点的重新排列,从而完成按积分优先、净胜球次之、进球数最后的综合排名算法。

系统功能与结构概述

该系统主要包含以下核心功能模块:

  • 数据录入:批量初始化多支球队的基础数据。
  • 节点管理:动态增加新球队、按名称修改或彻底删除现有球队记录。
  • 智能排序:根据“积分 → 净胜球 → 总进球数”的规则对链表进行冒泡排序。
  • 界面交互:通过控制台菜单引导用户操作,并输出格式化报表。

核心数据结构定义

首先定义球队信息结构体 football,使用数组 num[4] 分别记录需赛场次、赢、平、负场数,并结合指针 next 构建单向链表。

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

#define LEN sizeof(match)

typedef struct football {
    char name[20];     // 球队名
    int num[4];        // num[0]场数, num[1]赢, num[2]平, num[3]负
    int goal;          // 进球数
    int lose;          // 失球数
    int integral;      // 积分 (胜*2 + 平)
    int pure;          // 净胜球 (进球 - 失球)
    struct football *next;
} match;

基本功能实现方法

第1步:初始化球队数据

目的为创建链表头部并批量填入初始数据。系统提示输入球队总数后,循环分配内存并录入得分详情。

match *creat() {
    system("cls"); 
    system("color 74");
    int t, n = 0;
    match *head, *p1;
    p1 = (match *)malloc(LEN);
    head = NULL;
    
    printf("Enter the total number of the football teams:\n");
    scanf("%d", &t);
    
    while(n != t) {
        n++;
        printf("the name of team %d :\n", n); 
        scanf("%s", p1->name);
        
        printf("team %d win round(s):\n", n); 
        scanf("%d", &p1->num[1]);
        
        printf("team %d draw round(s):\n", n); 
        scanf("%d", &p1->num[2]);
        
        printf("team %d goal:\n", n);
        scanf("%d", &p1->goal);
        printf("team %d lose:\n", n);
        scanf("%d", &p1->lose);
        
        // 自动计算积分与净胜球
        p1->integral = p1->num[1]*2 + p1->num[2];
        p1->pure = p1->goal - p1->lose;
        
        if(n == 1) {
            head = p1;
        } else {
            p2->next = p1;
            p2 = p1;
        }
        p1 = (match *)malloc(LEN);
    }
    p2->next = NULL;
    return head;
}

第2步:执行动态增删改查

增加球队 (Add):在已有链表尾部追加新节点。需注意将新增链表的头节点接在原链表末尾(p2->next = newhead)。 修改与删除 (Amend, Del):两者均需遍历链表寻找目标队名。修改时直接覆盖对应字段;删除时需处理前驱节点指向(即 pre->next = p->next),并使用 free() 释放内存以防止泄漏。

第3步:实现综合排名算法

这是系统的核心逻辑。采用链表元素交换法(冒泡排序的变种),直接在内存中交换结构体内容而非仅交换指针,以保证顺序稳定。比较规则优先级如下:

  1. 积分从高到低;
  2. 若积分相同,按净胜球(pure)从高到低;
  3. 若净胜球也相同,按总进球数(goal)从高到低。
// print 函数中的排序核心片段
for(p=head;p!=NULL;p=p->next){
    for(q=p->next;q!=NULL;q=q->next) {
        // 优先比较积分
        if(p->integral < q->integral) {
            swap_data_and_pointer(p, q);
        } else if(p->integral == q->integral) {
            // 其次比较净胜球
            if(p->pure < q->pure) {
                swap_data_and_pointer(p, q);
            } else if(p->pure == q->pure) {
                // 最后比较进球数
                if(p->goal < q->goal) {
                    swap_data_and_pointer(p, q);
                }
            }
        }
    }
}

编译与运行说明

该程序依赖 Windows API(如 GetStdHandle),因此最适合在 Windows 环境下使用 MinGW 或 Visual Studio 进行编译。由于使用了 system()

总结

本实例展示了C语言在处理复杂业务逻辑时的基础能力,特别是链表操作与多重条件排序的结合。以上内容即为C语言实现足球比赛积分统计与排序系统的详细内容,更多关于C语言实战项目的资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表