题目描述
每次期末考试成绩出来之前的一段时间大豪哥心里都是痛苦的,总感觉自己会在班上排名特别差。所以当成绩出来以后大豪哥想快点知道班上的总排名,以便知道自己的排名。(PS:大豪哥班上有个学霸名叫日天,又名泰迪,不要问我为什么,因为泰迪的行为决定的)
输入
多组测试数据,至文件结尾。
先输入每个班上有n个同学,这个学期有m门课程(1<=n,m<=100)
接下来有n行,每行的输入格式为学号id,姓名name,课程成绩k1,课程成绩k2... ,课程成绩km.(学号在int型范围以内,0<=ki<=100,姓名长度在20个字符以下)
输出
输出班上每个同学排名,并输出总分及排名(如果总分相同就按学号从小到大输出,但是排名还是相同的)输出格式见样例
样例输入
4 4
1 Taidi 100 100 90 90
2 Dahaoge 60 60 70 60
3 Yeshen 90 90 100 100
4 Wangpangzi 50 60 100 80
样例输出
1 Taidi 100 100 90 90 Sum = 380 Ranking = 1
3 Yeshen 90 90 100 100 Sum = 380 Ranking = 1
4 Wangpangzi 50 60 100 80 Sum = 290 Ranking = 3
2 Dahaoge 60 60 70 60 Sum = 250 Ranking = 4
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 //创建STUDENT类型变量 包括学号、姓名、数学, 英语, 语文的成绩 6 typedef struct student { 7 int id; 8 char name[50]; 9 int score[100]; 10 11 struct student *pNext; 12 }STUDENT; 13 //创建链表 14 STUDENT *Create(int n,int m) { 15 STUDENT *pHead, *pEnd, *pNew = NULL; 16 int i,j; 17 pHead = pEnd = (STUDENT*)malloc(sizeof(STUDENT)); 18 for (i = 0; i < n; i++) 19 { 20 pNew = (STUDENT*)malloc(sizeof(STUDENT)); 21 scanf("%d%s", &pNew->id, pNew->name); 22 for(j=0;j<m;j++) 23 { 24 scanf("%d", &pNew->score[j]); 25 } 26 27 pEnd->pNext = pNew; 28 pEnd = pNew; 29 30 } 31 return pHead; 32 } 33 34 //寻找前驱节点 35 STUDENT *Find_before(STUDENT* phead, STUDENT* p) 36 { 37 if (!p) return NULL; 38 STUDENT *pbefore = phead; 39 while (pbefore) 40 { 41 if (pbefore->pNext == p) 42 return pbefore; 43 pbefore = pbefore->pNext; 44 } 45 return NULL; 46 } 47 int sumscore(STUDENT *p, int m) { 48 int i,sum=0; 49 50 for(i=0;i<m;i++) 51 { 52 53 sum += p->score[i]; 54 } 55 return sum; 56 } 57 58 void Sort(STUDENT *head, int n, int m) { 59 STUDENT *pHead, *pEnd, *q = NULL, *qbefore = NULL, *p = NULL; 60 int maxsumscore, minid; 61 pHead = pEnd = (STUDENT*)malloc(sizeof(STUDENT)); 62 while (head->pNext != NULL) 63 { 64 maxsumscore = sumscore(head->pNext, m); 65 minid = head->pNext->id; 66 q = p = head->pNext; 67 //寻找最高总分且最小学号的节点 68 while (p->pNext != NULL) 69 { 70 if (maxsumscore < sumscore(p->pNext,m)) 71 { 72 maxsumscore = sumscore(p->pNext, m); minid = p->pNext->id; q = p->pNext; 73 } 74 if ((maxsumscore == sumscore(p->pNext,m) ) && (minid > p->pNext->id)) 75 { 76 maxsumscore = sumscore(p->pNext, m); minid = p->pNext->id; q = p->pNext; 77 } 78 p = p->pNext; 79 } 80 qbefore = Find_before(head, q); //寻找q节点的前驱节点 81 qbefore->pNext = q->pNext; //将q的前驱节点指向q的后驱节点 从而将q节点从a链表中剔除 82 83 pEnd->pNext = q; //将头指针指向q 84 q->pNext = NULL; //q节点指向空 85 pEnd = q; //更新尾节点 86 87 } 88 free(head);//释放head链表头节点 89 STUDENT *t; t = pHead; 90 int sum[100],i,j,ranking[100]; 91 for (i = 0; i < n; i++) 92 { 93 t = t->pNext; 94 sum[i] = sumscore(t, m); 95 } 96 ranking[0] = 1; 97 for (i = 0; i < n; i++) 98 { 99 j = i + 1; 100 if (sum[i] == sum[j]) ranking[j] = 1; 101 else ranking[j] = j + 1; 102 103 } 104 t = pHead->pNext; 105 for (i = 0; i < n; i++) 106 { 107 printf("%d %s ", t->id, t->name); 108 for (j = 0; j < m; j++) 109 { 110 printf("%d ", t->score[j]); 111 } 112 printf("Sum = %d Ranking = %d ", sum[i],ranking[i]); 113 t = t->pNext; 114 } 115 free(pHead); 116 } 117 118 119 120 int main() { 121 int n, m; 122 STUDENT *p; 123 scanf("%d%d", &n, &m); 124 p = Create(n,m); 125 Sort(p, n, m); 126 return 0; 127 }