[求助]数据结构设计中的个问题
下面是源码我运行的时候到 第三部 输入学生的成绩后,回车就出现 内存不能written的错误
多关键字的排序有其一定的实用范围。例如,在进行高考分数处理时,除了需对总分进行排序外,不同的专业对单科分数的要求不同,因此尚需在总分相同的情况下,按单科分数排出考生录取的次序。
[基本要求]
(1)假设待排序的记录数不超过1000,表中记录的关键字数不超过5,各个关键字的范围均为0-100。按用户给定的关键字的优先关系,输出排序结果。
(2)约定按LSD法进行多关键字的排序。在对各个关键字排序时采用两种策略:其一是利用稳定的内部排序法,其二是利用“分配”和“收集”的方法(如同基数序)。
多关键字排序
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define Null 0
#define r 101
typedef struct node
{
int k[6];
struct node *next;
char name;
}Rnode,*Rlink;
void Radixsort(Rlink F,int gs)/*基数排序*/
{
Rlink p,t,f[r],e[r];
int i,j;
if(F->next==Null)return;
for(i=gs;i>=1;i--)
{
for(j=0;j<=r;j++)
f[j]=Null;
p=F->next;
while(p)
{
j=p->k[i];
if(f[j]==Null)f[j]=p;
else e[j]->next=p;
e[j]=p;
p=p->next;
}
for(j=0;!f[j];j++)
F->next=f[j];
t=e[j];
while(j<r)
{
j++;
if(f[j])
{
t->next=f[j];
t=e[j];
}
}
t->next=Null;
}
}
void Linsertsort(Rnode *L,int i)
{
Rlink p,q,s,u;
p=L->next;
L->next=Null;
while(p)
{
s=L;q=L->next;
while(q&&q->k[i]<=p->k[i])
{
s=q;q=q->next;
}
u=p->next;
p->next=q;
s->next=p;
p=u;
i--;
while(i>=1)
Linsertsort(L,i);
}
}
int initl(Rnode *head)/*建立空表*/
{
head=(Rnode*)malloc(sizeof(Rnode));
if(head==Null)return 0;
head->next=Null;
return 1;
}
int Great(Rnode *head,Rnode a[],int n,int nu)/*建立链表*/
{
Rnode *p,*s;
int j,i;
if(initl(head)==0)return 0;
p=head;
for(j=0;j<=n-1;++j)
{
if((s=(Rnode*)malloc(sizeof(Rnode)))==Null)return 0;
for(i=1;i<=nu;i++)
s->k[i]=a[i].k[i];
s->name=a[i].name;
s->next=Null;
p->next=s;
p=s;
}
return 1;
}
main()
{
int num,i,numb,War;
Rnode b[1000];Rlink LB;
printf("\nPlease choose the way of problem:");/*选择方法*/
scanf("%d",&War);
printf("\nPlease input the number of student(<=1000):");
scanf("%d",&num);
printf("\nPlease input the number of school subject course(<=5):");
scanf("%d",&numb);
for(i=1;i<=num;i++)
{
printf("\nPlease input the name of student%d:",i);
getchar();
scanf("%c",&b[i].name);
if(numb>=1)
{
printf("\nPlease input the first important scorce:");
scanf("%d",&b[i].k[1]);
}
if(numb>=2)
{
printf("\nPlease input the second important scorce:");
scanf("%d",&b[i].k[2]);
}
if(numb>=3)
{
printf("\nPlease input the third important scorce:");
scanf("%d",&b[i].k[3]);
}
if(numb>=4)
{
printf("\nPlease input the fourth important scorce:");
scanf("%d",&b[i].k[4]);
}
if(numb>=5)
{
printf("\nPlease input the fifth important scorce:");
scanf("%d",b[i].k[5]);
}
}
Great(LB,b,num,numb);
while(War==1)
{
Radixsort(LB,numb);
for(i=0;i<num;i++)
{
printf("\nThe result is number %d: %s",i+1,LB->name);
LB=LB->next;
}
}
while(War==2)
{
Linsertsort(LB,numb);
for(i=0;i<num;i++)
{
printf("\nThe result is number %d: %s",i+1,LB->name);
LB=LB->next;
}
}
}