当前位置:   article > 正文

数据结构day3

数据结构day3

一、思维导图

二、顺序表实现学生管理系统

//头文件

  1. #ifndef TEST_H
  2. #define TEST_H
  3. #define MAX_SIZE 100
  4. //定义学生类型
  5. typedef struct
  6. {
  7. char name[20]; //姓名
  8. int age; //年龄
  9. double score; //分数
  10. }datatype;
  11. //定义班级类型
  12. typedef struct
  13. {
  14. datatype student[MAX_SIZE]; //定义学生容器
  15. int size; //实际学生人数
  16. }class,*class_ptr;
  17. //函数声明
  18. //创建班级函数
  19. class_ptr Create_Stu();
  20. //判空函数
  21. int Empty(class_ptr P);
  22. //判满函数
  23. int Full(class_ptr P);
  24. //信息录入
  25. int Enter_Stu(class_ptr P);
  26. //学生信息输出
  27. void Print_Stu(class_ptr P);
  28. //按姓名查找学生位置
  29. int Search_name(class_ptr P,const char *ptr);
  30. //按位置输出学生信息
  31. void Print_pos(class_ptr P,int pos);
  32. //按位置修改学生新信息
  33. int Update_pos(class_ptr P,int pos);
  34. //按位置删除学生信息
  35. int Delete_pos(class_ptr P,int pos);
  36. //学生信息去重
  37. int Unique(class_ptr P);
  38. //按成绩降序排序
  39. void Sort_Stu(class_ptr P);
  40. //输出成绩最值学生信息
  41. void Print_Best(class_ptr P);
  42. //销毁班级容器
  43. void destroy(class_ptr P);
  44. #endif

