初始化录入,我就录入3个学院做测试。你像录入更多,自己修改初始化函数init的变量n初值就好了。
另外,我没有写输入验证,该输入数字的地方不要输其他无关字符。想验证你可以在我的scanf那里加验证。
#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct race
{
char sName[50]//学院名称
char pName[50]//项目名称
int rank//项目名次
struct race *next
}RACE
void pfList(RACE *raceHead)//打印链表信息
int init(RACE **raceHead,RACE **raceTail)//初始化链表,成功返回1,失败返回0
int CreatList(RACE **raceHead,RACE **raceTail)//成功返回1,失败返回0
void tjs(RACE *raceHead)//统计学院参加项目数,及所有名次为第一名的信息
void delByP(RACE *raceHead,RACE **raceTail)//根据项目删除所有节点
int main()
{
RACE *raceHead=NULL,*raceTail=NULL
if(!init(&raceHead,&raceTail))
{
printf("程序异常终止!\n")
return 1
}
pfList(raceHead)
tjs(raceHead)
delByP(raceHead,&raceTail)
printf("删除后链表信息:\n")
pfList(raceHead)
return 0
}
int init(RACE **raceHead,RACE **raceTail)//初始化链表,成功返回1,失败返回0
{
int n=3//初始化3个学院的信息
while(n--)
if(!CreatList(raceHead,raceTail))
return 0
return 1
}
void pfList(RACE *raceHead)//打印链表信息
{
printf("\n当前链表信息:\n")
while(raceHead->next)
{
printf("学院名:%s\n",raceHead->next->sName)
printf("--项目:%s\n",raceHead->next->pName)
printf("--名次:%d\n",raceHead->next->rank)
raceHead=raceHead->next
}
}
int CreatList(RACE **raceHead,RACE **raceTail)//成功返回1,失败返回0
{
int rank
char sname[50],pname[50]
RACE *raceNew=NULL
if(!*raceHead)
{
*raceHead=(RACE *)malloc(sizeof(RACE))
if(!*raceHead)
return 0
(*raceHead)->next=NULL
}
printf("请输入参赛的学院名称:")
scanf("%s",sname)
printf("请输入参加的所有项目及名次(输入EXIT -1结束输入):\n")
while(1)
{
scanf("%s%d",pname,&rank)
if(strcmp(pname,"EXIT")==0)
break
raceNew=(RACE *)malloc(sizeof(RACE))
if(!raceNew)return 0
strcpy(raceNew->sName,sname)
strcpy(raceNew->pName,pname)
raceNew->rank=rank
raceNew->next=NULL
if(!(*raceHead)->next)
(*raceHead)->next=raceNew
else
(*raceTail)->next=raceNew
*raceTail=raceNew
}
return 1
}
void tjs(RACE *raceHead)//统计学院参加项目数,及所有名次为第一名的信息
{
int cnt=0
char sname[50]
printf("\n--统计学院参加项目数,及所有名次为第一名的信息--\n 输入要统计的学院名字:")
scanf("%s",sname)
printf("学院:%s在本次比赛中获得第一名的项目有:\n",sname)
while(raceHead->next)
{
if(strcmp(raceHead->next->sName,sname)==0)
{
if(raceHead->next->rank==1)
printf("--项目:%s\n",raceHead->next->pName)
cnt++
}
raceHead=raceHead->next
}
printf("学院%s共参加的项目数量为: %d\n",sname,cnt)
}
void delByP(RACE *raceHead,RACE **raceTail)//根据项目删除所有节点
{
RACE *raceLast=raceHead,*raceSave=raceHead,*del=NULL
char pname[50]
printf("\n---根据项目删除所有节点---\n 输入要删除的项目名称:")
scanf("%s",pname)
while(raceHead->next)
{
if(strcmp(raceHead->next->pName,pname)==0)
{
del=raceHead->next
raceLast->next=del->next
free(del)
raceLast=raceSave
raceHead=raceSave
continue
}
raceHead=raceLast->next
raceLast=raceLast->next
}
*raceTail=raceLast
}
#include <iostream>using namespace std
int main()
{
medal()
int No,g,s,b
int Tg=0,Ts=0,Tb=0
int maxGoldenNo=-1,bestP=-1
char flag
while(true)
{
cout<<"请输入运动员编号:"<<endl
cin>>No
cout<<"请输入该运动员金牌数:"<<endl
cin>>g
Tg+=g
cout<<"请输入该运动员银牌数:"<<endl
cin>>s
Ts+=s
cout<<"请输入该运动员铜牌数:"<<endl
cin>>b
Tb+=b
if(maxGoldenNo<g)
{bestP=NomaxGoldenNo=g}
cout<<"按q结束,按回车录入下一个运动员"<<endl
flag=getch()
if(flag=='q')
break
}
cout<<"总金牌数:"<<Tg<<endl
cout<<"总银牌数:"<<Ts<<endl
cout<<"总铜牌数:"<<Tb<<endl
cout<<"最佳运动员"<<bestP<<endl
}