当前位置:   article > 正文

C语言实现学生管理系统(完整代码在文末)_学生管理系统c语言

学生管理系统c语言
一、引言
1.1 背景

学生管理系统是一种常见的信息管理工具,用于对学生的基本信息、成绩等进行有效管理。本实验设计和实现了一个简单的学生管理系统,使用链表数据结构存储学生信息,通过 C 语言编写各种功能模块。

1.2 目的

熟悉链表数据结构在实际应用中的使用。

掌握结构体的定义和使用。

实践 C 语言基础知识,包括内存管理、文件操作等。

二、设计与实现
2.1 数据结构设计

本系统使用链表存储学生信息,结构体 data 表示学生的基本信息,结构体 Student 表示链表中的节点。

struct data {

    int xh;             // 学号

    char name[10];      // 姓名

    short age;          // 年龄

    char sex[5];        // 性别

    float chinese;      // 语文成绩

    float math;         // 数学成绩

    float english;      // 英语成绩

};

typedef struct Student {

    struct data data;    // 数据域

    struct Student* next; // 指针域

} *QST, ST;

2.2 主要功能实现

添加学生信息:通过 Add_list 函数,实现用户输入学生信息,并通过链表将信息存储。

查询学生信息:通过 Seek_list 函数,实现按学号或姓名查询学生信息的功能。

修改学生信息:通过 Ament_list 函数,实现修改学生信息的功能。

插入学生信息:通过 Insert_list 函数,在指定学生前插入新的学生信息。

显示所有信息:通过 Output_list 函数,将所有学生信息输出到屏幕上。

删除学生信息:通过 Delete_list 函数,实现删除学生信息的功能,可以选择删除全部或者指定学生。

学生成绩排序:通过 Sort_list 函数,实现对学生信息的排序功能,可以选择按总分、平均分、语文成绩、数学成绩或英语成绩排序。

输出不及格学生:通过 DisplayFailingStudents 函数,输出不及格学生的信息。

输出各科目最高分:通过 DisplayMaxScores 函数,输出各科目的最高分。

2.3 菜单设计

通过 Menu 函数,设计了一个简单的用户界面,用户可以通过选择相应的数字来执行不同的功能。

三、实验结果
3.1 功能演示
添加学生信息
  1. //添加学生信息
  2. void Add_list(QST head)
  3. {
  4. QST p=head;
  5. printf("开始添加\n");
  6. while(p->next!=NULL)
  7. {
  8. p=p->next;
  9. }
  10. Linked_list(p);
  11. Ass_list(p);
  12. system("cls");
  13. printf("添加完成\n");
  14. }

查询学生信息
  1. //查询学生信息
  2. void Seek_list(QST head)
  3. {
  4. QST p = head->next;
  5. QST q = head;
  6. while (true)
  7. {
  8. printf("开始查找\n");
  9. printf("请选择查询方式:[1]按学号[2]按姓名[0]退出");
  10. int num;
  11. scanf("%d", &num);
  12. switch (num)
  13. {
  14. case 1:
  15. printf("请输入学生学号:\n");
  16. int stuNum;
  17. scanf("%d", &stuNum);
  18. while (p != NULL)
  19. {
  20. if (p->data.xh == stuNum)
  21. {
  22. system("cls");
  23. printf("学生姓名:%s,学生学号:%d\n", p->data.name, p->data.xh);
  24. printf("语文成绩: %.2f\n", p->data.chinese);
  25. printf("数学成绩: %.2f\n", p->data.math);
  26. printf("英语成绩: %.2f\n", p->data.english);
  27. return;
  28. }
  29. p = p->next;
  30. }
  31. if (p)
  32. {
  33. printf("没有查找到数据\n");
  34. return;
  35. }
  36. case 2:
  37. printf("请输入名字:\n");
  38. getchar();
  39. char name[20];
  40. gets(name);
  41. while (q != NULL)
  42. {
  43. if (strcmp(q->data.name, name) == 0)
  44. {
  45. printf("学生姓名:%s,学生学号:%d\n", q->data.name, q->data.xh);
  46. return;
  47. }
  48. q = q->next;
  49. }
  50. if (q == NULL)
  51. {
  52. printf("没有查找到数据\n");
  53. return;
  54. }
  55. case 0:
  56. printf("退出\n");
  57. return;
  58. break;
  59. default:
  60. printf("用户输入有误请重新输入\n");
  61. break;
  62. }
  63. }
  64. }

