请选择 进入手机版 | 继续访问电脑版

飞航课堂

搜索
查看: 1291|回复: 7

数据结构课程设计运动会管理系统

[复制链接]

6

主题

28

帖子

84

积分

版主

Rank: 7Rank: 7Rank: 7

积分
84
发表于 2021-1-20 22:51:54 | 显示全部楼层 |阅读模式
本帖最后由 xiaoweidumpb 于 2021-1-21 09:34 编辑

游客,如果您要查看本帖隐藏内容请回复
参加运动会的有n个学院,学校编号为1……n,比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前八名积分,且前八名的积分分别为:9、7、6、5、4、3、2、1(m<=20,n<=20)。

功能要求:(1)可以输入各个项目的前八名的成绩;(2)能统计各学院的总分并排序;(3)可以按学院编号、学院总分、男女团体总分排序输出;(4)可以按学院编号查询学院某个项目的情况;可以按项目编号查询取得前八名的学院。(5)可以查找汇总某名选手参加的项目和获取的名次和积分。
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:
学生自己根据系统功能要求自己设计,要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容可以参考c语言程序设计的教材)请在最后的上交资料中指明使用的存储结构。
测试数据:
要求使用(1)全部合法数据;(2)整体非法数据;(3)局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明。

该代码使用Visual C++ 6.0 编译运行,如果使用其他版本可能输出scanf_s之类的错误
由于要求简单,没有删除等功能,没有设立尾指针






回复

使用道具 举报

6

主题

28

帖子

84

积分

版主

Rank: 7Rank: 7Rank: 7

积分
84
 楼主| 发表于 2021-1-20 22:58:08 | 显示全部楼层
项目概况

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

6

主题

28

帖子

84

积分

版主

Rank: 7Rank: 7Rank: 7

积分
84
 楼主| 发表于 2021-1-20 22:58:37 | 显示全部楼层
数据展示

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

6

主题

28

帖子

84

积分

版主

Rank: 7Rank: 7Rank: 7

积分
84
 楼主| 发表于 2021-1-20 22:59:06 | 显示全部楼层
数字 3 代表有三个学院
数字 2 代表有两个项目

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

6

主题

28

帖子

84

积分

版主

Rank: 7Rank: 7Rank: 7

积分
84
 楼主| 发表于 2021-1-20 23:00:09 | 显示全部楼层
运行截图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

6

主题

28

帖子

84

积分

版主

Rank: 7Rank: 7Rank: 7

积分
84
 楼主| 发表于 2021-1-20 23:01:17 | 显示全部楼层
本帖最后由 xiaoweidumpb 于 2021-1-21 09:50 编辑

代码,如有任何问题请指出,欢迎大家批评,交流,借鉴。

同时也欢迎各位同学分享自己的学习心得,技术贴。


头函数:


  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <string.h>
  4. #include <malloc.h>
  5. #include <stdlib.h>

  6. #define N 10
  7. typedef int ElemType;

  8. typedef struct Node
  9. {
  10.     ElemType score;   //分数
  11.     ElemType rank;    //排名
  12.     ElemType sex;     //性别
  13.     char name[20];    //姓名
  14.     char college[20]; //学院
  15.     char item[20];    //项目
  16.     struct Node *next;
  17. } LinkNode, *LinkList;

  18. void Init(LinkList &Head);
  19. int  GetScore(int rank);
  20. void Input(LinkList &Head, int &CollegeNum, int &ItemNum, char Colleges[][20], char Items[][20]);
  21. void Create(LinkList &Head, int score, int rank, int sex, char name[], char college[], char item[]);
  22. void Show(LinkList Head);
  23. void Save(LinkList Head, char Colleges[][20], int CollegeNum, char Items[][20], int ItemNum);
  24. void Read(LinkList Head, char Colleges[][20], int &CollegeNum, char Items[][20], int &ItemNum);
  25. void Collegescore(LinkList Head, char Colleges[][20], int CollegeNum);
  26. void SexScore(LinkList Head, char Colleges[][20], int CollegeNum);
  27. void QueryCollege(LinkList Head);
  28. void QueryName(LinkList Head);
  29. void QueryItem(LinkList Head);
  30. void Insert(LinkList &Head, int score, int rank, int sex, char name[], char college[], char item[]);
  31. void Print(Node *p);
  32. void Free(LinkList &Head);
