博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用qsort对结构体指针数组根据compare规则进行排序
阅读量:2433 次
发布时间:2019-05-10

本文共 2457 字,大约阅读时间需要 8 分钟。

有一个记录学生信息的文件,每一行记录一名学生的信息,格式如下:

学号\t 姓名\t 性别\t 分数 1\t 分数 2\t 分数 3\n.
要求:
(1) 读取文件的内容, 串成一个链表。
(2) 按照总分递减排序将结果保存到原文件
(3)使用命令行参数读取文件

#define _CRT_SECURE_NO_WARNINGS#define USR_NAME_LEN 20#define N 10#include 
#include
#include
typedef struct student{
int usr_id; char usr_name[USR_NAME_LEN]; int gender; double course_score_1; double course_score_2; double course_score_3; struct student* pNext;}Student_t, *pStudent_t;int compare(const void* p1, const void* p2){
pStudent_t* ptr1 = (pStudent_t*)p1; pStudent_t* ptr2 = (pStudent_t*)p2; if (((*ptr1)->course_score_1 + (*ptr1)->course_score_2 + (*ptr1)->course_score_3) >((*ptr2)->course_score_1 + (*ptr2)->course_score_2 + (*ptr2)->course_score_3)) {
return 1; } else {
return 0; }}int main(int argc, char** argv){
FILE* fp; pStudent_t phead = NULL; int cnt = 0; if (argc != 2) {
printf("error args\n"); return -1; system("pause"); } fp = fopen(argv[1], "r+"); if (NULL == fp) {
perror("fopen"); return -1; } pStudent_t tmp = (pStudent_t)calloc(1, sizeof(Student_t)); while ((fscanf(fp, "%d\t%s\t%d\t%lf\t%lf\t%lf\n", &tmp->usr_id, tmp->usr_name,&tmp->gender,&tmp->course_score_1, &tmp->course_score_2, &tmp->course_score_3)) == 6) {
pStudent_t pnew = (pStudent_t)calloc(1, sizeof(Student_t)); pnew->usr_id = tmp->usr_id; strcpy(pnew->usr_name, tmp->usr_name); pnew->gender = tmp->gender; pnew->course_score_1 = tmp->course_score_1; pnew->course_score_2 = tmp->course_score_2; pnew->course_score_3 = tmp->course_score_3; if (phead == NULL) {
phead = pnew; } else {
pStudent_t ppreNode = phead; pStudent_t pcurNode = phead; while (pcurNode) {
ppreNode = pcurNode; pcurNode = pcurNode->pNext; } ppreNode->pNext = pnew; pnew->pNext = NULL; } cnt++; } fclose(fp); pStudent_t* pArr = (pStudent_t*)calloc(cnt, sizeof(pStudent_t)); pStudent_t pCur = phead; for (int i = 0; i < cnt; i++) {
pArr[i] = pCur; pCur = pCur->pNext; } pCur = NULL; qsort(pArr, cnt, sizeof(pStudent_t), compare); fp = fopen(argv[1], "w+"); if (NULL == fp) {
perror("fopen"); return -1; } for (int i = 0; i < cnt; i++) {
fprintf(fp, "%d\t%s\t%d\t%f\t%f\t%f\n", pArr[i]->usr_id, pArr[i]->usr_name, pArr[i]->gender,pArr[i]->course_score_1, pArr[i]->course_score_2, pArr[i]->course_score_3); } fclose(fp); while (phead != NULL) {
pCur = phead; phead = phead->pNext; free(pCur); pCur = NULL; } free(pArr); system("pause"); return 0;}

转载地址:http://yaxmb.baihongyu.com/

你可能感兴趣的文章
通过Form表单一次性拿到json格式数据,及后台接收
查看>>
## EL表达式与JSTL标签用法解读
查看>>
Mybatis异常:The content of elements must consist of well-formed.......(一般出现在写分页/带大于小于号的SQL)
查看>>
Mybatis光速入门(配置文件模块)
查看>>
关于Oracle的主键自增如何设置
查看>>
手撕HashMap的resize()方法源码渗透解析+图解
查看>>
Mybatis常见异常类型Could not set parameters for mapping离不开这个原因!
查看>>
Thymeleaf中一个页面怎么嵌套另一个页面,关于页面嵌套,标签告诉你应该知道的
查看>>
JAVA如何实现短信验证码--阿里云接口,新手式图文教学,个人项目有这一篇就够了
查看>>
Java中大小数BigDecimal的加减乘除用法及场景的详细介绍,看完不信你还会报Syntax error on token “+/-/*“, invalid AssignmentOperat异常
查看>>
UVa 10917 Dijkstra
查看>>
CF403B/CF402D
查看>>
CF402E / 403C
查看>>
cf404b
查看>>
cf404c
查看>>
cf404d
查看>>
武大网络预赛 Problem 1537 - A - Stones I
查看>>
武大网络预赛 Problem 1545 - I - Twenty-four
查看>>
ZOJ Problem Set - 3772 Calculate the Function 矩阵+线段树
查看>>
ZOJ Problem Set - 3768 Continuous Login
查看>>