【问题描述】:假设一个链表中包含了一个班级内所有学生的信息,每个结点含有以下
数据域:学号、姓名、各门课成绩以及平均分(假定所有的分数均为0-100的整数),设计程序用箱排序对指定的成绩排序,并输出排序结果。
【基本要求】:
(1)每个箱子(0-100)描述成一个链表;
(2)能够从欲排序链表的首部开始,逐个删除每个结点,并把所删除的结点放入适当的箱子中。
(3)收集并链接每个箱子中的结点,产生一个排序的链表并输出结果。
哪位大虾帮帮我~马上就要交了~谢了哈~
#include<stdio.h>
#include<stdlib.h>
#define Max 101
typedef struct List
{
int number;
int Chinese;
int English;
int Match;
}SeqList;
typedef struct Link
{
SeqList chest[Max];
int length;
}LinkList;
LinkList *CreatChest()
{
LinkList *Q;
int i;
Q=(LinkList*)malloc(sizeof(LinkList));
for(i=1;i<101;i++)
{
Q->chest[i].number=i;
Q->chest[i].Chinese=rand()%100;
Q->chest[i].English=rand()%100;
Q->chest[i].Match=rand()%100;
}
Q->length=i;
return Q;
}
void print(LinkList *Q,int x)
{
int i;
for(i=1;i<Q->length;i++)
{
printf("%3d",Q->chest[i].number);
switch(x)
{
case 1:printf("%4d",Q->chest[i].Chinese);break;
case 2:printf("%4d",Q->chest[i].English);break;
case 3:printf("%4d",Q->chest[i].Match);break;
}
printf("\n");
}
}
void ArrangementScore(LinkList *Q,int x)
{
int i,j;
switch(x)
{
case 1:for(i=2;i<Q->length;i++)
{
if(Q->chest[i].Chinese<Q->chest[i-1].Chinese)
{
Q->chest[0].Chinese=Q->chest[i].Chinese;
for(j=i-1;Q->chest[0].Chinese<Q->chest[j].Chinese;j--)
{
Q->chest[j+1]=Q->chest[j];
Q->chest[j]=Q->chest[0];
}
}
}break;
case 2:for(i=2;i<Q->length;i++)
{
if(Q->chest[i].English<Q->chest[i-1].English)
{
Q->chest[0].Chinese=Q->chest[i].Chinese;
for(j=i-1;Q->chest[0].English<Q->chest[j].English;j--)
{
Q->chest[j+1]=Q->chest[j];
Q->chest[j]=Q->chest[0];
}
}
}break;
case 3:for(i=2;i<Q->length;i++)
{
if(Q->chest[i].Match<Q->chest[i-1].Match)
{
Q->chest[0].Match=Q->chest[i].Match;
for(j=i-1;Q->chest[0].Match<Q->chest[j].Match;j--)
{
Q->chest[j+1]=Q->chest[j];
Q->chest[j]=Q->chest[0];
}
}
}break;
}
}
void main()
{
int x;
LinkList *Q;
Q=CreatChest();
printf("\n请输入查询项目:语文1,英语2,数学3\n");
scanf("%d",&x);
ArrangementScore(Q,x);
print(Q,x);
}
我试着写了以下,排序时但有错误,可能对题理解的不够清楚.
2楼你写的不叫箱排序...
箱排序要借助箱子,把东西按下标往箱子里面填东西。并不是如你所写的。
建议再去好好学学数据结构,按着你的程序修改了,
下面的程序并没有对箱子收集到原数组中,直接按顺序打印出来。
[CODE]#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5
typedef struct SUBJECT
{
int number;
int Chinese;
int English;
int Math;
double average;
}Subject;
typedef struct NODE
{
Subject sub;
struct NODE *next;
}Node;
typedef struct
{
Node *head[101];
}chest;
chest Chest;
void insert(int index,Subject info)
{
Node *p=(Node *)malloc(sizeof(Node));
p->sub=info;
p->next=Chest.head[index]->next;
Chest.head[index]->next=p;
}
int main()
{
Subject subject[N];
int i,selection;
srand(time(NULL));
for(i=0;i<101;Chest.head[i]=(Node *)malloc(sizeof(Node)),Chest.head[i]->next=NULL,i++);
for(i=0;i<N;i++)
{
subject[i].number=i+1;
subject[i].Chinese=rand()%101;
subject[i].English=rand()%101;
subject[i].Math=rand()%101;
subject[i].average=(subject[i].Chinese+subject[i].English+subject[i].Math)/3.;
}
printf("想按什么排序:语文1,英语2,数学3\n");
scanf("%d",&selection);
switch(selection)
{
case 1:
for(i=0;i<N;i++)
insert(subject[i].Chinese,subject[i]);
break;
case 2:
for(i=0;i<N;i++)
insert(subject[i].English,subject[i]);
break;
case 3:
for(i=0;i<N;i++)
insert(subject[i].Math,subject[i]);
break;
}
for(i=0;i<101;i++)
{
Node *p=Chest.head[i]->next;
while(p)
{
printf("%04d ",p->sub.number);
printf("%4d",p->sub.Chinese);
printf("%4d",p->sub.English);
printf("%4d ",p->sub.Math);
printf("%.1lf\n",p->sub.average);
p=p->next;
}
}
return 0;
}[/CODE]