复制代码



回复 支持 反对

使用道具 举报

6

主题

28

帖子

84

积分

版主

Rank: 7Rank: 7Rank: 7

积分
84
 楼主| 发表于 2021-1-20 23:07:28 | 显示全部楼层
主函数

  1. #include "sports.h"

  2. int main()
  3. {
  4.     LinkList Head;                    //选手数据链表
  5.     Init(Head);

  6.     int CollegeNum=0;                  //学院数量
  7.     int ItemNum=0;                     //项目数量
  8.     char Colleges[N][20]={'\0'};               //学院
  9.     char Items[N][20]={'\0'};                  //运动会项目
  10.     int select=0;
  11.     while (true)
  12.     {
  13.         printf("********************************************\n");
  14.         printf("[1]初始化程序                 [2]读取数据         \n");
  15.         printf("[3]打印数据             [4]保存数据          \n");
  16.         printf("[5]统计学院的总分       [6]男女团体总分       \n");
  17.         printf("[7]查询学院项目         [8]查找选手           \n");
  18.         printf("[9]查询项目获奖                              \n");
  19.         printf("[0]退出系统                                                \n");
  20.         printf("*******************************************\n");
  21.         printf("请选择: >\n");
  22.         scanf("%d", &select);
  23.         switch (select)
  24.         {
  25.         case 1:
  26.         {   
  27.             Input(Head,CollegeNum,ItemNum,Colleges,Items);
  28.             break;
  29.         }
  30.         case 2:
  31.             Read(Head,Colleges,CollegeNum,Items,ItemNum);
  32.             Show(Head);
  33.             break;
  34.         case 3:
  35.             Show(Head);
  36.             break;
  37.         case 4:
  38.             Save(Head,Colleges,CollegeNum,Items,ItemNum);
  39.             break;
  40.         case 5:
  41.             Collegescore(Head,Colleges,CollegeNum);
  42.             break;
  43.         case 6:
  44.             SexScore(Head,Colleges,CollegeNum);
  45.             break;
  46.         case 7:
  47.             QueryCollege(Head);
  48.             break;
  49.         case 8:
  50.             QueryName(Head);
  51.             break;
  52.         case 9:
  53.             QueryItem(Head);
  54.             break;
  55.         case 0:
  56.             Free(Head);
  57.             return 0;
  58.         default:
  59.             printf("输入的数据有误,请重新输入\n");
  60.             break;
  61.         }
  62.     }

  63. }
复制代码
回复 支持 反对

使用道具 举报

6

主题

28

帖子

84

积分

版主

Rank: 7Rank: 7Rank: 7

积分
84
 楼主| 发表于 2021-1-20 23:07:49 | 显示全部楼层
