经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C语言实现学生信息管理系统(文件操作)
来源:jb51  时间:2022/6/20 14:22:43  对本文有异议

本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下

前言:与上篇文章相比,增加了文件操作,可将任意时期的的学生数据存储再文件中,菜单也随之改动,增加了文件操作一栏,是否存储到相应文件中由使用者决定

新增函数——文件操作;

  1. //学生数据文件储存?
  2. //储存任意时期的学生数据?
  3. void Store_List(Link head)
  4. {
  5. ?? ?//文件操作?
  6. ?? ?ofstream ofs;
  7. ?? ?ofs.open("Std_Information.txt",ios::out);
  8. ?? ?
  9. ?? ?if(head==NULL)
  10. ?? ?{
  11. ?? ??? ?printf("学生为空\n");
  12. ?? ??? ?return;?
  13. ?? ?}
  14. ?? ?else
  15. ?? ?{
  16. ?? ??? ?Link p=head->next;
  17. ?? ??? ?while(p)
  18. ?? ??? ?{
  19. ?? ??? ??? ?ofs<< "姓名:"<<p->data.studentName<<" ? ?学号:"<<p->data.studentNo<<" ?成绩:"<<p->data.score<<endl;?
  20. ?? ??? ??? ?p=p->next;
  21. ?? ??? ?}
  22. ?? ??? ?
  23. ?? ?}
  24. }

1.头文件和预处理

  1. #include <stdio.h>
  2. #include<string.h>
  3. #include<malloc.h>
  4. #include<stdlib.h>
  5. #include<stdbool.h>
  6. #include<iostream>
  7. #include<fstream>//文件操作所需头文件?
  8. using namespace std;
  9. #define NO_LENGTH ?20
  10. #define NAME_LENGTH 11
  11.  
  12. /* 定义学生结构体的数据结构 */
  13. typedef struct Student{
  14. ?? ?char studentNo[NO_LENGTH];
  15. ?? ?char studentName[NAME_LENGTH];
  16. ?? ?int score;
  17. }st;
  18.  
  19. /* 定义每条记录或节点的数据结构 */
  20. typedef struct node
  21. {
  22. ?? ?struct Student data; //数据域
  23. ?? ?struct node *next; //指针域
  24. }Node,*Link; ?//Node为node类型的别名,Link为node类型的指针别名

2.定义学生结构体的数据结构

  1. typedef struct Student{
  2. ?? ?char studentNo[NO_LENGTH];
  3. ?? ?char studentName[NAME_LENGTH];
  4. ?? ?int score;
  5. }st;

3.定义每条记录或节点的数据结构

  1. /* 定义每条记录或节点的数据结构 */
  2. typedef struct node
  3. {
  4. ?? ?struct Student data; //数据域
  5. ?? ?struct node *next; //指针域
  6. }Node,*Link; ?//Node为node类型的别名,Link为node类型的指针别名

4.函数接口代码.

1.定义提示菜单

  1. //定义提示菜单
  2. void myMenu(){
  3.  
  4. ?? ?printf("*****************************菜单*****************************\n");?
  5. ?? ?printf("***********************1 增加学生记录*************************\n");?
  6. ?? ?printf("***********************2 删除学生记录*************************\n");?
  7. ?? ?printf("***********************3 查找学生记录*************************\n");?
  8. ?? ?printf("***********************4 修改学生记录*************************\n");?
  9. ?? ?printf("***********************5 统计学生人数 ************************\n");?
  10. ?? ?printf("***********************6 显示学生记录*************************\n");?
  11. ?? ?printf("***********************7 信息文件打印*************************\n");
  12. ?? ?printf("***********************8 退出系统 ****************************\n");?
  13. ?? ?
  14. }

