C语言链表实现足球比赛积分排名系统
本文介绍如何使用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步:实现综合排名算法
这是系统的核心逻辑。采用链表元素交换法(冒泡排序的变种),直接在内存中交换结构体内容而非仅交换指针,以保证顺序稳定。比较规则优先级如下:
- 积分从高到低;
- 若积分相同,按净胜球(
pure)从高到低; - 若净胜球也相同,按总进球数(
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语言实战项目的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