//功能函数

  1. #include <myhead.h>
  2. #include "sys.h"
  3. //创建班级
  4. class_ptr Create_Stu()
  5. {
  6. //申请堆区空间
  7. class_ptr P = (class_ptr)malloc(sizeof(class));
  8. if(NULL == P)
  9. {
  10. printf("创建失败\n");
  11. return NULL;
  12. }
  13. //申请成功
  14. //给申请空间初始化
  15. memset(P,0,sizeof(class));
  16. P->size =0;
  17. //将内存地址返回
  18. printf("创建班级成功\n");
  19. return P;
  20. }
  21. //判空函数
  22. int Empty(class_ptr P)
  23. {
  24. return P->size ==0;
  25. }
  26. //判满函数
  27. int Full(class_ptr P)
  28. {
  29. return P->size ==MAX_SIZE;
  30. }
  31. //信息录入
  32. int Enter_Stu(class_ptr P)
  33. {
  34. //判断合法性
  35. if(NULL == P || Full(P))
  36. {
  37. printf("error\n");
  38. return -1 ;
  39. }
  40. //录入学生信息
  41. printf("请输入学生姓名:");
  42. scanf("%s",P->student[P->size].name);
  43. getchar();
  44. printf("请输入学生年龄:");
  45. scanf("%d",&P->student[P->size].age);
  46. getchar();
  47. printf("请输入学生成绩:");
  48. scanf("%lf",&P->student[P->size].score);
  49. getchar();
  50. printf("\n");
  51. //录入完成
  52. //长度增加
  53. P->size++;
  54. printf("录入成功\n");
  55. return 0;
  56. }
  57. //学生信息输出
  58. void Print_Stu(class_ptr P)
  59. {
  60. //判断合法性
  61. if(NULL == P || Empty(P))
  62. {
  63. printf("error\n");
  64. return;
  65. }
  66. //循环输出学生信息
  67. printf("**********学生信息如下*********\n");
  68. printf("姓名\t年龄\t成绩\n\n");
  69. for(int i=0;i<P->size;i++)
  70. {
  71. printf("%s\t%d\t%lf\n",\
  72. P->student[i].name,P->student[i].age,P->student[i].score);
  73. printf("\n");
  74. }
  75. }
  76. //按姓名查找学生位置
  77. int Search_name(class_ptr P,const char *ptr)
  78. {
  79. //判断合法性
  80. if(NULL == P || Empty(P))
  81. {
  82. printf("error\n");
  83. return 0 ;
  84. }
  85. //遍历查找
  86. for(int i =0;i<P->size;i++)
  87. {
  88. if(strcmp(P->student[i].name , ptr ) == 0)
  89. {
  90. //查找成功,返回下标
  91. return i;
  92. }
  93. }
  94. return -1;
  95. }
  96. //按位置输出学生信息
  97. void Print_pos(class_ptr P,int pos)
  98. {
  99. //判断合法性
  100. if(NULL == P || Empty(P) || pos < 0 || pos>P->size)
  101. {
  102. printf("error\n");
  103. return ;
  104. }
  105. //输出信息
  106. printf("**********学生信息如下*********\n");
  107. printf("姓名\t年龄\t成绩\n\n");
  108. printf("%s\t%d\t%lf\n",\
  109. P->student[pos].name,P->student[pos].age,P->student[pos].score);
  110. printf("\n");
  111. }
  112. //按位置修改学生新信息
  113. int Update_pos(class_ptr P,int pos)
  114. {
  115. //判断合法性
  116. if(NULL == P || pos < 0 || pos>P->size)
  117. {
  118. printf("error\n");
  119. return -1;
  120. }
  121. //按位置重新输入刷新学生信息
  122. printf("请输入新学生姓名:");
  123. scanf("%s",P->student[pos].name);
  124. getchar();
  125. printf("请输入新学生年龄:");
  126. scanf("%d",&P->student[pos].age);
  127. getchar();
  128. printf("请输入新学生成绩:");
  129. scanf("%lf",&P->student[pos].score);
  130. getchar();
  131. printf("修改成功\n");
  132. return 0;
  133. }
  134. //按位置删除学生信息
  135. int Delete_pos(class_ptr P,int pos)
  136. {
  137. //判断合法性
  138. if(NULL == P || Full(P) || pos < 0 || pos>P->size)
  139. {
  140. printf("error\n");
  141. return -1;
  142. }
  143. //删除
  144. for(int i=pos+1;i<P->size;i++)
  145. {
  146. P->student[i-1] = P->student[i];
  147. }
  148. //删除成功
  149. P->size--;
  150. printf("删除成功\n");
  151. return 0;
  152. }
  153. //学生信息去重
  154. //按成绩降序排序
  155. void Sort_Stu(class_ptr P)
  156. {
  157. //判断合法性
  158. if(NULL == P || Full(P))
  159. {
  160. printf("error\n");
  161. return;
  162. }
  163. printf("************对学生成绩进行排序***********\n");
  164. for(int i=1;i<P->size;i++)
  165. {
  166. for(int j=0;j<P->size;j++)
  167. {
  168. if(P->student[j].score < P->student[j+1].score)
  169. {
  170. //交换位置
  171. datatype temp = P->student[j];
  172. P->student[j] = P->student[j+1];
  173. P->student[j+1] = temp;
  174. }
  175. }
  176. }
  177. //排序成功
  178. printf("排序成功\n");
  179. }
  180. //输出成绩最值学生信息
  181. void Print_Best(class_ptr P)
  182. {
  183. //判断是否成功申请内存
  184. if(NULL == P)
  185. {
  186. printf("error\n");
  187. return ;
  188. }
  189. //定义最值学生容器
  190. datatype stu_max;
  191. datatype stu_min;
  192. //定义最值分数容器
  193. double max_score = 0;
  194. double min_socre = 0;
  195. //将第一个学生当做最值
  196. stu_max = *P->student;
  197. stu_min = *P->student;
  198. max_score = P->student[0].score;
  199. min_socre = P->student[0].score;
  200. //循环比较刷新最值
  201. for(int i=1;i<P->size;i++)
  202. {
  203. if(P->student[i].score > max_score)
  204. {
  205. max_score = P->student[i].score;
  206. stu_max = P->student[i];
  207. }
  208. if(P->student[i].score < min_socre)
  209. {
  210. min_socre = P->student[i].score;
  211. stu_min = P->student[i];
  212. }
  213. }
  214. //输出成绩最值学生信息
  215. printf("************成绩最值学生信息************\n");
  216. printf("成绩最高学生信息:\n");
  217. printf("姓名\t年龄\t成绩\n\n");
  218. printf("%s\t%d\t%lf\n",\
  219. stu_max.name,stu_max.age,stu_max.score);
  220. printf("成绩最低学生信息:\n");
  221. printf("姓名\t年龄\t成绩\n\n");
  222. printf("%s\t%d\t%lf\n",\
  223. stu_min.name,stu_min.age,stu_min.score);
  224. }
  225. //销毁班级容器
  226. void destroy(class_ptr P)
  227. {
  228. //释放内存
  229. if(P != NULL)
  230. {
  231. free(P);
  232. P = NULL;
  233. }
  234. }

