作者我当时花了两天肝出来的,用于完成软件基础实验课的报告,欢迎同学们借鉴,我想只有把它发到CSDN上才会让我的付出最有价值😊如有不符合之处,烦请在评论区予以指正。(自认为算是比较完美了哈😁)
要求如下:
2.基于链式存储结构的全运会径赛管理程序设计
利用链式存储结构,为全运会100米的径赛初赛,编写一个管理程序,记录每个选手的姓名和身份证号,并通过数字化菜单为用户提供数据录入、抽签、查找和输出晋级名单的功能。需要实现的功能包括:
- 数据录入功能。通过键盘录入的数据包括姓名,身份证号,是否参加检录和比赛成绩。成绩录入的功能,需要在抽签完成后开放。数据录入的功能在抽签后应该关闭。
- 数据删除的功能。通过键盘录入选手的姓名或身份证号,然后从链表中删除对应的数据。删除的功能,在抽签后应该关闭。
- 抽签管理。通过抽签决定每个人的分组,以及参加检录的时间。每组的人数可以通过键盘进行修改,默认是8个人一组。完成抽签后,需要公布每个选手的组号和赛道信息,且后面的程序中不能再修改。
- 查找功能。通过输入身份证号,或者姓名,查询参赛选手的比赛成绩。
- 输出晋级名单。每组的前三名,再加上剩余的所有选手中成绩前三的选手晋级。
将上面的功能在菜单中同时列出。要求姓名和身份证号定义为字符串。为了节省数据录入的时间,可以将大部分数据存储在数组中,通过初始化程序将数据写入链表。键盘录入数据的功能,演示实现的过程就可以。要求演示功能的时候,至少要存储24名选手的数据。
完成以上程序代码的编写、调试,提供运行结果截图与相应的文字说明。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
typedef struct race
{
char Name[10];//姓名
char ID[20];//身份证号
int Judge;//标记是否检录
char Judgetime[10];//检录时间
int Score;//成绩
int Team;//组别
int Route;//赛道
int Fi;//标记是否入榜,入榜过的不再理会
struct race*Next;//指后指针
struct race*Front;//指前指针
}R,*Ra;
void Ini(R A[],R*head,Ra*end,int Q);
void Draw(R*head,int e);
void Chou_show(R*head);
void Score_reg(R*head);
void Score_show(R*head);
Ra Search(R*head);
Ra Delete(R*head,Ra*end);
void AllShow(R*head);
Ra Final_racer(R*head,int e);
int main()
{
int Q=24;
int e=8;//默认每组的人数
R A[Q];
R*head=(R*)calloc(1,sizeof(R));
Ra end=NULL;Ra F=NULL;//F是晋级榜首地址
Ini(A,head,&end,Q);//初始化A数组,预存24组选手,并且存入链表
int o=-1;//操作数
int chou=0;
int cjlr=0;//通过俩标志变量判断操作是否进行过
while(o!=0)
{
printf("《--欢迎使用全运会径赛管理程序--》\n");
printf("1.选手信息录入 2.抽签分组\n");
printf("3.成绩录入 4.删除选手信息\n");
printf("5.查找选手 6.打印晋级名单\n");
printf("0.退出程序 7.展示所有(测试用)\n");
fflush(stdin);scanf("%d",&o);
switch(o)
{
case 1:if(chou==0)
{
printf("录入几位选手?");fflush(stdin);
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)
{
Register(&end);
}
}
else {printf("抽签后无法录入!\n");}
break;
case 2:if(chou==0)
{
printf("是否修改每组人数?1.是 2.否\n");
int que=2;fflush(stdin);
scanf("%d",&que);
if(que==1)
{
printf("修改后的每组人数:");
scanf("%d",&e);
}
Draw(head,e);
chou=1;
Chou_show(head);
}
else {printf("不能重复抽签!\n");}
break;
case 3:if(chou==1)
{
Score_reg(head);
cjlr=1;
}
else {printf("请在抽签完成后再录入成绩!\n");}
break;
case 4:if(chou==0)
{
head=Delete(head,&end);
}
else printf("抽签完成后不能删除选手信息!\n");
break;
case 5:if(cjlr==1)
{
Score_show(head);
}
else printf("请在成绩录入后再查询!\n");
break;
case 6:if(cjlr==1)
{
if(F==NULL)//榜单出来后不能再创建,因为入榜的Fi都置一了
{F=Final_racer(head,e);}
AllShow(F);
}
else printf("请在成绩录入后再查询!\n");break;
case 7:AllShow(head);break;
case 0:return 0;
default:printf("请重新选择操作!\n");
}
}
}
void Ini(R A[],R*head,Ra*end,int Q)
{
char name[]="001";
char id[]="2003001";
srand((unsigned int)time(NULL));
for(int j=0;j<Q;j++)//初始化数组
{
strcpy(A[j].Name,name);
if(name[2]<'9') {name[2]++;}
else {name[2]='0';name[1]++;}//进位
strcpy(A[j].ID,id);
if(id[6]<'9') {id[6]++;}
else {id[6]='0';id[5]++;}
if(rand()%11==0) A[j].Judge=0;
//随机数求11的余使未检录的比例大大减小
else A[j].Judge=1;//随机决定选手是否检录
}
R*p=head;//把数组的内容copy到链表
int j;
for(j=0;j<Q-1;j++)
{
strcpy(p->Name,A[j].Name);
strcpy(p->ID,A[j].ID);
p->Judge=A[j].Judge;
p->Next=(R*)calloc(1,sizeof(R));
p=p->Next;
p->Next=NULL;
}
strcpy(p->Name,A[j].Name);
strcpy(p->ID,A[j].ID);
p->Judge=A[j].Judge;
*end=p;
}
void Register(Ra*end)
{
Ra p=*end;
p->Next=(Ra)calloc(1,sizeof(R));
p=p->Next;
printf("请输入该选手的以下信息:\n");
printf("姓名:");fflush(stdin);
scanf("%s",p->Name);
printf("身份证号:");fflush(stdin);
scanf("%s",p->ID);
printf("是否检录?1.是 0.否");fflush(stdin);
scanf("%d",&p->Judge);
*end=p;
}
void Draw(R*head,int e)
{
int i=1;
int t=1;
char time[]="15:10";
Ra p=head;
while(p!=NULL)
{
if(i>e)
{
i=1;
t++;
time[3]++;
}
p->Team=t;
p->Route=t;
strcpy(p->Judgetime,time);
i++;p=p->Next;
}
}
void Chou_show(R*head)
{
R*p=head;
int i=1;
while(p!=NULL)
{
printf("第%d位选手:\n",i);
printf("姓名:%s\n",p->Name);
printf("身份证号:%s\n",p->ID);
if(p->Judge==0) printf("是否检录?否\n");
else
{
printf("是否检录?是\n");
printf("检录时间:%s\n",p->Judgetime);
}
printf("组号:%d\n",p->Team);
printf("赛道信息:%d\n",p->Route);
printf("\n");
p=p->Next;
i++;
}
}
void Score_reg(R*head)
{
Ra p=head;
srand((unsigned int)time(NULL));
while(p!=NULL)
{
if(p->Judge==1)
{
p->Score=rand()%(100 - 50 + 1) + 50;
//录入50~100的随机数(上网)
}
p=p->Next;
}
}
Ra Search(R*head)
{
R*p=head;
Ra f=NULL;
S:printf("请输入一项该选手的基本信息:1.姓名 2.身份证号");
int j;fflush(stdin);scanf("%d",&j);
if(j==1)
{
printf("请输入姓名:");
char name[10];fflush(stdin);
scanf("%s",name);
while(p!=NULL)
{
p->Front=f;
f=p;//寻找的过程中建立指前的指针
if(strcmp(name,p->Name)==0)
{
printf("该选手的相关信息如下:\n");
printf("姓名:%s\n",p->Name);
printf("身份证号:%s\n",p->ID);
return p;
}
p=p->Next;
}
printf("未找到该选手!\n");
return NULL;
}
else if(j==2)
{
printf("请输入身份证号:");
char id[20];fflush(stdin);
scanf("%s",id);
while(p!=NULL)
{
p->Front=f;
f=p;
if(strcmp(id,p->ID)==0)
{
printf("该选手的相关信息如下:\n");
printf("姓名:%s\n",p->Name);
printf("身份证号:%s\n",p->ID);
return p;
}
p=p->Next;
}
printf("未找到该选手!\n");
return NULL;
}
else goto S;
}
void Score_show(R*head)
{
Ra p=Search(head);
if(p!=NULL)
{
if(p->Judge==1) printf("成绩:%d\n",p->Score);
else printf("该选手未检录,无成绩!\n");
}
}
Ra Delete(R*head,Ra*end)
{
Ra tem=NULL;
R*p=Search(head);
if(p!=NULL)
{
Q:printf("确认要删除该选手吗?1.是 2.否");
int j;fflush(stdin);scanf("%d",&j);
if(j==1)
{
tem=p->Next;
if(p==head)//”杀头“
{
free(p);
printf("删除成功!\n");
return tem;
}
p->Front->Next=tem;//缝合,用到了指前的指针(就用这一次)
free(p);
printf("删除成功!\n");
return head;
}
else if(j==2) return head;
else goto Q;
}
}
Ra Final_racer(R*head,int e)
{
Ra p=head;
Ra H=(Ra)calloc(1,sizeof(R));//晋级榜首但是不存数据
Ra h=H;//h指榜尾
Ra ma=NULL;//ma存最高成绩的地址
int i=1;
int max=0;
for(int j=1;j<=3;j++)
{
while(p!=NULL)
{
if(p->Score>=max&&p->Fi!=1)
{
max=p->Score;
ma=p;
}
i++;//此话位置非常关键,决定了边界
if(i>e)//存每组的榜一
{
h->Next=(Ra)calloc(1,sizeof(R));
h=h->Next;
ma->Fi=1;//入榜Fi置1
strcpy(h->Name,ma->Name);
strcpy(h->ID,ma->ID);
strcpy(h->Judgetime,ma->Judgetime);
h->Judge=ma->Judge;
h->Team=ma->Team;
h->Route=ma->Route;
h->Score=ma->Score;
i=1;
max=0;
}
p=p->Next;
}
p=head;max=0;
}
ma=NULL;
for(int j=1;j<=3;j++)//除开分组后的榜三
{
while(p!=NULL)
{
if(p->Score>=max&&p->Fi!=1)
{
max=p->Score;
ma=p;
}
p=p->Next;
}
h->Next=(Ra)calloc(1,sizeof(R));
h=h->Next;
ma->Fi=1;
strcpy(h->Name,ma->Name);
strcpy(h->ID,ma->ID);
strcpy(h->Judgetime,ma->Judgetime);
h->Judge=ma->Judge;
h->Team=ma->Team;
h->Route=ma->Route;
h->Score=ma->Score;
max=0;
p=head;
}
return H->Next;
}
void AllShow(R*head)
{
R*p=head;
int i=1;
while(p!=NULL)
{
printf("第%d位选手:\n",i);
printf("姓名:%s\n",p->Name);
printf("身份证号:%s\n",p->ID);
if(p->Judge==0)printf("是否检录?否\n");
else
{
printf("是否检录?是\n");
printf("检录时间:%s\n",p->Judgetime);
printf("成绩:%d\n",p->Score);
}
printf("组号:%d\n",p->Team);
printf("赛道信息:%d\n",p->Route);
printf("\n");
p=p->Next;
i++;
}
}