📄 多关键字排序.cpp
字号:
#include<iostream>
#include<fstream>
#include<process.h>
using namespace std;
struct info{
int num; //用来存储学号
int yu; //用来存储语文成绩
int shu; //用来存储数学成绩
int ying;//用来存储英语成绩
int sum; //用来存储总分
info*next;//
};
struct xudian{
int x;//用来存储总分
info*y;//用来存储一个学生的信息的节点
};
int N=0;
info* create(void)//创建学生信息链表
{
info*head,*p1,*p2;
head=new info;//生成实体
p1=head;
p2=new info;
ifstream fin("wenjian.txt");
if(!fin)
cout<<"Can not open file!!!!!!!!!!!!!"<<endl;
fin>>p2->num>>p2->yu>>p2->shu>>p2->ying;
p2->sum=p2->yu+p2->shu+p2->ying;
while(p2->num)
{
N++;
p1->next=p2;
p1=p2;
p2=new info;
if(fin.eof())
break;
fin>>p2->num>>p2->yu>>p2->shu>>p2->ying;
p2->sum=p2->yu+p2->shu+p2->ying;
}
free(p2);
p1->next=NULL;
return head;
}
paizongyu(xudian*aa)//按总分为关键字语文为次关键字的排序
{
xudian pingzi;
for(int i=0;i<N;i++)
{
for(int j=i;j<N;j++)
if(aa[i].x<aa[j].x)//总分比较
{
pingzi=aa[i];
aa[i]=aa[j];
aa[j]=pingzi;
}else
if(aa[i].x==aa[j].x&&i!=j)//总分相等
{
if(aa[i].y->yu<aa[j].y->yu)//语文成绩比较
{
pingzi=aa[i];
aa[i]=aa[j];
aa[j]=pingzi;
}
}
}
}
paizongshu(xudian*aa)//按总分为关键字数学为次关键字的排序
{
xudian pingzi;
for(int i=0;i<N;i++)
{
for(int j=i;j<N;j++)
if(aa[i].x<aa[j].x)//总分比较
{
pingzi=aa[i];
aa[i]=aa[j];
aa[j]=pingzi;
}else
if(aa[i].x==aa[j].x&&i!=j)//总分相等
{
if(aa[i].y->shu<aa[j].y->shu)//数学成绩比较
{
pingzi=aa[i];
aa[i]=aa[j];
aa[j]=pingzi;
}
}
}
}
paizongying(xudian*aa)//按总分为关键字英语为次关键字的排序
{
xudian pingzi;
for(int i=0;i<N;i++)
{
for(int j=i;j<N;j++)
if(aa[i].x<aa[j].x)//总分比较
{
pingzi=aa[i];
aa[i]=aa[j];
aa[j]=pingzi;
}else
if(aa[i].x==aa[j].x&&i!=j)//总分相等
{
if(aa[i].y->ying<aa[j].y->ying)//英语成绩比较
{
pingzi=aa[i];
aa[i]=aa[j];
aa[j]=pingzi;
}
}
}
}
int main()
{
xudian*aa;
aa=(xudian*)malloc(N*sizeof(xudian));
info*head,*p;
head=new info;
head=create();//函数调用完毕,生成存储学生信息的链表
int xuanze;
cout<<"请选择排序方式:"<<endl;
cout<<"按总分为主关键字语文为次关键字,请输入 1"<<endl;
cout<<"按总分为主关键字数学为次关键字,请输入 2"<<endl;
cout<<"按总分为主关键字英语为次关键字,请输入 3"<<endl;
cout<<"退出,输入 0"<<endl;
cin>>xuanze;
if(xuanze==0)
exit(0);//退出程序
int biaozhi2=1;
while(xuanze<0||xuanze>3&&biaozhi2)
{
cout<<"输入错误!请重新选择:";
cin>>xuanze;
if(xuanze>=0&&xuanze<4)
biaozhi2=0;
}
p=head->next;
for(int i=0;i<N;i++)//把学生信息链表中的各个节点信放在xudian型的数组aa中
{
aa[i].x=p->sum;
aa[i].y=p;
p=p->next;
}
int biaozhi=1;
while(biaozhi)
{
if(xuanze==1)
{
paizongyu(aa);//按语文为次关键字
cout<<"下面输出按总分为主关键字语文为次关键字的顺序。"<<endl;
}
if(xuanze==2)
{
paizongshu(aa);//按数学为次关键字
cout<<"下面输出按总分为主关键字数学为次关键字的顺序。"<<endl;
}
if(xuanze==3)
{
paizongying(aa);//按英语为次关键字
cout<<"下面输出按总分为主关键字英语为次关键字的顺序。"<<endl;
}
for(int k=0;k<N;k++)
{
cout<<"学号:";
if(aa[k].y->num<10)
cout<<"0000"<<aa[k].y->num;
else
if(aa[k].y->num>9&&aa[k].y->num<100)
cout<<"000"<<aa[k].y->num;
else
if(aa[k].y->num<1000)
cout<<"00"<<aa[k].y->num;
else
if(aa[k].y->num<10000)
cout<<"0"<<aa[k].y->num;
else
cout<<aa[k].y->num;
cout<<" 总分:"<<aa[k].y->sum;
cout<<" 语文"<<aa[k].y->yu<<" 数学"<<aa[k].y->shu<<" 英语"<<aa[k].y->ying<<endl;
}
cout<<"继续选择:";
cin>>xuanze;
biaozhi2=1;
while(xuanze<0||xuanze>4&&biaozhi2)
{
cout<<"输入错误!请重新选择:";
cin>>xuanze;
if(xuanze>=0&&xuanze<4)
biaozhi2=0;
}
if(xuanze==0)
biaozhi=0;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -