按你要求写了一个, 只简单测试过, 可能还有很多问题,如果有问题联系我q48824304. 需要的话我可以把代码发给你,贴在这里看实在不方便
#include
using namespace std;
int weight[10]={15,12,9,7,6,5,4,3,2,1};
class athlete //这个类是运动员的信息
{
public:
int num; //运动员编号
int votenum; //运动员票数
int point; // 得分
}ath[101];
class vote //这个类是选票信息
{
public:
int score[10]; // 10个运动员编号...名字起错了 改成athnum比较好
vote* next;
};
void del_vote(vote* p) // 删除的是p的下一个节点,不是p 注意.
{ // 此函数用在check()函数里.
vote* q;
q=p->next->next;
delete p->next;
p->next=q;
}
void check(vote* pvotelist) // check()函数在这里~
{
vote* p;
for(p=pvotelist;p->next!=null,p!=null;p=p->next) // 检查节点p的下一个节点中选票数据是否有效.
{
for(int i=0;i<10;i++)
{
if(p->next->score[i]<0 || p->next->score[i]>100) {del_vote(p);break;} // 有超出范围者,删除p的下一个节点.
for(int j=i-1;j>=0;j--) // 有与前面数据相同者,删除......
{
if(p->next->score[i]==p->next->score[j])
{
del_vote(p);
break;
}
}
}
}
}
void sort(athlete ath[101]) //运动员排序 找出前10名.
{
int i,j;
athlete temp;
for(i=1;i<=10;i++)
for(j=i+1;j<=100;j++)
{
if(ath[i].point < ath[j].point) //分高在前
{
temp=ath[i];
ath[i]=ath[j];
ath[j]=temp;
}
else if(ath[i].point == ath[j].point)
{
if(ath[i].votenum < ath[i].votenum) //分相等,票多在前
{
temp=ath[i];
ath[i]=ath[j];
ath[j]=temp;
}
else if(ath[i].votenum == ath[i].votenum)
{
if(ath[i].num
{
temp=ath[i];
ath[i]=ath[j];
ath[j]=temp;
}
}
}
}
}
void count(vote* pvotelist) // 此时选票全部为合理选票,开始统计
{
for(int i=0;i<101;i++) // 对运动员数组初始化.
{
ath[i].votenum=ath[i].point=0;
ath[i].num=i;
}
vote* p;
for(p=pvotelist->next;p!=null;p=p->next) //对选票进行统计
{
for(int i=0;i<10;i++)
{
if(p->score[i])
{
ath[p->score[i]].votenum++; // 对应运动员票数+1.
ath[p->score[i]].point+=weight[i]; // 分数则为加上该名次所对应的加分.
}
}
}
sort(ath); //运动员得分排序
cout<
for(int i=1;i<=10;i++)
printf("%2d %3d %6d %3d\n",i,ath[i].num,ath[i].point,ath[i].votenum);
system("pause");
}
int main()
{
vote *pvotelist,*p;
pvotelist =new vote; // pvotelist是选票链表的头结点,不存放数据.
p=new vote;
pvotelist->next=p; // 从第二个节点开始存放每张选票.
p->next=null;
int i=0;
cin>>p->score[i]; // 开始读入选票的数据,score等类型的成员意义见上面类定义中.
while(p->score[i]!=-1)
{
i=(i+1)%10;
if(i==0) // 每当一张选票写上10个数据之后,创建一张新选票.
{
p->next=new vote;
p=p->next;
p->next=null;
}
cin>>p->score[i];
}
p->next=null;
check(pvotelist);
count(pvotelist);
}