资源简介

利用多关键字排序进行高考分数处理,除了需对总分进行排序外,不同的专业对单科分数的要求不同,因此在总分相同的情况下,按用户提出的单科分数的次序要求排出考生录取的次序。 假设待排序的记录数不超过1000,表中记录的关键字数不超过5,各个关键字的范围均为0至100。按用户给定的进行排序的关键字的优先关系,输出排序结果。

资源截图

代码片段和文件信息

#include
#include
#include  //时间函数头文件

#define MAX_NUM_OF_KEY 5 //关键字项数的最大值
#define RADIX 101 //关键字基数
#define MAX_SPACE 1000
#define HEADER1 “     **************学生成绩表******************\n“
#define HEADER2 “     | 名次 | 总分 | 数学 | 英语 | 语文 | 理综 |\n“
#define HEADER3 “     |------|------|------|------|------|------|\n“
int j[4]={4444};

typedef struct{
int keys[MAX_NUM_OF_KEY]; //关键字
int next; //下一个的数组下标
}SLCell;
typedef struct{
SLCell r[MAX_SPACE]; //静态链表的可利用空间,r[0]为头结点
int keynum; //记录的当前关键字个数
int recnum; //记录的个数
}SLList;

SLList Creat() //接收考生的各科成绩
{
SLList *l;
int i=1k=1;
l=(SLList*)malloc(sizeof(SLList));
l->keynum=5;
l->recnum=0;
while(k==1) //判断是否继续输入
{
printf(“请输入学生数学、英语、语文、理综分数\n“);
scanf(“%d %d %d %d“&(l->r[i].keys[1])&(l->r[i].keys[2])&(l->r[i].keys[3])&(l->r[i].keys[4]));
l->r[i].keys[0]=(l->r[i].keys[1]+l->r[i].keys[2]+l->r[i].keys[3]+l->r[i].keys[4]); //总分 
(l->recnum)++;
printf(“继续输入考生成绩则输入1,否则输入0\n“);
scanf(“%d“&k);
i++;
}
return *l;
}

void BubbleSort(SLList &lint key[]) //LSD冒泡法排序
{
int yijk;
    SLCell R;
for(k=3;k>=0;k--) //根据给出的关键字顺序按LSD法对各科成绩进行排序                  
{
i=key[k];
for(y=0;y for(j=1;j {
if(l.r[j].keys[i] {
R=l.r[j];
l.r[j]=l.r[j+1];
l.r[j+1]=R;
}
}
}
for(y=0;y for(j=1;j {
if(l.r[j].keys[0] {
R=l.r[j];
l.r[j]=l.r[j+1];
l.r[j+1]=R;
}
}
for(i=0;i<=l.recnum;i++) 
l.r[i].next=i+1;
l.r[l.recnum+1].next=0; //将l改造为静态链表
}


void Distribute(SLCell *rint iint *fint *e)
//以下标为i的关键字为准做一趟分配:按第i个关键字keys[i]建立RADIX个子表,使同一子表中记录的keys[i]相同
{
int jp;
for(j=RADIX-1;j>=0;--j) f[j]=0; //各字表初始化为空表
for(p=r[0].next;p;p=r[p].next)
{
j=r[p].keys[i];
if(!f[j]) f[j]=p;
else r[e[j]].next=p;
e[j]=p; //将下标p所指的节点插入第j个子表中
}
}

void Collect(SLCell *rint iint *fint *e)
//做一趟收集:按keys[i]自小到大地将各子表依次链接成一个链表
{
int jt;
for(j=RADIX-1;!f[j];j--); //找第一个非空子表
r[0].next=f[j]; //r[0].next指向第一个非空子表中的第一个结点
t=e[j];
while(j>=0){
for(j--;j>0&&!f[j];j--); //找下一个非空子表
if(f[j]&&j>=0){r[t].next=f[j];t=e[j];} //链接两个非空子表
}
r[t].next=0; //t指向最后一个非空子表中的最后一个结点
}

void RadixSort(SLList *l) //对*l中的成绩做链式基数排序
{
int f[101]e[101]; //f[i]和e[i]分别为第i个队列的头指针和尾指针
int i;
for(i=0;i<(l->recnum);i++) 
l->r[i].next=i+1;
l->r[l->recnum].next=0; //将l改造为静态链表
for(i=3;i>=0;--i) //按最低位优先依次对各关键字进行分配和收集 
{
Distribute(l->rj[i]fe); //第i趟分配
Collect(l->rj[i]fe); //第i趟收集
}
}

void ShowRank(SLList *l) //按名次顺序输出考生的名次和分数
{
int rank=1i; //名次
printf(“考生名次和分数分别为:\n\n\n\n“);
printf(HEADER1); //格式输出
printf(HEADER3);
printf(HEADER2);
printf(HEADER3);
for(i=l->r[0].next;rank<=l->recnum;rank++)
{
printf(“ 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     213038  2011-03-10 21:31  多关键字排序\Debug\DisCol.exe

     文件     203320  2011-03-10 21:31  多关键字排序\Debug\DisCol.ilk

     文件      13261  2011-03-10 21:31  多关键字排序\Debug\DisCol.obj

    I.A....    223764  2011-03-10 21:31  多关键字排序\Debug\DisCol.pch

     文件     476160  2011-03-10 21:31  多关键字排序\Debug\DisCol.pdb

     文件      50176  2011-03-10 21:33  多关键字排序\Debug\vc60.idb

     文件      53248  2011-03-10 21:31  多关键字排序\Debug\vc60.pdb

     文件       5142  2011-03-10 21:20  多关键字排序\DisCol.cpp

     文件       3401  2011-03-09 22:01  多关键字排序\DisCol.dsp

     文件        518  2011-03-09 22:02  多关键字排序\DisCol.dsw

     文件      50176  2011-03-10 22:39  多关键字排序\DisCol.ncb

     文件      53760  2011-03-10 22:39  多关键字排序\DisCol.opt

     文件        746  2011-03-10 21:31  多关键字排序\DisCol.plg

     文件     100352  2011-03-10 22:51  多关键字排序\付乐颖——数据结构课程设计.doc

     目录          0  2011-03-10 21:31  多关键字排序\Debug

     目录          0  2011-03-10 22:53  多关键字排序

----------- ---------  ---------- -----  ----

              1447062                    16


评论

共有 条评论