2.增加学生记录

  1. void inputStudent(Link l){
  2. ?? ? printf("请输入学生学号:");
  3. ?? ? scanf("%s",l->data.studentNo);
  4. ?? ? printf("请输入学生的姓名:");
  5. ?? ? scanf("%s",l->data.studentName);
  6. ?? ?printf("请输入学生的成绩:");
  7. ?? ? scanf("%s",&(l->data.score));
  8. ?? ? //每个新创建的节点的next域都初始化为NULL
  9. ?? ? l->next = NULL;
  10. ?? ? system("cls");
  11. }

3.输入学号接口·

  1. void inputStudentNo(char s[],char no[]){
  2. ?? ?printf("请输入要%s的学生学号:",s);
  3. ?? ?scanf("%s",no);
  4. }

4.遍历表中学生

  1. //遍历表中学生?
  2. void displayNode(Link head){
  3. ?? ?if(head==NULL)
  4. ?? ?{
  5. ?? ??? ?printf("学生为空\n");
  6. ?? ??? ?return;?
  7. ?? ?}
  8. ?? ?else
  9. ?? ?{
  10. ?? ??? ?Link p=head->next;
  11. ?? ??? ?while(p)
  12. ?? ??? ?{
  13. ?? ??? ??? ?cout<<"姓名:"<<p->data.studentName<<" ? ?学号"<<p->data.studentNo<<" ?成绩:"<<p->data.score<<endl;?
  14. ?? ??? ??? ?p=p->next;
  15. ?? ??? ?}
  16. ?? ??? ?
  17. ?? ?}
  18. ? ?// 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
  19. ? ?system("pause");
  20. ? ?system("cls");
  21. }

5.增加学生记录

  1. /* 增加学生记录 */
  2. bool addNode(Link head){
  3. ?? ? Link p,q; ? //p,q两个节点一前一后
  4. ?? ? Link node; ?//node指针指向新创建的节点
  5. ?? ? node=(Link)malloc(sizeof(Node));
  6. ?? ? inputStudent(node);
  7.  
  8. ?? ? q = head;
  9. ?? ? p = head->next; ?//q指向head后面的第一个有效节点
  10. ?? ? if(head->next==NULL)
  11. ?? ??? ? //链表为空时
  12. ?? ??? ?head->next = node;
  13. ?? ? else {
  14. ?? ??? ? //循环访问链表中的所有节点
  15. ?? ??? ?while(p != NULL){
  16. ?? ??? ??? ?if (node->data.studentNo < p->data.studentNo){
  17. ?? ??? ??? ??? ?//如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
  18. ?? ??? ??? ??? ?q->next = node;
  19. ?? ??? ??? ??? ?node->next = p;
  20. ?? ??? ??? ??? ?return true;
  21. ?? ??? ??? ?}
  22. ?? ??? ??? ?else{
  23. ?? ??? ??? ??? ?//如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
  24. ?? ??? ??? ??? ?q = p;
  25. ?? ??? ??? ??? ?p = p->next;
  26.  
  27. ?? ??? ??? ?}
  28. ?? ??? ?}
  29. ?? ??? ?//如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
  30. ?? ??? ?q->next = node;
  31.  
  32. ?? ?}
  33. ?? ? return true;
  34. ?? ? system("pause");
  35. ? ?system("cls");
  36. }

6.删除学生信息

  1. //删除学生信息
  2. bool deleteNode(Link head){
  3. ? ? // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false
  4.  
  5. ? ? //输入要处理的学号
  6. ? ? ?? ?char no[NO_LENGTH];
  7. ?? ?inputStudentNo("删除",no);
  8. ?? ??? ?Link p=head->next;
  9. ?? ?Link q=head;
  10. ?? ?while(p)
  11. ?? ?{
  12. ?? ??? ?if(strcmp(p->data.studentNo,no)==0)
  13. ?? ??? ?{
  14. ?? ??? ??? ?cout<<"成功删除该学生"<<endl;?
  15. ?? ??? ??? ?q->next=p->next;
  16. ?? ??? ??? ?free(p);
  17. ?? ??? ??? ?system("pause");
  18. ? ??? ??? ??? ?system("cls");
  19. ?? ??? ??? ?return true;
  20. ?? ??? ?}
  21. ?? ??? ?else
  22. ?? ??? ?{
  23. ?? ??? ??? ?q=p;
  24. ?? ??? ??? ?p=p->next;
  25. ?? ??? ?}
  26. ?? ?}
  27. ?? ?cout<<"未找到该学生"<<endl;?
  28. ?? ??? ?system("pause");
  29. ? ??? ??? ?system("cls");
  30. ?? ?return false;
  31. }

