#include<stdio.h>
#include<string.h> //数组类操作的头文件
#include<stdlib.h>//清屏函数和申请结点函数的头文件
struct singer
{//歌手结构体
char num[6];//编号
char name[20];//姓名
float score[10];//10个成绩
float aver;//平均分
struct singer *next;
}*list,s[30];//结构体数组,结构体指针
struct singer *creat()
{//1.建立歌手链表,给输入歌手编号姓名,并显示
struct singer *p,*pt,*head;
int length,i,flag=1;
while(flag==1)//输入歌手人数,保证在0~30之间
{
printf("输入歌手人数(最多30人):\n");
scanf("%d",&length);
if(length>0&&length<=30)
flag=0;
else
printf("输入不对,人数在0~30之间\n\n");
}//while
printf("==============================================\n\n");
for(i=0;i<length;i++)
{//输入每个歌手的编号和姓名
p=(struct singer*)malloc(sizeof(struct singer));
if(i==0)
head=p;
else
pt->next=p;
pt=p;
printf("请依次输入各个歌手数据\n");
printf("编号:");
scanf("%s",p->num);
printf("姓名:");
scanf("%s",p->name);
}//for
printf("\n已经输入完毕\n");
printf("==============================================\n\n");
p->next=NULL;
p=head;//p指针复位,准备从头输出链表
printf("请核对\n");
printf("----------------\n");
printf("编号 姓名\n");
printf("----------------\n");
while(p!=NULL)
{//从头遍历链表,并输出
printf("%s%6s",p->num,p->name);
printf("\n");
p=p->next;
}//while
printf("----------------\n");
return head;
}
float max(struct singer* x)
{//2.(1)求歌手的最高分数
float max=x->score[0];
for(int i=0;i<10;i++)
if(x->score[i]>max)
max=x->score[i];
return max;
}
float min(struct singer* x)
{//2.(2)求歌手的最低分数
float min=x->score[0];
for(int i=0;i<10;i++)
if(x->score[i]<min)
min=x->score[i];
return min;
}
struct singer* score(struct singer* l)
{//2.给每个歌手输入10个成绩,并显示。算出平均分,仅存储。
int i;
float s=0;//总分计数器
struct singer* p;
p=l;
while(p!=NULL)
{//从头遍历链表
s=0;
printf("编号:%s 姓名:%s\n",p->num,p->name);
for(i=0;i<10;i++)
{
printf("第%d个评委给的分数是:",i+1);
scanf("%f",&p->score[i]);
s=s+p->score[i];//累加总分
}//for
p->aver=(s-max(p)-min(p))/8;//算平均分
p=p->next;
}//while
p=l;//指针p复位,指向第一个歌手
printf("------------------------------------------------------------------------------\n");
printf("编号|姓名|成绩1|成绩2|成绩3|成绩4|成绩5|成绩6|成绩7|成绩8|成绩9|成绩10|平均成绩\n");
printf("------------------------------------------------------------------------------\n");
while(p!=NULL)
{//从头遍历链表
printf("%4s%4s %6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f",p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->score[6],p->score[7],p->score[8],p->score[9],p->aver);
printf("\n");
p=p->next;
}//while
return l;
}
struct singer* paixu(struct singer* l)
{//3.把歌手按平均分排序,并输出排序后的新链表
struct singer* p;struct singer* pt;
p=l;
char temp_1[6];
char temp_2[20];
float temp_3;
float temp_4;
while(p!=NULL)
{
pt=p->next;
while(pt!=NULL)
{
if(p->aver<pt->aver)
{//保证前一个结点比后一个结点大
strcpy(temp_1,p->num);//交换编号
strcpy(p->num,pt->num);
strcpy(pt->num,temp_1);
strcpy(temp_2,p->name);//交换姓名
strcpy(p->name,pt->name);
strcpy(pt->name,temp_2);
for(int i=0;i<3;i++)
{//交换10个分数
temp_3=p->score[i];
p->score[i]=pt->score[i];
pt->score[i]=temp_3;
}//for
temp_4=p->aver;//交换平均分
p->aver=pt->aver;
pt->aver=temp_4;
}//if
pt=pt->next;
}//while
p=p->next;
}//while
p=l;//指针p复位,指向第一个歌手
printf("排序后(从高到低往下排)\n");
printf("------------------------------------------------------------------------------\n");
printf("编号|姓名|成绩1|成绩2|成绩3|成绩4|成绩5|成绩6|成绩7|成绩8|成绩9|成绩10|平均成绩\n");
printf("------------------------------------------------------------------------------\n");
while(p!=NULL)
{//从头遍历链表
printf("%4s%4s %6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f",p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->score[6],p->score[7],p->score[8],p->score[9],p->aver);
printf("\n");
p=p->next;
}
return l;
}
void check(struct singer* l)
{//4.给出歌手的名字或者编号,显示其其他全部数据
struct singer* p=l;
char name[20];
char num[6];
int n;
printf("数据查询\n\n");
printf("按编号查询按1,按姓名查询按2 ");
scanf("%d",&n);
switch(n)
{
case 1:
printf("输入选手编号:");
scanf("%s",num);
while(p!=NULL)
{
if(!strcmp(p->num,num))//strcmp()字符数组整体赋值函数
{
printf("编号|姓名|成绩1|成绩2|成绩3|成绩4|成绩5|成绩6|成绩7|成绩8|成绩9|成绩0|平均成绩\n");
printf("%4s%4s %6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f",p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->score[6],p->score[7],p->score[8],p->score[9],p->aver);
}
p=p->next;
}
break;
case 2:
printf("输入选手姓名:");
scanf("%s",name);
while(p!=NULL)
{
if(!strcmp(p->name,name))//strcmp()字符数组整体赋值函数
{
printf("编号|姓名|成绩1|成绩2|成绩3|成绩4|成绩5|成绩6|成绩7|成绩8|成绩9|成绩10|平均成绩\n");
printf("%4s%4s %6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f",p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->score[6],p->score[7],p->score[8],p->score[9],p->aver);
}
p=p->next;
}
break;
}//switch
}
struct singer* change(struct singer* l)
{//5.先显示现有全部数据,询问要修改
struct singer* p;
char name[20];
char num[6];
int n;
float s;
p=l;
printf("现有歌手数据\n");
printf("------------------------------------------------------------------------------\n");
printf("编号|姓名|成绩1|成绩2|成绩3|成绩4|成绩5|成绩6|成绩7|成绩8|成绩9|成绩10|平均成绩\n");
printf("------------------------------------------------------------------------------\n");
while(p!=NULL)
{
printf("%4s%4s %6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f",p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->score[6],p->score[7],p->score[8],p->score[9],p->aver);
printf("\n");
p=p->next;
}//while//显示现有全部数据
printf("\n\n按编号修改按1,按姓名修改按2 ");
scanf("%d",&n);
switch(n)
{
case 1:
printf("输入选手编号:");
scanf("%s",num);
p=l;//指针p复位,指向第一个歌手
while(p!=NULL)
{
if(!strcmp(p->num,num))
{ s=0;
printf("编号:%s 姓名:%s\n",p->num,p->name);
for(int i=0;i<10;i++)
{
printf("第%d个评委给的分数是:",i+1);
scanf("%f",&p->score[i]);
s=s+p->score[i];
}//for
p->aver=(s-max(p)-min(p))/8;
}
p=p->next;
}
break;
case 2:
printf("输入选手姓名:");
scanf("%s",name);
p=l;//指针p复位,指向第一个歌手
while(p!=NULL)
{
if(!strcmp(p->name,name))
{
s=0;
printf("编号:%s 姓名:%s\n",p->num,p->name);
for(int i=0;i<10;i++)
{
printf("第%d个评委给的分数是:",i+1);
scanf("%f",&p->score[i]);
s=s+p->score[i];
}//for
p->aver=(s-max(p)-min(p))/8;
}
p=p->next;
}
break;
}//switch
return l;
}
void file(struct singer* l)
{//将数据写入文件
FILE *fp=fopen("d:\\歌手比赛系统.txt","w");
struct singer* p;
p=l;
fprintf(fp,"------------------------------------------------------------------------------\n");
fprintf(fp,"编号|姓名|成绩1|成绩2|成绩3|成绩4|成绩5|成绩6|成绩7|成绩8|成绩9|成绩10|平均成绩\n");
fprintf(fp,"------------------------------------------------------------------------------\n");
while(p!=NULL)
{//从头遍历链表
fprintf(fp,"%4s%4s %6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f",p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->sco