修改学生信息
  1. //修改学生信息
  2. void Ament_list(QST head)
  3. {
  4. QST p=head;
  5. if(Pd_list(head))
  6. {
  7. printf("修改失败\n");
  8. return;
  9. }
  10. printf("开始修改\n");
  11. printf("你要修改谁的信息(名字):");
  12. char name[10];
  13. getchar();
  14. gets(name);
  15. // 循环找到要修改的学生
  16. while (p->next != NULL) {
  17. p = p->next;
  18. // 如果找到要修改的学生
  19. if (strcmp(p->data.name, name) == 0) {
  20. // 打印修改前的信息
  21. printf("修改前的信息:\n");
  22. printf("学号:%d, 姓名:%s, 年龄:%hd, 性别:%s\n", p->data.xh, p->data.name, p->data.age, p->data.sex);
  23. printf("语文成绩: %.2f\n", p->data.chinese);
  24. printf("数学成绩: %.2f\n", p->data.math);
  25. printf("英语成绩: %.2f\n", p->data.english);
  26. // 调用 Fuzhi 函数修改信息,包括新的科目成绩
  27. Fuzhi(p);
  28. // 打印修改后的信息
  29. printf("修改后的信息:\n");
  30. printf("学号:%d, 姓名:%s, 年龄:%hd, 性别:%s\n", p->data.xh, p->data.name, p->data.age, p->data.sex);
  31. printf("语文成绩: %.2f\n", p->data.chinese);
  32. printf("数学成绩: %.2f\n", p->data.math);
  33. printf("英语成绩: %.2f\n", p->data.english);
  34. return; // 结束函数,避免继续循环查找
  35. }
  36. }
  37. // 如果循环结束仍未找到要修改的学生
  38. printf("查无此人\n");
  39. }

插入学生信息
  1. //插入函数
  2. void Insert_list(QST head)
  3. {
  4. QST p=head;
  5. if(Pd_list(head))
  6. {
  7. printf("请先添加,再插入\n");
  8. return;
  9. }
  10. char name[10];
  11. getchar();
  12. printf("你要在谁的前面插入(名字):\n");
  13. gets(name);
  14. //找到插入位置
  15. QST q=p;
  16. p=p->next;
  17. while(strcmp(p->data.name,name))
  18. {
  19. if(p->next==NULL)
  20. {
  21. printf("没有找到这个人\n");
  22. return;
  23. }
  24. q=p;
  25. p=p->next;
  26. }
  27. Linked_list(q);
  28. Ass_list(q);
  29. //循环找到尾结点
  30. while(q->next!=NULL)
  31. {
  32. q=q->next;
  33. }
  34. q->next=p;
  35. printf("插入完成\n");
  36. }

显示所有信息
  1. //打印所有信息
  2. void Output_list(QST head)
  3. {
  4. QST p=head;
  5. system("cls");
  6. printf("开始输出\n");
  7. if(Pd_list(p))
  8. {
  9. return;
  10. }
  11. int index=1;
  12. while(p->next!=NULL)
  13. {
  14. p=p->next;
  15. printf("第%d个学生信息:\n",index++);
  16. printf("学号:%d\n",p->data.xh);
  17. printf("姓名:%s\n",p->data.name);
  18. printf("年龄:%d\n",p->data.age);
  19. printf("性别:%s\n",p->data.sex);
  20. printf("语文成绩: %.2f\n", p->data.chinese);
  21. printf("数学成绩: %.2f\n", p->data.math);
  22. printf("英语成绩: %.2f\n", p->data.english);
  23. }
  24. printf("输出完毕!\n");
  25. }