实现函数:
  1. #include "sports.h"

  2. //初始化头指针
  3. void Init(LinkList &Head)
  4. {

  5.     Head = (LinkNode *)malloc(sizeof(LinkNode)); //申请头结点
  6.     Head->rank = 0;
  7.     Head->score = 0;
  8.     Head->sex = -1;
  9.     strcpy(Head->name, "");
  10.     strcpy(Head->college, "");
  11.     strcpy(Head->item, "");
  12.     Head->next = NULL;
  13. }

  14. //根据排名得到相应的分数
  15. int GetScore(int rank)
  16. {
  17.     if (rank == 1)
  18.         return 9;
  19.     else if (rank == 2)
  20.         return 7;
  21.     else if (rank == 3)
  22.         return 6;
  23.     else if (rank == 4)
  24.         return 5;
  25.     else if (rank == 5)
  26.         return 4;
  27.     else if (rank == 6)
  28.         return 3;
  29.     else if (rank == 7)
  30.         return 2;
  31.     else if (rank == 8)
  32.         return 1;
  33.     else
  34.         return 0;
  35. }

  36. //初始化程序,输入学院名,项目名和选手成绩
  37. void Input(LinkList &Head, int &CollegeNum, int &ItemNum, char Colleges[][20], char Items[][20])
  38. {
  39.     int i, r, flag = 0;
  40.     int score = 0, rank = 0, sex = 0;                                // 存储输入变量;
  41.     char name[20] = {'\0'}, college[20] = {'\0'}, item[20] = {'\0'}; // 存储输入变量存储;
  42.     int count = 1;                                                   // 计数器

  43.     printf("请输入学院个数 n<10 \n");

  44.     while (r = scanf("%d", &CollegeNum) != 1 || CollegeNum > 10 || CollegeNum < 0)
  45.     {
  46.         printf(" 您的输入有误,请重新输入!  \n");
  47.         fflush(stdin); /*清空输入缓冲区,也可以使用rewind(stdin);*/
  48.     }

  49.     for (i = 0; i < CollegeNum; i++)
  50.     {
  51.         printf("请输入第%d学院名\n", i + 1);
  52.         scanf("%s", &Colleges[i]);
  53.         fflush(stdin);
  54.     }

  55.     printf("请输入项目个数 n<10 \n");
  56.     while (r = scanf("%d", &ItemNum) != 1 || ItemNum > 10 || ItemNum < 0)
  57.     {
  58.         printf(" 您的输入有误,请重新输入!  \n");
  59.         fflush(stdin);
  60.     }

  61.     for (i = 0; i < ItemNum; i++)
  62.     {
  63.         printf("请输入第%d项目名\n", i + 1);
  64.         scanf("%s", &Items[i]);
  65.     }

  66.     while (true)
  67.     {
  68.         fflush(stdin);

  69.         printf("请输入第%d个选手数据\n", count);
  70.         printf("请输入姓名\n");
  71.         r = scanf("%s", &name);
  72.         if (r == 0)
  73.         {
  74.             printf(" 您的输入有误,请重新输入!  \n");
  75.             break;
  76.         }
  77.         printf("请输入性别  0代表女性 1代表男性\n");
  78.         r = scanf("%d", &sex);
  79.         if (r == 0)
  80.         {
  81.             printf(" 您的输入有误,请重新输入!  \n");
  82.             break;
  83.         }
  84.         printf("请输入学院\n");
  85.         r = scanf("%s", &college);
  86.         if (r == 0)
  87.         {
  88.             printf(" 您的输入有误,请重新输入!  \n");
  89.             break;
  90.         }

  91.         printf("请输入项目\n");
  92.         r = scanf("%s", &item);
  93.         if (r == 0)
  94.         {
  95.             printf(" 您的输入有误,请重新输入!  \n");
  96.             break;
  97.         }
  98.         printf("请输入名次 1-8\n");

  99.         r = scanf("%d", &rank);
  100.         if (r == 0 && rank < 0 && rank > 8)
  101.         {
  102.             printf(" 您的输入有误,请重新输入!  \n");
  103.             break;
  104.         }
  105.         score = GetScore(rank);

  106.         Create(Head, score, rank, sex, name, college, item);
  107.         count++;
  108.         printf("0 结束输入数据 , 1 输入数据\n");
  109.         scanf("%d", &flag);
  110.         if (flag == 0)
  111.             break;
  112.     }
  113. }

  114. //创建链表
  115. void Create(LinkList &Head, int score, int rank, int sex, char name[], char college[], char item[])
  116. {
  117.     LinkNode *p = Head->next, *s;
  118.     //如果链表为空,则做初始化链表
  119.     if (p == NULL)
  120.     {
  121.         s = (LinkNode *)malloc(sizeof(LinkNode));
  122.         assert(s != NULL);
  123.         s->score = score;
  124.         s->rank = rank;
  125.         s->sex = sex;
  126.         strcpy(s->name, name);
  127.         strcpy(s->college, college);
  128.         strcpy(s->item, item);
  129.         s->next = NULL;
  130.         Head->next = s;
  131.     }
  132.     else
  133.     {
  134.         while (p->next != NULL)
  135.         {
  136.             p = p->next;
  137.         }
  138.         s = (LinkNode *)malloc(sizeof(LinkNode));
  139.         assert(s != NULL);
  140.         s->score = score;
  141.         s->rank = rank;
  142.         s->sex = sex;
  143.         strcpy(s->name, name);
  144.         strcpy(s->college, college);
  145.         strcpy(s->item, item);
  146.         s->next = NULL;
  147.         p->next = s;
  148.     }
  149. }

  150. //打印所有的数据
  151. void Show(LinkList Head)
  152. {
  153.     int count = 1;
  154.     Node *p = Head->next;
  155.     while (p != NULL)
  156.     {
  157.         printf("打印第%d个成绩\n", count);
  158.         Print(p);
  159.         p = p->next;
  160.         count++;
  161.     }
  162. }

  163. //保存数据为.txt文件
  164. void Save(LinkList Head, char Colleges[][20], int CollegesNum, char Items[][20], int ItemNum)
  165. {
  166.     int i;
  167.     //保存选手数据
  168.     FILE *file;
  169.     file = fopen("sports_data.txt", "w");
  170.     if (file == NULL)
  171.     {
  172.         printf("文件创建失败请检查!\n");
  173.         exit(0);
  174.     }

  175.     Node *p = Head->next;
  176.     while (p != NULL)
  177.     {

  178.         fprintf(file, "%s\t", p->name);

  179.         fprintf(file, "%d\t", p->sex);

  180.         fprintf(file, "%s\t", p->college);

  181.         fprintf(file, "%s\t", p->item);

  182.         fprintf(file, "%d\t", p->rank);

  183.         fprintf(file, "%d\n", p->score);
  184.         p = p->next;
  185.     }
  186.     fclose(file);
  187.     file = NULL; //将指针置为NULL ,打开另一个文件

  188.     file = fopen("Colleges_Items.txt", "w");
  189.     if (file == NULL)
  190.     {
  191.         printf("文件创建失败请检查!\n");
  192.         exit(0);
  193.     }
  194.     //保存项目数和学院数
  195.     fprintf(file, "%d\t", CollegesNum);
  196.     fprintf(file, "%d\t", ItemNum);

  197.     //保存项目名字和学院名字
  198.     for (i = 0; i < CollegesNum; i++)
  199.     {
  200.         fprintf(file, "%s\t", Colleges[i]);
  201.     }
  202.     for (i = 0; i < ItemNum; i++)
  203.     {
  204.         fprintf(file, "%s\t", Items[i]);
  205.     }

  206.     fclose(file);
  207. }
  208. //读取txt文件中的数据
  209. void Read(LinkList Head, char Colleges[][20], int &CollegesNum, char Items[][20], int &ItemNum)
  210. {
  211.     if (Head->next != NULL)
  212.     {
  213.         printf("已读取数据!\n");
  214.         return;
  215.     }

  216.     FILE *file;
  217.     int i = 0;

  218.     file = fopen("sports_data.txt", "r");
  219.     if (file == NULL)
  220.     {
  221.         printf("文件读取失败请初始化!\n");
  222.         exit(0);
  223.     }

  224.     int score, rank, sex;                 // 作为输入变量存储;
  225.     char name[20], college[20], item[20]; // 作为输入变量存储;
  226.     //当指针不为结束符,一直++
  227.     //读入所有的选手成绩
  228.     while (!feof(file))
  229.     {
  230.         fscanf(file, "%s", &name);

  231.         fscanf(file, "%d\t", &sex);

  232.         fscanf(file, "%s\t", &college);

  233.         fscanf(file, "%s\t", &item);

  234.         fscanf(file, "%d\t", &rank);

  235.         fscanf(file, "%d\n", &score);
  236.         Create(Head, score, rank, sex, name, college, item);
  237.     }
  238.     fclose(file);

  239.     //读取学院名字和项目名字
  240.     file = NULL;
  241.     file = fopen("colleges_items.txt", "r");
  242.     if (file == NULL)
  243.     {
  244.         printf("文件读取失败请初始化!\n");
  245.         exit(0);
  246.     }

  247.     while (!feof(file))
  248.     {
  249.         fscanf(file, "%d\t", &CollegesNum);

  250.         fscanf(file, "%d\t", &ItemNum);

  251.         for (i = 0; i < CollegesNum; i++)
  252.         {
  253.             fscanf(file, "%s\t", &Colleges[i]);
  254.         }

  255.         for (i = 0; i < CollegesNum; i++)
  256.         {
  257.             fscanf(file, "%s\t", &Items[i]);
  258.         }
  259.     }

  260.     fclose(file);
  261. }

  262. //学院分数
  263. void Collegescore(LinkList Head, char Colleges[][20], int CollegesNum)
  264. {
  265.     int score[N] = {0}; //
  266.     int i;
  267.     LinkList list;
  268.     Node *p = NULL;
  269.     //计算每个学院的分数
  270.     Init(list);
  271.     for (i = 0; i < CollegesNum; i++)
  272.     {

  273.         p = Head->next;

  274.         while (p != NULL)
  275.         {
  276.             if (strcmp(Colleges[i], p->college) == 0)
  277.             {
  278.                 score[i] += p->score;
  279.             }
  280.             p = p->next;
  281.         }
  282.     }

  283.     //按分数大小建立一个链表
  284.     for (i = 0; i < CollegesNum; i++)
  285.     {
  286.         Insert(list, score[i], 0, 0, "", Colleges[i], "");
  287.     }

  288.     //打印学院成绩

  289.     p = NULL;
  290.     p = list->next;
  291.     while (p != NULL)
  292.     {
  293.         printf("%s学院得分为%8d\n", p->college, p->score);
  294.         p = p->next;
  295.     }

  296.     Free(list);
  297. }

  298. //释放链表
  299. void Free(LinkList &Head)
  300. {
  301.     Node *p = NULL, *q = NULL;
  302.     p = Head->next;
  303.     //链表为空直接返回
  304.     if (p == NULL)
  305.     {
  306.         free(Head);
  307.         return;
  308.     }
  309.     while (p != NULL)
  310.     {
  311.         q = p;
  312.         p = p->next;
  313.         free(q);
  314.     }
  315.     free(Head);
  316. }

  317. //按男女统计得分
  318. void SexScore(LinkList Head, char Colleges[][20], int CollegesNum)
  319. {
  320.     LinkList man_score, woman_score;
  321.     Init(man_score);
  322.     Init(woman_score);
  323.     int i;

  324.     for (i = 0; i < CollegesNum; i++)
  325.     {
  326.         int a[N] = {0};
  327.         Node *p = Head->next;

  328.         LinkList man, womon;
  329.         Init(man);
  330.         Init(womon);

  331.         while (p != NULL)
  332.         { //统计某学院男生,女生成绩
  333.             if (strcmp(Colleges[i], p->college) == 0 && p->sex == 0)
  334.             {
  335.                 Insert(womon, p->score, p->rank, p->sex, p->name, p->college, p->item);
  336.             }

  337.             if (strcmp(Colleges[i], p->college) == 0 && p->sex == 1)
  338.             {
  339.                 Insert(man, p->score, p->rank, p->sex, p->name, p->college, p->item);
  340.             }
  341.             p = p->next;
  342.         }

  343.         p = man->next;

  344.         while (p != NULL)
  345.         {
  346.             a[i] += p->score;
  347.             p = p->next;
  348.         }

  349.         Insert(man_score, a[i], 0, 0, "", Colleges[i], "");

  350.         p = NULL;
  351.         a[i] = 0;
  352.         p = womon->next;
  353.         while (p != NULL)
  354.         {
  355.             a[i] += p->score;
  356.             p = p->next;
  357.         }
  358.         Insert(woman_score, a[i], 0, 0, "", Colleges[i], "");
  359.         Free(man);
  360.         Free(womon);
  361.     }

  362.     Node *q;
  363.     q = man_score->next;
  364.     printf("学院男生团体的前八名为\n");
  365.     while (q != NULL)
  366.     {
  367.         printf("%s男生团体得分为:   %d\n", q->college, q->score);
  368.         q = q->next;
  369.     }
  370.     q = NULL;
  371.     q = woman_score->next;
  372.     printf("学院女生团体的前八名为\n");
  373.     while (q != NULL)
  374.     {
  375.         printf("%s女生团体得分为:   %d\n", q->college, q->score);
  376.         q = q->next;
  377.     }

  378.     Free(man_score);
  379.     Free(woman_score);
  380. }
  381. //查询某学院某个项目获奖情况
  382. void QueryCollege(LinkList Head)
  383. {

  384.     char item[20], college[20];

  385.     printf("请输入您要查询的学院名:\n");
  386.     scanf("%s", &college);

  387.     printf("请输入您要查询的项目名:\n");
  388.     scanf("%s", &item);

  389.     Node *p = Head->next;

  390.     while (p != NULL)
  391.     {
  392.         if (strcmp(college, p->college) == 0 && strcmp(item, p->item) == 0)
  393.         {
  394.             Print(p);
  395.         }
  396.         p = p->next;
  397.     }
  398. }
  399. //查询选手成绩
  400. void QueryName(LinkList Head)
  401. {
  402.     char name[20];

  403.     printf("请输入您要查询的选手姓名:\n");
  404.     scanf("%s", &name);

  405.     Node *p = Head->next;

  406.     while (p != NULL)
  407.     {
  408.         if (strcmp(name, p->name) == 0)
  409.         {
  410.             Print(p);
  411.         }
  412.         p = p->next;
  413.     }
  414. }

  415. // 按大小顺序插入建立一个链表
  416. void Insert(LinkList &Head, int score, int rank, int sex, char name[], char college[], char item[])
  417. {
  418.     LinkNode *p = Head->next, *s = NULL;
  419.     LinkNode *q = Head;
  420.     //如果链表为空,则做初始化链表
  421.     if (p == NULL)
  422.     {
  423.         s = (LinkNode *)malloc(sizeof(LinkNode));
  424.         assert(s != NULL);
  425.         s->score = score;
  426.         s->rank = rank;
  427.         s->sex = sex;
  428.         strcpy(s->name, name);
  429.         strcpy(s->college, college);
  430.         strcpy(s->item, item);
  431.         s->next = NULL;
  432.         Head->next = s;
  433.     }
  434.     else
  435.     {
  436.         while (p != NULL && score <= p->score)
  437.         {
  438.             q = p;
  439.             p = p->next;
  440.         }
  441.         s = (LinkNode *)malloc(sizeof(LinkNode));
  442.         assert(s != NULL);
  443.         s->score = score;
  444.         s->rank = rank;
  445.         s->sex = sex;
  446.         strcpy(s->name, name);
  447.         strcpy(s->college, college);
  448.         strcpy(s->item, item);

  449.         s->next = p;
  450.         q->next = s;
  451.     }
  452. }

  453. //查询项目得分情况
  454. void QueryItem(LinkList Head)
  455. {
  456.     char item[20];
  457.     LinkList t;
  458.     Init(t);

  459.     printf("请输入您要查询的项目名:\n");
  460.     scanf("%s", &item);

  461.     Node *p = Head->next;

  462.     while (p != NULL)
  463.     {
  464.         if (strcmp(item, p->item) == 0)
  465.         {
  466.             Insert(t, p->score, p->rank, p->sex, p->name, p->college, p->item);
  467.         }
  468.         p = p->next;
  469.     }

  470.     p = t->next;
  471.     printf("%s项目前八名为\n", item);

  472.     while (p != NULL)
  473.     {
  474.         Print(p);
  475.         p = p->next;
  476.     }
  477. }

  478. //打印指针内的数据
  479. void Print(Node *p)
  480. {
  481.     printf("\n\n\n\n");
  482.     printf("*************************\n");
  483.     printf("姓名为          ");
  484.     printf("%s\n", p->name);

  485.     printf("性别为          ");
  486.     printf("%d\n", p->sex);

  487.     printf("学院为          ");
  488.     printf("%s\n", p->college);

  489.     printf("项目为          ");
  490.     printf("%s\n", p->item);

  491.     printf("名次为          ");

  492.     printf("%d\n", p->rank);

  493.     printf("分数为          ");
  494.     printf("%d\n", p->score);
  495. }


复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表