⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 多关键字排序.cpp

📁 数据结构课程设计——多关键字排序问题 希望大家用得着
💻 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 + -