删除学生信息
  1. //删除学生信息
  2. void Delete_list(QST head)
  3. {
  4. QST p=head;
  5. if(Pd_list(head))
  6. {
  7. return;
  8. }
  9. printf("开始删除\n");
  10. printf("你想要全部删除[0] 还是单个删除[1]\n");
  11. int num;
  12. scanf("%d",&num);
  13. if(num==0)
  14. {
  15. printf("正在全部删除中......\n");
  16. Empty_list(head);
  17. printf("全部删除成功\n");
  18. }
  19. else if(num==1)
  20. {
  21. printf("请输入你要删除学生的名字:");
  22. char name[10];
  23. getchar();
  24. gets(name);
  25. //被删除结点的前驱结点
  26. QST qjd=p;
  27. //当前要删除的结点
  28. p=p->next;
  29. while(strcmp(p->data.name,name))
  30. {
  31. if(p->next==NULL)
  32. {
  33. printf("没有找到这个人\n");
  34. return;
  35. }
  36. qjd=p;
  37. p=p->next;
  38. }
  39. qjd->next=p->next;
  40. p->next=NULL;
  41. free(p);
  42. printf("删除成功\n");
  43. return;
  44. }
  45. else
  46. {
  47. printf("用户输入错误\n");
  48. }
  49. }

学生成绩排序
  1. //学生成绩排序
  2. void Sort_list(QST head)
  3. {
  4. QST p = head;
  5. printf("开始排序\n");
  6. if (Pd_list(head))
  7. {
  8. return;
  9. }
  10. // 计算链表长度
  11. int len = 0;
  12. QST jd = p;
  13. while (jd->next != NULL)
  14. {
  15. jd = jd->next;
  16. len++;
  17. }
  18. printf("请选择排序方式:[1]总分 [2]平均分 [3]语文成绩 [4]数学成绩 [5]英语成绩 [0]退出");
  19. int sortOption;
  20. scanf("%d", &sortOption);
  21. QST a, b;
  22. for (int i = 1; i < len; i++)
  23. {
  24. a = p->next;
  25. b = a->next;
  26. for (int j = 0; j < len - i; j++)
  27. {
  28. float scoreA, scoreB;
  29. switch (sortOption)
  30. {
  31. case 1:
  32. scoreA = a->data.chinese + a->data.math + a->data.english;
  33. scoreB = b->data.chinese + b->data.math + b->data.english;
  34. break;
  35. case 2:
  36. scoreA = (a->data.chinese + a->data.math + a->data.english)/3.0;
  37. scoreB = (b->data.chinese + b->data.math + b->data.english)/3.0;
  38. break;
  39. case 3:
  40. scoreA = a->data.chinese;
  41. scoreB = b->data.chinese;
  42. break;
  43. case 4:
  44. scoreA = a->data.math;
  45. scoreB = b->data.math;
  46. break;
  47. case 5:
  48. scoreA = a->data.english;
  49. scoreB = b->data.english;
  50. break;
  51. case 0:
  52. printf("退出\n");
  53. return;
  54. break;
  55. default:
  56. printf("用户输入有误请重新输入\n");
  57. return;
  58. }
  59. if (scoreA > scoreB)
  60. {
  61. struct data temp = a->data;
  62. a->data = b->data;
  63. b->data = temp;
  64. }
  65. a = b;
  66. b = b->next;
  67. }
  68. }
  69. printf("排序完成\n");
  70. }

输出不及格学生
  1. // 输出不及格学生
  2. void DisplayFailingStudents(QST head) {
  3. QST p = head->next;
  4. printf("不及格学生信息:\n");
  5. while (p != NULL) {
  6. if (p->data.chinese < 60 || p->data.math < 60 || p->data.english < 60) {
  7. printf("学号:%d, 姓名:%s\n", p->data.xh, p->data.name);
  8. printf("语文成绩: %.2f\n", p->data.chinese);
  9. printf("数学成绩: %.2f\n", p->data.math);
  10. printf("英语成绩: %.2f\n", p->data.english);
  11. printf("\n");
  12. }
  13. p = p->next;
  14. }
  15. }

输出各科目最高分
  1. // 输出各科目最高分
  2. void DisplayMaxScores(QST head) {
  3. float maxChinese = 0, maxMath = 0, maxEnglish = 0;
  4. QST p = head->next;
  5. while (p != NULL) {
  6. maxChinese = (p->data.chinese > maxChinese) ? p->data.chinese : maxChinese;
  7. maxMath = (p->data.math > maxMath) ? p->data.math : maxMath;
  8. maxEnglish = (p->data.english > maxEnglish) ? p->data.english : maxEnglish;
  9. p = p->next;
  10. }
  11. printf("各科目最高分:\n");
  12. printf("语文最高分: %.2f\n", maxChinese);
  13. printf("数学最高分: %.2f\n", maxMath);
  14. printf("英语最高分: %.2f\n", maxEnglish);
  15. }

