看一下有什么问题
#include#include
#include
char top[50]; //成绩文件顶部的标题用top保存
typedef struct student //单个学生成绩的记录
{
char name[10]; //姓名
int number; //学号
int chinese; //语 文
int math; //数学
int english; //英语
struct student *next;
}student,*gradelist;
gradelist fileread(const char *adress) //读取成绩文件
{
FILE *fp=fopen(adress,"r");
if(fp==NULL) //打开文件
{
printf("文件打开出错");
exit(0);
}
gradelist file=(student *)malloc(sizeof(student)); //申请空间
file->next=NULL;
student *p=file; //操作指针
int n=0; //循环标记,具体作用是在第一次循环时方便处理标题
while(!feof(fp))
{
if(n==0)
{
fgets(top,50,fp); //处理标题,并且文件指针移到第二行
}
if(n==1) //申请空间
{
(p->next)=(student *)malloc(sizeof(student));
p=p->next;
p->next=NULL;
}
fscanf(fp,"%s%d%d%d%d",p->name,&p->number,&p->chinese,&p->math,&p->english); //将文件的数据输入到链表中
n=1;
}
if(fclose(fp)) //关闭文件
{
printf("文件关闭失败");
exit(0);
}
return file;
}
void FilePrint(gradelist file) //将成绩文件打印到屏幕上
{
student *p=file;
printf("%s\n",top); //打印标题
while(p->next!=NULL)
{
printf("%6s %2d %d %d %d\n",p->name,p->number,p->chinese,p->math,p->english); //循环打印
p=p->next;
}
}
void merger() //合并文件
{
gradelist file1=fileread("1.txt"),file2=fileread("2.txt");
FILE *fp=fopen("3.txt","w+");
if(fp==NULL) //先新建一个3.txt,然后将1.txt和2.txt的内容输入到里面
{
printf("合并成绩文档失败,原因:建立文档出错");
exit(0);
}
student *p1=file1,*p2=file2;
fprintf(fp,"%s",top); //先输入标题
while(p1->next!=NULL)
{
fprintf(fp,"%6s %2d %d %d %d\n",p1->name,p1->number,p1->chinese,p1->math,p1->english); //输入1.txt
p1=p1->next;
}
while(p2->next!=NULL)
{
fprintf(fp,"%6s %2d %d %d %d\n",p2->name,p2->number,p2->chinese,p2->math,p2->english); //输入2.txt
p2=p2->next;
}
if(fclose(fp))
{
printf("文件关闭失败");
exit(0);
}
}
void extract() //抽取补考的成绩记录
{
FILE *fp=fopen("4.txt","w+");
if(fp==NULL) //新建文件4.txt
{
printf("抽取补考学生成绩记录建立新文件失败");
exit(0);
}
gradelist file3=fileread("3.txt");
student *p=file3;
fprintf(fp,"%s",top); //先输入标题
while(p->next!=NULL)
{
if((p->chinese)<60||(p->math)<60||(p->english)<60) //补考条件
{
fprintf(fp,"%6s %2d %d %d %d\n",p->name,p->number,p->chinese,p->math,p->english);
}
p=p->next;
}
if(fclose(fp))
{
printf("文件关闭失败");
exit(0);
}
}
void sort(int i)
{
gradelist file3=fileread("3.txt"); //先将3.txt读入链表
student *p=file3;
if(remove("3.txt")) //由于排序后的内容也要保存到3.txt,故删除3.txt
{
printf("删除文件出错");
exit(0);
}
int n=0; //学生个数
FILE *fp;
if((fp=fopen("3.txt","w+"))==NULL) //新建一个空的3.txt
{
printf("新建文件出错");
exit(0);
}
fprintf(fp,"%s",top); //标题先输入
while(p->next!=NULL)
{
n++;
p=p->next;
}
typedef struct //链表不容易操作,故而新建一个结构数组
{
int totalgrade;
char name[10];
int number;
int chinese;
int math;
int english;
}gradenote; //成绩记录
typedef struct
{
gradenote r[100]; //初始化了100了空间
}grade_list; //待排序成绩表
grade_list L;
p=file3;
for(int t=1;t<=n;t++,p=p->next) //将链表的内容复制到结构数组里
{
strcpy(L.r[t].name,p->name);
L.r[t].number=p->number;
L.r[t].chinese=p->chinese;
L.r[t].math=p->math;
L.r[t].english=p->english;
L.r[t].totalgrade=p->chinese+p->math+p->english;
}
if(i==1) //直接插入排序,具体思想参考《数据结构》,严蔚敏主编
{
for(int k=2;k<=n;++k)
{
if(L.r[k].totalgrade