1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 //创建STUDENT类型变量 包括学号、姓名、成绩
5 typedef struct student {
6 int number;
7 char name[50];
8 int score;
9 struct student *pNext;
10 }STUDENT;
11 //创建链表
12 STUDENT *Create(int n) {
13 STUDENT *pHead, *pEnd, *pNew = NULL;
14 int i; char str[100][50];
15 pHead = pEnd = (STUDENT*)malloc(sizeof(STUDENT));
16 for (i = 0; i < n; i++)
17 {
18 pNew = (STUDENT*)malloc(sizeof(STUDENT));
19 scanf("%d%s%d", &pNew->number, &str[i], &pNew->score);
20 strcpy(pNew->name, str[i]);//只有字符串初始化时才能使用“=”赋值
21 pNew->pNext = NULL;
22 pEnd->pNext = pNew;
23 pEnd = pNew;
24
25 }
26 return pHead;
27 }
28 //寻找前驱节点
29 STUDENT *Find_before(STUDENT* phead, STUDENT* p)
30 {
31 if (!p) return NULL;
32 STUDENT *pbefore = phead;
33 while (pbefore)
34 {
35 if (pbefore->pNext == p)
36 return pbefore;
37 pbefore = pbefore->pNext;
38 }
39 return NULL;
40 }
41
42 STUDENT *Sort(STUDENT *head) {
43 STUDENT *pHead,*pEnd,*q=NULL,*qbefore=NULL,*p=NULL;
44 int maxscore;
45 pHead=pEnd = (STUDENT*)malloc(sizeof(STUDENT));
46 while (head->pNext != NULL)
47 {
48 maxscore = head->pNext->score;
49 q = p = head->pNext;
50 //寻找最高分节点p
51 while (p->pNext!=NULL)
52 {
53 if(maxscore<p->pNext->score)
54 {
55 maxscore = p->pNext->score; q = p->pNext;
56 }
57 p = p->pNext;
58 }
59 pEnd->pNext = q; //将头指针指向q
60 q->pNext = NULL; //q节点指向空
61 pEnd = q; //更新尾节点
62 qbefore = Find_before(head,q); //寻找q节点的前驱节点
63 qbefore->pNext = q->pNext; //将q的前驱节点指向q的后驱节点 从而将q节点从a链表中剔除
64 }
65 free(head);//释放head链表头节点
66 return pHead;
67 }
68 void print(STUDENT *q) {
69 while (q->pNext != NULL)
70 {
71 q = q->pNext; printf("%s\n", q->name);
72 }
73 free(q);//释放使用完的链表
74 }
75 int main() {
76 int n, i = 1; STUDENT *p,*q;
77 scanf("%d", &n);
78 p = Create(n);
79 q=Sort(p);
80 print(q);
81 }