首页 > 代码库 > 学生信息的读取与重排
学生信息的读取与重排
有一个记录学生信息的文件,每一行记录一名学生的信息,格式入下 学号 姓名 性别 分数 1 分数 2 分数 3\n.
要求:( 1)读取文件的内容,串成一个链表。
(2)按照总分递减排序将结果保存到原文件.
右键编译项目名->调试->命令行参数里面添加要读取与修改的学生信息文本.
以结构体数组作为载体进行排序与传递
Func.h
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SWAP(a,b){pStud temp;temp=a;a=b;b=temp;}
typedef struct stud{
int num;
int sex;
char name[20];
float score1;
float score2;
float score3;
struct stud* pnext;
}Stud,* pStud;
void scan_fp_list(pStud *,pStud *,FILE *);
float sum_score(pStud *);
void strc_new(pStud *,pStud *);
int compare(const void* ,const void *);
void str_cpy(pStud *,pStud *);
void a_quicksort(pStud *,int ,int );
int partition(pStud* ,int ,int );
List_txet.c
#include"func.h"
void scan_fp_list(pStud *pphead,pStud *pptail,FILE *fp)
{
pStud pnew=(pStud)malloc(sizeof(Stud));
memset(pnew,0,sizeof(Stud));
fscanf(fp,"%d%s%d%f%f%f",&pnew->num,pnew->name,&pnew->sex,&pnew->score1,&pnew->score2,&pnew->score3);
if(*pphead==NULL)
{
*pphead=pnew;
*pptail=pnew;
}else{
pnew->pnext=*pphead;
*pphead=pnew;
}
}
float sum_score(pStud *pphead)
{
return((*pphead)->score1+(*pphead)->score2+(*pphead)->score3);
}
void strc_new(pStud *pphead1,pStud *pptail1)
{
pStud pnew=(pStud)malloc(sizeof(Stud));
memset(pnew,0,sizeof(Stud));
if(*pphead1==NULL)
{
*pphead1=pnew;
*pptail1=pnew;
}else{
pnew->pnext=*pphead1;
*pphead1=pnew;
}
}
void str_cpy(pStud *a,pStud *phead1)
{
int i;
pStud pcur=*phead1;
for(i=4;i>=0;i--,pcur=pcur->pnext)
{
strcpy(pcur->name,a[i]->name);
pcur->num=a[i]->num;
pcur->score1=a[i]->score1;
pcur->score2=a[i]->score2;
pcur->score3=a[i]->score3;
pcur->sex=a[i]->sex;
}
}
int partition(pStud* a,int left,int right)
{
int i,k;
k=left;
for(i=left;i<right;i++)
{
if(sum_score(&a[i])<sum_score(&a[right]))
{
SWAP(a[i],a[k]);
k++;
}
}
SWAP(a[k],a[right]);
return k;
}
void a_quicksort(pStud *a,int left,int right)
{
int pivot;
if(left<right)
{
pivot=partition(a,left,right);
a_quicksort(a,left,pivot-1);
a_quicksort(a,pivot+1,right);
}
}
Main.c
#include"func.h"
int main(int argc,char *argv[])
{
FILE *fp,*fp1;
int i;
int num=5;
pStud phead=NULL,ptail=NULL;
pStud phead1=NULL,ptail1=NULL;
pStud pcur=NULL,pcur1=NULL;
pStud a[5];
fp=fopen(argv[1],"r+");
for(i=0;i<num;i++)
{
scan_fp_list(&phead,&ptail,fp);
}
fclose(fp);
for(i=0;i<5;i++,phead=phead->pnext)
{
a[i]=phead;
}
a_quicksort(a,0,4);
for(i=0;i<5;i++)
{
strc_new(&phead1,&ptail1);
}
str_cpy(a,&phead1);
fp1=fopen(argv[1],"w");
for(i=0;i<num;i++)
{
fprintf(fp1,"%d %s %d %5.2f %5.2f %5.2f\n",phead1->num,phead1->name,phead1->sex,phead1->score1,phead1->score2,phead1->score3);
phead1=phead1->pnext;
}
fclose(fp1);
system("pause");
return 0;
}
学生信息的读取与重排