码迷,mamicode.com
首页 > 其他好文 > 详细

学生信息的读取与重排

时间:2017-01-14 10:16:50      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:ret   const   ems   rcp   行记录   bsp   compare   com   amp   

有一个记录学生信息的文件,每一行记录一名学生的信息,格式入下 学号   姓名   性别   分数 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;

}

学生信息的读取与重排

标签:ret   const   ems   rcp   行记录   bsp   compare   com   amp   

原文地址:http://www.cnblogs.com/whsll/p/6284693.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!