7.查找学生信息

  1. //查找学生信息?
  2. bool queryNode(Link head){
  3. ? ? // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false
  4.  
  5. ? ? //输入要处理的学号
  6. ?? ?char no[NO_LENGTH];
  7. ?? ?inputStudentNo("查找",no);
  8. ?? ??? ?Link p=head->next;
  9. ?? ?while(p)
  10. ?? ?{
  11. ?? ??? ?if(strcmp(p->data.studentNo,no)==0)
  12. ?? ??? ?{
  13. ?? ??? ??? ?
  14. ? ??? ??? ??? ?system("cls");
  15. ? ??? ??? ??? ?cout<<"姓名:"<<p->data.studentName<<" ? ?学号:"<<p->data.studentNo<<" ?成绩:"<<p->data.score<<endl;?
  16. ?? ??? ??? ?return true;
  17. ?? ??? ?}
  18. ?? ??? ?else
  19. ?? ??? ?{
  20. ?? ??? ??? ?p=p->next;
  21. ?? ??? ?}
  22. ?? ?}
  23. ?? ?cout<<"未找到该学生"<<endl;?
  24. ? ?system("cls");
  25.  
  26. ?? ?return false;
  27. }

8.修改学生信息

  1. //修改学生信息?
  2. bool modifyNode(Link head){
  3. ? ? // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
  4. ?? ?
  5. ? ? //输入要处理的学号
  6. ?? ?char no[NO_LENGTH];
  7. ?? ?inputStudentNo("修改",no);
  8. ?? ?Link p=head->next;
  9. ?? ?while(p)
  10. ?? ?{
  11. ?? ??? ?if(strcmp(p->data.studentNo,no)==0)
  12. ?? ??? ?{
  13. ?? ??? ??? ?cout<<"请输入修改后的姓名"<<endl;?
  14. ?? ??? ??? ?cin>>p->data.studentName;
  15. ?? ??? ??? ?cout<<"请输入修改后的学号"<<endl;?
  16. ?? ??? ??? ?cin>>p->data.studentNo;
  17. ?? ??? ??? ?cout<<"请输入修改后的成绩"<<endl;?
  18. ?? ??? ??? ?cin>>p->data.score;
  19. ?? ??? ??? ?system("cls");
  20. ?? ??? ??? ?return true;
  21. ?? ??? ?}
  22. ?? ??? ?else
  23. ?? ??? ?{
  24. ?? ??? ??? ?p=p->next;
  25. ?? ??? ?}
  26. ?? ?}
  27. ?? ?cout<<"未找到该学生,请重新输入学号"<<endl;?
  28. ?? ?system("cls");
  29. ?? ?return false;
  30. }

9.统计学生人数

  1. //统计学生人数
  2. int countNode(Link head){
  3. ?? ?//统计学生人数,扫描链表统计节点个数,返回节点数
  4. ?? ?Link p;
  5. ?? ?int count = 0;
  6. ?? ?p = head->next;
  7. ?? ?while(p)
  8. ?? ?{
  9. ?? ??? ?p=p->next;
  10. ?? ??? ?count++;
  11. ?? ?}
  12. ?? ?//填充代码
  13. ?? ?system("cls");
  14. ?? ?return count;
  15. }

