已知9名学生的信息,每个学生信息包括编号和姓名。学生信息为11,王红,22,刘军,47,王亮,92,张强,16,吴迪,3,李伟,7,赵磊,29,钱鹤,8,孙芳。用堆排序法实现以编号为排序码的降序排序,然后显示有序的学生信息。要求从文本文件中读取学生信息(相邻数据间用空白符分隔,且姓名不含有空白符)。
文本文件编写
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
int sno;
char name[10];
}student;
void shaixuan(student s[],int f,int e)
{
int i,j;
student rc;
rc=s[f];
i=f;
for(j=2*i;j<=e;j=2*j)
{
if(j<e&&s[j].sno>s[j+1].sno)
j++;
if(rc.sno<s[j].sno) break;
s[i]=s[j];i=j;
}
s[i]=rc;
}
void duipai(student s[],int n)
{
int i;
for(i=n/2;i>0;i--)
shaixuan(s,i,n);
for(i=n;i>1;i--)
{
s[0]=s[1];s[1]=s[i];s[i]=s[0];
shaixuan(s,1,i-1);
}
}
int main()
{
int i=1;
char c;
char filename[80];
FILE *fp;
student s[10];
puts("请输入文本文件地址:");
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("文件打开失败!\n");
return 0;
}
while(!feof(fp))
{
fscanf(fp,"%d %s ",&s[i].sno,&s[i++].name);
}
fclose(fp);
printf("堆排序前:\n");
for(i=1;i<10;i++)
{
printf("%d %s,",s[i].sno,s[i].name);
}
duipai(s,9);
printf("\n堆排序后:\n");
for(i=1;i<10;i++)
{
printf("%d %s,",s[i].sno,s[i].name);
}
return 0;
}
输出结果为