链式基数排序。。。。求大神帮忙。。。
#include<iostream>using namespace std;
#define KEY_SIZE 5
#define RADIX 301
#define LIST_SIZE 1000
typedef int PVector[RADIX];
typedef int KeyType;
typedef struct {
KeyType key[KEY_SIZE];
int next;//下一个的数组下标
}RecordType1;
typedef struct {
RecordType1 r[LIST_SIZE];
int keynum;
int recnum;
}SLinkList;
SLinkList Creat()//接收考生的各科成绩
{
SLinkList *l;
int i=1,k=1;
l=new SLinkList;
l->keynum=5;
l->recnum=3;
for(k=0;k<l->recnum;k++)//判断是否继续输入
{
cout<<"输入考生语文、数学、英语成绩:"<<endl;
cin>>l->r[i].key[1];
cin>>l->r[i].key[2];
cin>>l->r[i].key[3];
l->r[i].key[0]=k+1;//学号
l->r[i].key[4]=(l->r[i].key[1]+l->r[i].key[2]+l->r[i].key[3]);
i++;
}
return *l;
}
void Distribute(RecordType1 *r,int i,PVector head,PVector tail)//以下标为i的关键字为准做一趟分配
{
int j,p;
for(j=0;j<=RADIX-1;++j)
head[j]=0;//各字表初始化为空表
for(p=r[0].next;p;p=r[p].next)
{
j=r[p].key[i];
if(!head[j])
head[j]=p;
else
r[tail[j]].next=p;
tail[j]=p;//将下标p所指的节点插入第j个子表中
}
}
void Collect(RecordType1 *r,PVector head,PVector tail)//做一趟收集
{
int j;
int t;
j=0;
while (head[j]==0 ) /* 找第一个非空队列 */
++j;
r[0].next =head[j];
t=tail[j];
while ( j<RADIX-1 ) /* 寻找并串接所有非空队列 */
{
++j;
while ( (j<RADIX-1 ) && (head[j]==0 ) ) /* 找下一个非空队列 */
++j;
if ( head[j]!=0 ) /* 链接非空队列 */
{
r[t].next =head[j];
t=tail[j];
}
}
r[t].next =0; /* t指向最后一个非空队列中的最后一个结点 */
}
void RadixSort(SLinkList *l,int i)//对*l中的成绩做链式基数排序
{
PVector head;
PVector tail;
for(i=0;i<(l->recnum);i++)
l->r[i].next=i+1;
l->r[l->recnum].next=0;
{
Distribute(l->r,i,head,tail);
Collect(l->r,head,tail);
}
}
void ShowRank(SLinkList *l)//按名次顺序输出考生的名次和分数
{
int rank=1,i;
cout<<"考生名次和分数分别为:"<<endl;
for(i=l->r[0].next;rank<=l->recnum;rank++)
{
cout<<rank<<" "<<l->r[i].key[0]<<" "<<l->r[i].key[1]<<" "<<l->r[i].key[2]<<" "<<l->r[i].key[3]<<" "<<l->r[i].key[4]<<endl;
i=l->r[i].next;
}
}
int main()
{
SLinkList L;
L=Creat();
RadixSort(&L,1);
RadixSort(&L,2);
RadixSort(&L,3);
ShowRank(&L);
return 0;
}
这个为什么不能按想要的关键字排序啊???