10.清空链表

  1. //清空链表?
  2. void clearLink(Link head){
  3. ?? ?Link q,p;
  4. ?? ?p=head->next;
  5. ?? ?q=head;
  6. ?? ?while(p)
  7. ?? ?{
  8. ?? ??? ?q->next=p->next;
  9. ?? ??? ?free(p);
  10. ?? ??? ?p=q->next;
  11. ?? ?}
  12. ? ? ? ? //遍历链表,用free语句删除链表中用malloc建立起的所有的节点
  13. }

11.文件操作

  1. //学生数据文件储存?
  2. //储存任意时期的学生数据?
  3. void Store_List(Link head)
  4. {
  5. ?? ?//文件操作?
  6. ?? ?ofstream ofs;
  7. ?? ?ofs.open("Std_Information.txt",ios::out);
  8. ?? ?
  9. ?? ?if(head==NULL)
  10. ?? ?{
  11. ?? ??? ?printf("学生为空\n");
  12. ?? ??? ?return;?
  13. ?? ?}
  14. ?? ?else
  15. ?? ?{
  16. ?? ??? ?Link p=head->next;
  17. ?? ??? ?while(p)
  18. ?? ??? ?{
  19. ?? ??? ??? ?ofs<< "姓名:"<<p->data.studentName<<" ? ?学号:"<<p->data.studentNo<<" ?成绩:"<<p->data.score<<endl;?
  20. ?? ??? ??? ?p=p->next;
  21. ?? ??? ?}
  22. ?? ??? ?
  23. ?? ?}
  24. }

5.main函数

  1. int main() {
  2. ?? ?int select;
  3. ? ? ?? ?int count;
  4. ?? ?Link head; ?// 定义链表
  5.  
  6. ?? ?//建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
  7. ?? ?head = (Link)malloc(sizeof(Node));
  8. ?? ?head->next = NULL;
  9.  
  10. ?? ?while(1)
  11. ?? ?{
  12. ?? ??? ?myMenu();
  13. ?? ??? ?printf("\n请输入你的选择(0-7):"); ?//显示提示信息
  14. ?? ??? ?scanf("%d",&select);
  15. ?? ??? ?switch(select)
  16. ?? ??? ?{
  17. ?? ??? ?case 1:
  18. ?? ??? ??? ?//增加学生记录
  19. ?? ??? ??? ?if(addNode(head))
  20. ?? ??? ??? ??? ?printf("成功插入一个学生记录。\n\n");
  21. ?? ??? ??? ?break;
  22. ?? ??? ?case 2:
  23. ?? ??? ??? ?//删除学生记录
  24. ?? ??? ??? ?if(deleteNode(head))
  25. ?? ??? ??? ??? ?printf("成功删除一个学生记录。\n\n");
  26. ?? ??? ??? ?else
  27. ?? ??? ??? ??? ?printf("没有找到要删除的学生节点。\n\n");
  28. ?? ??? ??? ?break;
  29. ?? ??? ?case 3:
  30. ?? ??? ??? ?//查询学生记录
  31. ?? ??? ??? ?if(queryNode(head))
  32. ?? ??? ??? ??? ?printf("成功找到学生记录。\n\n");
  33. ?? ??? ??? ?else
  34. ?? ??? ??? ??? ?printf("没有找到要查询的学生节点。\n\n");
  35. ?? ??? ??? ?break;
  36. ?? ??? ?case 4:
  37. ?? ??? ??? ?//修改学生记录
  38. ?? ??? ??? ?if(modifyNode(head))
  39. ?? ??? ??? ??? ?printf("成功修改一个学生记录。\n\n");
  40. ?? ??? ??? ?else
  41. ?? ??? ??? ??? ?printf("没有找到要修改的学生节点。\n\n");
  42. ?? ??? ??? ?break;
  43. ?? ??? ?case 5:
  44. ?? ??? ??? ?//统计学生人数
  45. ?? ??? ??? ?count = countNode(head);
  46. ?? ??? ??? ?printf("学生人数为:%d\n\n",count);
  47. ?? ??? ??? ?break;
  48. ?? ??? ?case 6:
  49. ?? ??? ??? ?//显示学生记录
  50. ?? ??? ??? ?displayNode(head);
  51. ?? ??? ??? ?break;
  52. ?? ??? ?case 7:
  53. ?? ??? ??? ?//退出前清除链表中的所有结点
  54. ? ? ? ? ? ? clearLink(head);
  55. ?? ??? ??? ?return 0;
  56. ?? ??? ?default:
  57. ?? ??? ??? ?printf("输入不正确,应该输入0-7之间的数。\n\n");
  58. ?? ??? ??? ?system("cls");?
  59. ?? ??? ??? ?break;
  60. ?? ??? ?}
  61. ?? ?}
  62. ?? ?return 0;
  63. }