四、结论

通过本实验,我们成功设计并实现了一个简单的学生管理系统,包括了学生信息的增删改查、排序、输出不及格学生和各科目最高分等功能。通过实践,加深了对链表和结构体的理解,提高了对 C 语言的熟练程度

五、完整代码
  1. //学生管理系统
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<windows.h>
  5. #include<string.h>
  6. struct data //数据域
  7. {
  8. int xh;//学号
  9. char name[10];//名字
  10. short age;//年龄
  11. char sex[5];//性别
  12. float chinese; // 语文成绩
  13. float math; // 数学成绩
  14. float english; // 英语成绩
  15. };
  16. //结点
  17. typedef struct Student
  18. {
  19. struct data data;//数据域
  20. struct Student*next;//指针域
  21. }*QST,ST;
  22. //添加学生信息
  23. void Add_list(QST);
  24. //创建结点
  25. void Linked_list(QST);
  26. //赋值
  27. void Ass_list(QST);
  28. //判断链表是否为空
  29. int Pd_list(QST);
  30. //输出所有信息
  31. void Output_list(QST);
  32. //查询学生信息
  33. void Seek_list(QST);
  34. //删除学生信息
  35. void Delete_list(QST);
  36. //回收所有结点
  37. void Empty_list(QST);
  38. //修改数据
  39. void Ament_list(QST);
  40. //赋值函数
  41. void Fuzhi(QST);
  42. //插入函数
  43. void Insert_list(QST);
  44. //学生成绩排序
  45. void Sort_list(QST);
  46. //输出不及格学生
  47. void DisplayFailingStudents(QST head);
  48. // 输出各科目最高分
  49. void DisplayMaxScores(QST head);
  50. //打印菜单函数
  51. void Menu()
  52. {
  53. printf("***********欢迎来到学生管理系统***********\n");
  54. printf("----------1.添加学生信息------------------\n");
  55. printf("----------2.查询学生信息------------------\n");
  56. printf("----------3.修改学生信息------------------\n");
  57. printf("----------4.插入学生信息------------------\n");
  58. printf("----------5.显示所有信息------------------\n");
  59. printf("----------6.删除学生信息------------------\n");
  60. printf("----------7.学生成绩排序------------------\n");
  61. printf("----------8.输出不及格学生 ---------------\n");
  62. printf("----------9.输出各科目最高分--------------\n");
  63. printf("----------10. 清屏 -----------------\n");
  64. printf("----------11. 退出 -----------------\n");
  65. }
  66. int main()
  67. {
  68. //创建头结点
  69. QST head=(QST)malloc(sizeof(ST));
  70. head->next=NULL;
  71. //要求用户输入一个数值 选择功能
  72. int s;
  73. while(true)
  74. {
  75. //打印菜单
  76. Menu();
  77. printf("请输入1~9之间的数:");
  78. scanf("%d",&s);
  79. switch(s)
  80. {
  81. case 1:
  82. Add_list(head);
  83. break;
  84. case 2:
  85. Seek_list(head);
  86. break;
  87. case 3:
  88. Ament_list(head);
  89. break;
  90. case 4:
  91. Insert_list(head);
  92. break;
  93. case 5:
  94. Output_list(head);
  95. break;
  96. case 6:
  97. Delete_list(head);
  98. break;
  99. case 7:
  100. Sort_list(head);
  101. break;
  102. case 8:
  103. DisplayFailingStudents(head);
  104. break;
  105. case 9:
  106. DisplayMaxScores(head);
  107. break;
  108. case 10:
  109. system("cls");
  110. break;
  111. case 11:
  112. Empty_list(head);
  113. return 0;
  114. break;
  115. default:
  116. printf("用户输入有误,请重新输入\n");
  117. break;
  118. }
  119. }
  120. return 0;
  121. }
  122. //创建结点
  123. void Linked_list(QST wjd)
  124. {
  125. QST p=wjd;
  126. printf("开始创建结点\n");
  127. printf("请输入你要保存几个学生信息:");
  128. int num;
  129. scanf("%d",&num);
  130. if(num<=0)
  131. {
  132. printf("输入有误,创建失败\n");
  133. return;
  134. }
  135. for(int i=0;i<num;i++)
  136. {
  137. QST q=(QST)malloc(sizeof(ST));
  138. if(q==NULL)
  139. {
  140. printf("内存不足!初始化失败.\n");
  141. exit(-1);
  142. }
  143. p->next=q;
  144. q->next=NULL;
  145. p=q;
  146. }
  147. printf("创建完成\n");
  148. }
  149. //判断为空
  150. int Pd_list(QST head)
  151. {
  152. if(head->next==NULL)
  153. {
  154. printf("链表为空\n");
  155. return 1;
  156. }
  157. else
  158. {
  159. return 0;
  160. }
  161. }
  162. //赋值
  163. void Ass_list(QST wjd)
  164. {
  165. QST p=wjd;
  166. printf("开始赋值\n");
  167. if(Pd_list(p))
  168. {
  169. return;
  170. }
  171. int index=1;
  172. while(p->next!=NULL)
  173. {
  174. p=p->next;
  175. printf("请输入第%d个学生的信息\n",index++);
  176. Fuzhi(p);
  177. }
  178. printf("赋值成功!\n");
  179. }
  180. //添加学生信息
  181. void Add_list(QST head)
  182. {
  183. QST p=head;
  184. printf("开始添加\n");
  185. while(p->next!=NULL)
  186. {
  187. p=p->next;
  188. }
  189. Linked_list(p);
  190. Ass_list(p);
  191. system("cls");
  192. printf("添加完成\n");
  193. }
  194. //打印所有信息
  195. void Output_list(QST head)
  196. {
  197. QST p=head;
  198. system("cls");
  199. printf("开始输出\n");
  200. if(Pd_list(p))
  201. {
  202. return;
  203. }
  204. int index=1;
  205. while(p->next!=NULL)
  206. {
  207. p=p->next;
  208. printf("第%d个学生信息:\n",index++);
  209. printf("学号:%d\n",p->data.xh);
  210. printf("姓名:%s\n",p->data.name);
  211. printf("年龄:%d\n",p->data.age);
  212. printf("性别:%s\n",p->data.sex);
  213. printf("语文成绩: %.2f\n", p->data.chinese);
  214. printf("数学成绩: %.2f\n", p->data.math);
  215. printf("英语成绩: %.2f\n", p->data.english);
  216. }
  217. printf("输出完毕!\n");
  218. }
  219. //查询学生信息
  220. void Seek_list(QST head)
  221. {
  222. QST p = head->next;
  223. QST q = head;
  224. while (true)
  225. {
  226. printf("开始查找\n");
  227. printf("请选择查询方式:[1]按学号[2]按姓名[0]退出");
  228. int num;
  229. scanf("%d", &num);
  230. switch (num)
  231. {
  232. case 1:
  233. printf("请输入学生学号:\n");
  234. int stuNum;
  235. scanf("%d", &stuNum);
  236. while (p != NULL)
  237. {
  238. if (p->data.xh == stuNum)
  239. {
  240. system("cls");
  241. printf("学生姓名:%s,学生学号:%d\n", p->data.name, p->data.xh);
  242. printf("语文成绩: %.2f\n", p->data.chinese);
  243. printf("数学成绩: %.2f\n", p->data.math);
  244. printf("英语成绩: %.2f\n", p->data.english);
  245. return;
  246. }
  247. p = p->next;
  248. }
  249. if (p)
  250. {
  251. printf("没有查找到数据\n");
  252. return;
  253. }
  254. case 2:
  255. printf("请输入名字:\n");
  256. getchar();
  257. char name[20];
  258. gets(name);
  259. while (q != NULL)
  260. {
  261. if (strcmp(q->data.name, name) == 0)
  262. {
  263. printf("学生姓名:%s,学生学号:%d\n", q->data.name, q->data.xh);
  264. return;
  265. }
  266. q = q->next;
  267. }
  268. if (q == NULL)
  269. {
  270. printf("没有查找到数据\n");
  271. return;
  272. }
  273. case 0:
  274. printf("退出\n");
  275. return;
  276. break;
  277. default:
  278. printf("用户输入有误请重新输入\n");
  279. break;
  280. }
  281. }
  282. }
  283. //删除学生信息
  284. void Delete_list(QST head)
  285. {
  286. QST p=head;
  287. if(Pd_list(head))
  288. {
  289. return;
  290. }
  291. printf("开始删除\n");
  292. printf("你想要全部删除[0] 还是单个删除[1]\n");
  293. int num;
  294. scanf("%d",&num);
  295. if(num==0)
  296. {
  297. printf("正在全部删除中......\n");
  298. Empty_list(head);
  299. printf("全部删除成功\n");
  300. }
  301. else if(num==1)
  302. {
  303. printf("请输入你要删除学生的名字:");
  304. char name[10];
  305. getchar();
  306. gets(name);
  307. //被删除结点的前驱结点
  308. QST qjd=p;
  309. //当前要删除的结点
  310. p=p->next;
  311. while(strcmp(p->data.name,name))
  312. {
  313. if(p->next==NULL)
  314. {
  315. printf("没有找到这个人\n");
  316. return;
  317. }
  318. qjd=p;
  319. p=p->next;
  320. }
  321. qjd->next=p->next;
  322. p->next=NULL;
  323. free(p);
  324. printf("删除成功\n");
  325. return;
  326. }
  327. else
  328. {
  329. printf("用户输入错误\n");
  330. }
  331. }
  332. //删除所有结点
  333. void Empty_list(QST head)
  334. {
  335. QST p=head;
  336. QST q=p->next;
  337. while(q!=NULL)
  338. {
  339. p=q;
  340. q=q->next;
  341. p->next=NULL;
  342. free(p);
  343. }
  344. return;
  345. }
  346. //修改学生信息
  347. void Ament_list(QST head)
  348. {
  349. QST p=head;
  350. if(Pd_list(head))
  351. {
  352. printf("修改失败\n");
  353. return;
  354. }
  355. printf("开始修改\n");
  356. printf("你要修改谁的信息(名字):");
  357. char name[10];
  358. getchar();
  359. gets(name);
  360. // 循环找到要修改的学生
  361. while (p->next != NULL) {
  362. p = p->next;
  363. // 如果找到要修改的学生
  364. if (strcmp(p->data.name, name) == 0) {
  365. // 打印修改前的信息
  366. printf("修改前的信息:\n");
  367. printf("学号:%d, 姓名:%s, 年龄:%hd, 性别:%s\n", p->data.xh, p->data.name, p->data.age, p->data.sex);
  368. printf("语文成绩: %.2f\n", p->data.chinese);
  369. printf("数学成绩: %.2f\n", p->data.math);
  370. printf("英语成绩: %.2f\n", p->data.english);
  371. // 调用 Fuzhi 函数修改信息,包括新的科目成绩
  372. Fuzhi(p);
  373. // 打印修改后的信息
  374. printf("修改后的信息:\n");
  375. printf("学号:%d, 姓名:%s, 年龄:%hd, 性别:%s\n", p->data.xh, p->data.name, p->data.age, p->data.sex);
  376. printf("语文成绩: %.2f\n", p->data.chinese);
  377. printf("数学成绩: %.2f\n", p->data.math);
  378. printf("英语成绩: %.2f\n", p->data.english);
  379. return; // 结束函数,避免继续循环查找
  380. }
  381. }
  382. // 如果循环结束仍未找到要修改的学生
  383. printf("查无此人\n");
  384. }
  385. //赋值函数
  386. void Fuzhi(QST p)
  387. {
  388. printf("学号:");
  389. scanf("%d",&p->data.xh);
  390. getchar();
  391. printf("姓名:");
  392. gets(p->data.name);
  393. printf("年龄:");
  394. scanf("%d",&p->data.age);
  395. getchar();
  396. printf("性别:");
  397. gets(p->data.sex);
  398. printf("语文成绩:");
  399. scanf("%f", &p->data.chinese);
  400. printf("数学成绩:");
  401. scanf("%f", &p->data.math);
  402. printf("英语成绩:");
  403. scanf("%f", &p->data.english);
  404. }
  405. //插入函数
  406. void Insert_list(QST head)
  407. {
  408. QST p=head;
  409. if(Pd_list(head))
  410. {
  411. printf("请先添加,再插入\n");
  412. return;
  413. }
  414. char name[10];
  415. getchar();
  416. printf("你要在谁的前面插入(名字):\n");
  417. gets(name);
  418. //找到插入位置
  419. QST q=p;
  420. p=p->next;
  421. while(strcmp(p->data.name,name))
  422. {
  423. if(p->next==NULL)
  424. {
  425. printf("没有找到这个人\n");
  426. return;
  427. }
  428. q=p;
  429. p=p->next;
  430. }
  431. Linked_list(q);
  432. Ass_list(q);
  433. //循环找到尾结点
  434. while(q->next!=NULL)
  435. {
  436. q=q->next;
  437. }
  438. q->next=p;
  439. printf("插入完成\n");
  440. }
  441. //学生成绩排序
  442. void Sort_list(QST head)
  443. {
  444. QST p = head;
  445. printf("开始排序\n");
  446. if (Pd_list(head))
  447. {
  448. return;
  449. }
  450. // 计算链表长度
  451. int len = 0;
  452. QST jd = p;
  453. while (jd->next != NULL)
  454. {
  455. jd = jd->next;
  456. len++;
  457. }
  458. printf("请选择排序方式:[1]总分 [2]平均分 [3]语文成绩 [4]数学成绩 [5]英语成绩 [0]退出");
  459. int sortOption;
  460. scanf("%d", &sortOption);
  461. QST a, b;
  462. for (int i = 1; i < len; i++)
  463. {
  464. a = p->next;
  465. b = a->next;
  466. for (int j = 0; j < len - i; j++)
  467. {
  468. float scoreA, scoreB;
  469. switch (sortOption)
  470. {
  471. case 1:
  472. scoreA = a->data.chinese + a->data.math + a->data.english;
  473. scoreB = b->data.chinese + b->data.math + b->data.english;
  474. break;
  475. case 2:
  476. scoreA = (a->data.chinese + a->data.math + a->data.english)/3.0;
  477. scoreB = (b->data.chinese + b->data.math + b->data.english)/3.0;
  478. break;
  479. case 3:
  480. scoreA = a->data.chinese;
  481. scoreB = b->data.chinese;
  482. break;
  483. case 4:
  484. scoreA = a->data.math;
  485. scoreB = b->data.math;
  486. break;
  487. case 5:
  488. scoreA = a->data.english;
  489. scoreB = b->data.english;
  490. break;
  491. case 0:
  492. printf("退出\n");
  493. return;
  494. break;
  495. default:
  496. printf("用户输入有误请重新输入\n");
  497. return;
  498. }
  499. if (scoreA > scoreB)
  500. {
  501. struct data temp = a->data;
  502. a->data = b->data;
  503. b->data = temp;
  504. }
  505. a = b;
  506. b = b->next;
  507. }
  508. }
  509. printf("排序完成\n");
  510. }
  511. // 输出不及格学生
  512. void DisplayFailingStudents(QST head) {
  513. QST p = head->next;
  514. printf("不及格学生信息:\n");
  515. while (p != NULL) {
  516. if (p->data.chinese < 60 || p->data.math < 60 || p->data.english < 60) {
  517. printf("学号:%d, 姓名:%s\n", p->data.xh, p->data.name);
  518. printf("语文成绩: %.2f\n", p->data.chinese);
  519. printf("数学成绩: %.2f\n", p->data.math);
  520. printf("英语成绩: %.2f\n", p->data.english);
  521. printf("\n");
  522. }
  523. p = p->next;
  524. }
  525. }
  526. // 输出各科目最高分
  527. void DisplayMaxScores(QST head) {
  528. float maxChinese = 0, maxMath = 0, maxEnglish = 0;
  529. QST p = head->next;
  530. while (p != NULL) {
  531. maxChinese = (p->data.chinese > maxChinese) ? p->data.chinese : maxChinese;
  532. maxMath = (p->data.math > maxMath) ? p->data.math : maxMath;
  533. maxEnglish = (p->data.english > maxEnglish) ? p->data.english : maxEnglish;
  534. p = p->next;
  535. }
  536. printf("各科目最高分:\n");
  537. printf("语文最高分: %.2f\n", maxChinese);
  538. printf("数学最高分: %.2f\n", maxMath);
  539. printf("英语最高分: %.2f\n", maxEnglish);
  540. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/607871
推荐阅读
相关标签
  

闽ICP备14008679号