//主函数

  1. #include <myhead.h>
  2. #include "sys.h"
  3. int main(int argc, const char *argv[])
  4. {
  5. printf("\t\t************学生信息管理系统************\n");
  6. printf("\t\t=======1、 创建班级 =======\n");
  7. printf("\t\t=======2、 录入学生信息 =======\n");
  8. printf("\t\t=======3、 浏览学生信息 =======\n");
  9. printf("\t\t=======4、 查找学生信息 =======\n");
  10. printf("\t\t=======5、 修改学生信息 =======\n");
  11. printf("\t\t=======6、 删除学生信息 =======\n");
  12. printf("\t\t=======7、 学生成绩降序排序 =======\n");
  13. printf("\t\t=======8、 输出成绩最值学生信息 =======\n");
  14. printf("\t\t=======9、 销毁班级 =======\n");
  15. printf("\t\t=======0、 退出 =======\n");
  16. //菜单
  17. int menu =0;
  18. char value[20];
  19. //定义指针接收申请的班级结构体内存
  20. class_ptr P = NULL;
  21. do
  22. {
  23. printf("请输入选项>>>");
  24. scanf("%d",&menu);
  25. getchar();
  26. //多分支选择执行对应功能
  27. switch(menu)
  28. {
  29. case 1://创建班级
  30. //指针接收申请的班级结构体内存
  31. P =Create_Stu();
  32. break;
  33. case 2://录入学生信息
  34. Enter_Stu(P);
  35. break;
  36. case 3://浏览学生信息
  37. Print_Stu(P);
  38. break;
  39. case 4://查找学生信息
  40. {
  41. printf("请输入您需要查找的学生姓名:");
  42. scanf("%s",value);
  43. getchar();
  44. //按姓名查找学生位置
  45. int res4 = Search_name(P,value);
  46. //按位置输出学生信息
  47. Print_pos( P,res4);
  48. }
  49. break;
  50. case 5://修改学生信息
  51. {
  52. printf("请输入您需要修改的学生姓名:");
  53. scanf("%s",value);
  54. getchar();
  55. //按姓名查找学生位置
  56. int res5 = Search_name(P,value);
  57. //按位置修改学生新信息
  58. Update_pos(P,res5);
  59. }
  60. break;
  61. case 6://删除学生信息
  62. {
  63. printf("请输入您需要删除的学生姓名:");
  64. scanf("%s",value);
  65. getchar();
  66. //按姓名查找学生位置
  67. int res6 = Search_name(P,value);
  68. //按位置删除学生新信息
  69. Delete_pos(P,res6);
  70. }
  71. break;
  72. case 7://按成绩降序排序
  73. Sort_Stu(P);
  74. //输出排序后信息
  75. Print_Stu(P);
  76. break;
  77. case 8://输出成绩最值学生信息
  78. Print_Best(P);
  79. break;
  80. case 9://销毁班级容器
  81. destroy(P);
  82. P = NULL;
  83. printf("销毁成功\n");
  84. break;
  85. case 0://退出
  86. break;
  87. default:
  88. printf("输入错误,请重新输入\n");
  89. break;
  90. }
  91. } while(menu !=0);
  92. return 0;
  93. }

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

闽ICP备14008679号