6.学生信息管理系统总源码(可直接复制运行)

  1. #include <stdio.h>
  2. #include<string.h>
  3. #include<malloc.h>
  4. #include<stdlib.h>
  5. #include<stdbool.h>
  6. #include<iostream>
  7. #include<fstream>//文件操作所需头文件?
  8. using namespace std;
  9. #define NO_LENGTH ?20
  10. #define NAME_LENGTH 11
  11.  
  12. /* 定义学生结构体的数据结构 */
  13. typedef struct Student{
  14. ?? ?char studentNo[NO_LENGTH];
  15. ?? ?char studentName[NAME_LENGTH];
  16. ?? ?int score;
  17. }st;
  18.  
  19. /* 定义每条记录或节点的数据结构 */
  20. typedef struct node
  21. {
  22. ?? ?struct Student data; //数据域
  23. ?? ?struct node *next; //指针域
  24. }Node,*Link; ?//Node为node类型的别名,Link为node类型的指针别名
  25.  
  26. //定义提示菜单
  27. void myMenu(){
  28.  
  29. ?? ?printf("*****************************菜单*****************************\n");?
  30. ?? ?printf("***********************1 增加学生记录*************************\n");?
  31. ?? ?printf("***********************2 删除学生记录*************************\n");?
  32. ?? ?printf("***********************3 查找学生记录*************************\n");?
  33. ?? ?printf("***********************4 修改学生记录*************************\n");?
  34. ?? ?printf("***********************5 统计学生人数 ************************\n");?
  35. ?? ?printf("***********************6 显示学生记录*************************\n");?
  36. ?? ?printf("***********************7 信息文件打印*************************\n");
  37. ?? ?printf("***********************8 退出系统 ****************************\n");?
  38. ?? ?
  39. }
  40.  
  41. void inputStudent(Link l){
  42. ?? ? printf("请输入学生学号:");
  43. ?? ? scanf("%s",l->data.studentNo);
  44. ?? ? printf("请输入学生的姓名:");
  45. ?? ? scanf("%s",l->data.studentName);
  46. ?? ?printf("请输入学生的成绩:");
  47. ?? ? scanf("%d",&(l->data.score));
  48. ?? ? //每个新创建的节点的next域都初始化为NULL
  49. ?? ? l->next = NULL;
  50. ?? ? system("cls");
  51. }
  52.  
  53. void inputStudentNo(char s[],char no[]){
  54. ?? ?printf("请输入要%s的学生学号:",s);
  55. ?? ?scanf("%s",no);
  56. }
  57. //遍历表中学生?
  58. void displayNode(Link head){
  59. ?? ?if(head==NULL)
  60. ?? ?{
  61. ?? ??? ?printf("学生为空\n");
  62. ?? ??? ?return;?
  63. ?? ?}
  64. ?? ?else
  65. ?? ?{
  66. ?? ??? ?Link p=head->next;
  67. ?? ??? ?while(p)
  68. ?? ??? ?{
  69. ?? ??? ??? ?cout<<"姓名:"<<p->data.studentName<<" ? ?学号"<<p->data.studentNo<<" ?成绩:"<<p->data.score<<endl;?
  70. ?? ??? ??? ?//ofs<< "姓名:"<<p->data.studentName<<" ? ?学号"<<p->data.studentNo<<" ?成绩:"<<p->data.score<<endl;?
  71. ?? ??? ??? ?p=p->next;
  72. ?? ??? ?}
  73. ?? ??? ?
  74. ?? ?}
  75. ? ?// 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
  76. ? ?system("pause");
  77. ? ?system("cls");
  78. }
  79.  
  80. /* 增加学生记录 */
  81. bool addNode(Link head){
  82. ?? ? Link p,q; ? //p,q两个节点一前一后
  83. ?? ? Link node; ?//node指针指向新创建的节点
  84. ?? ? node=(Link)malloc(sizeof(Node));
  85. ?? ? inputStudent(node);
  86.  
  87. ?? ? q = head;
  88. ?? ? p = head->next; ?//q指向head后面的第一个有效节点
  89. ?? ? if(head->next==NULL)
  90. ?? ??? ? //链表为空时
  91. ?? ??? ?head->next = node;
  92. ?? ? else {
  93. ?? ??? ? //循环访问链表中的所有节点
  94. ?? ??? ?while(p != NULL){
  95. ?? ??? ??? ?if (node->data.studentNo < p->data.studentNo){
  96. ?? ??? ??? ??? ?//如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
  97. ?? ??? ??? ??? ?q->next = node;
  98. ?? ??? ??? ??? ?node->next = p;
  99. ?? ??? ??? ??? ?return true;
  100. ?? ??? ??? ?}
  101. ?? ??? ??? ?else{
  102. ?? ??? ??? ??? ?//如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
  103. ?? ??? ??? ??? ?q = p;
  104. ?? ??? ??? ??? ?p = p->next;
  105.  
  106. ?? ??? ??? ?}
  107. ?? ??? ?}
  108. ?? ??? ?//如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
  109. ?? ??? ?q->next = node;
  110.  
  111. ?? ?}
  112. ?? ? return true;
  113. ?? ? system("pause");
  114. ? ?system("cls");
  115. }
  116.  
  117. bool deleteNode(Link head){
  118. ? ? // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false
  119.  
  120. ? ? //输入要处理的学号
  121. ? ? ?? ?char no[NO_LENGTH];
  122. ?? ?inputStudentNo("删除",no);
  123. ?? ??? ?Link p=head->next;
  124. ?? ?Link q=head;
  125. ?? ?while(p)
  126. ?? ?{
  127. ?? ??? ?if(strcmp(p->data.studentNo,no)==0)
  128. ?? ??? ?{
  129. ?? ??? ??? ?cout<<"成功删除该学生"<<endl;?
  130. ?? ??? ??? ?q->next=p->next;
  131. ?? ??? ??? ?free(p);
  132. ?? ??? ??? ?system("pause");
  133. ? ??? ??? ??? ?system("cls");
  134. ?? ??? ??? ?return true;
  135. ?? ??? ?}
  136. ?? ??? ?else
  137. ?? ??? ?{
  138. ?? ??? ??? ?q=p;
  139. ?? ??? ??? ?p=p->next;
  140. ?? ??? ?}
  141. ?? ?}
  142. ?? ?cout<<"未找到该学生"<<endl;?
  143. system("pause");
  144. ? ?system("cls");
  145. ?? ?return false;
  146. }
  147.  
  148. //查找学生信息?
  149. bool queryNode(Link head){
  150. ? ? // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false
  151.  
  152. ? ? //输入要处理的学号
  153. ?? ?char no[NO_LENGTH];
  154. ?? ?inputStudentNo("查找",no);
  155. ?? ??? ?Link p=head->next;
  156. ?? ?while(p)
  157. ?? ?{
  158. ?? ??? ?if(strcmp(p->data.studentNo,no)==0)
  159. ?? ??? ?{
  160. ?? ??? ??? ?
  161. ? ??? ??? ??? ?system("cls");
  162. ? ??? ??? ??? ?cout<<"姓名:"<<p->data.studentName<<" ? ?学号:"<<p->data.studentNo<<" ?成绩:"<<p->data.score<<endl;?
  163. ?? ??? ??? ?return true;
  164. ?? ??? ?}
  165. ?? ??? ?else
  166. ?? ??? ?{
  167. ?? ??? ??? ?p=p->next;
  168. ?? ??? ?}
  169. ?? ?}
  170. ?? ?cout<<"未找到该学生"<<endl;?
  171. ? ?system("cls");
  172.  
  173. ?? ?return false;
  174. }
  175.  
  176. //修改学生信息?
  177. bool modifyNode(Link head){
  178. ? ? // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
  179. ?? ?
  180. ? ? //输入要处理的学号
  181. ?? ?char no[NO_LENGTH];
  182. ?? ?inputStudentNo("修改",no);
  183. ?? ?Link p=head->next;
  184. ?? ?while(p)
  185. ?? ?{
  186. ?? ??? ?if(strcmp(p->data.studentNo,no)==0)
  187. ?? ??? ?{
  188. ?? ??? ??? ?cout<<"请输入修改后的姓名"<<endl;?
  189. ?? ??? ??? ?cin>>p->data.studentName;
  190. ?? ??? ??? ?cout<<"请输入修改后的学号"<<endl;?
  191. ?? ??? ??? ?cin>>p->data.studentNo;
  192. ?? ??? ??? ?cout<<"请输入修改后的成绩"<<endl;?
  193. ?? ??? ??? ?cin>>p->data.score;
  194. ?? ??? ??? ?system("cls");
  195. ?? ??? ??? ?return true;
  196. ?? ??? ?}
  197. ?? ??? ?else
  198. ?? ??? ?{
  199. ?? ??? ??? ?p=p->next;
  200. ?? ??? ?}
  201. ?? ?}
  202. ?? ?cout<<"未找到该学生,请重新输入学号"<<endl;?
  203. ?? ?system("cls");
  204. ?? ?return false;
  205. }
  206.  
  207. //统计学生人数
  208. int countNode(Link head){
  209. ?? ?//统计学生人数,扫描链表统计节点个数,返回节点数
  210. ?? ?Link p;
  211. ?? ?int count = 0;
  212. ?? ?p = head->next;
  213. ?? ?while(p)
  214. ?? ?{
  215. ?? ??? ?p=p->next;
  216. ?? ??? ?count++;
  217. ?? ?}
  218. ?? ?//填充代码
  219. ?? ?system("cls");
  220. ?? ?return count;
  221. }
  222.  
  223. //清空链表?
  224. void clearLink(Link head){
  225. ?? ?Link q,p;
  226. ?? ?p=head->next;
  227. ?? ?q=head;
  228. ?? ?while(p)
  229. ?? ?{
  230. ?? ??? ?q->next=p->next;
  231. ?? ??? ?free(p);
  232. ?? ??? ?p=q->next;
  233. ?? ?}
  234. ? ? ? ? //遍历链表,用free语句删除链表中用malloc建立起的所有的节点
  235. }
  236.  
  237. //学生数据文件储存?
  238. //储存任意时期的学生数据?
  239. void Store_List(Link head)
  240. {
  241. ?? ?//文件操作?
  242. ?? ?ofstream ofs;
  243. ?? ?ofs.open("Std_Information.txt",ios::out);
  244. ?? ?
  245. ?? ?if(head==NULL)
  246. ?? ?{
  247. ?? ??? ?printf("学生为空\n");
  248. ?? ??? ?return;?
  249. ?? ?}
  250. ?? ?else
  251. ?? ?{
  252. ?? ??? ?Link p=head->next;
  253. ?? ??? ?while(p)
  254. ?? ??? ?{
  255. ?? ??? ??? ?ofs<< "姓名:"<<p->data.studentName<<" ? ?学号:"<<p->data.studentNo<<" ?成绩:"<<p->data.score<<endl;?
  256. ?? ??? ??? ?p=p->next;
  257. ?? ??? ?}
  258. ?? ??? ?
  259. ?? ?}
  260. }
  261. int main() {
  262. ?? ?int select;
  263. ? ? ?? ?int count;
  264. ?? ?Link head; ?// 定义链表
  265. ?? ?
  266. ?? ?
  267. ?? ?//建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
  268. ?? ?head = (Link)malloc(sizeof(Node));
  269. ?? ?head->next = NULL;
  270.  
  271. ?? ?while(1)
  272. ?? ?{
  273. ?? ??? ?myMenu();
  274. ?? ??? ?printf("\n请输入你的选择(0-8):"); ?//显示提示信息
  275. ?? ??? ?scanf("%d",&select);
  276. ?? ??? ?switch(select)
  277. ?? ??? ?{
  278. ?? ??? ?case 1:
  279. ?? ??? ??? ?//增加学生记录
  280. ?? ??? ??? ?if(addNode(head))
  281. ?? ??? ??? ??? ?printf("成功插入一个学生记录。\n\n");
  282. ?? ??? ??? ?break;
  283. ?? ??? ?case 2:
  284. ?? ??? ??? ?//删除学生记录
  285. ?? ??? ??? ?if(deleteNode(head))
  286. ?? ??? ??? ??? ?printf("成功删除一个学生记录。\n\n");
  287. ?? ??? ??? ?else
  288. ?? ??? ??? ??? ?printf("没有找到要删除的学生节点。\n\n");
  289. ?? ??? ??? ?break;
  290. ?? ??? ?case 3:
  291. ?? ??? ??? ?//查询学生记录
  292. ?? ??? ??? ?if(queryNode(head))
  293. ?? ??? ??? ??? ?printf("成功找到学生记录。\n\n");
  294. ?? ??? ??? ?else
  295. ?? ??? ??? ??? ?printf("没有找到要查询的学生节点。\n\n");
  296. ?? ??? ??? ?break;
  297. ?? ??? ?case 4:
  298. ?? ??? ??? ?//修改学生记录
  299. ?? ??? ??? ?if(modifyNode(head))
  300. ?? ??? ??? ??? ?printf("成功修改一个学生记录。\n\n");
  301. ?? ??? ??? ?else
  302. ?? ??? ??? ??? ?printf("没有找到要修改的学生节点。\n\n");
  303. ?? ??? ??? ?break;
  304. ?? ??? ?case 5:
  305. ?? ??? ??? ?//统计学生人数
  306. ?? ??? ??? ?count = countNode(head);
  307. ?? ??? ??? ?printf("学生人数为:%d\n\n",count);
  308. ?? ??? ??? ?break;
  309. ?? ??? ?case 6:
  310. ?? ??? ??? ?//显示学生记录
  311. ?? ??? ??? ?displayNode(head);
  312. ?? ??? ??? ?break;
  313. ?? ??? ?case 7:Store_List(head);
  314. ?? ??? ??? ??? ?cout<<"打印成功"<<endl;?
  315. ?? ??? ??? ??? ?system("pause");
  316. ? ??? ??? ??? ??? ?system("cls");
  317. ?? ??? ??? ?break;
  318. ?? ??? ?case 8:
  319. ?? ??? ??? ?//退出前清除链表中的所有结点
  320. ? ? ? ? ? ? clearLink(head);
  321. ?? ??? ??? ?return 0;
  322. ?? ??? ?default:
  323. ?? ??? ??? ?printf("输入不正确,应该输入0-8之间的数。\n\n");
  324. ?? ??? ??? ?system("pause");
  325. ?? ??? ??? ?system("cls");?
  326. ?? ??? ??? ?break;
  327. ?? ??? ?}
  328. ?? ?}
  329. ?? ?return 0;
  330. }

7.测试结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号