实验一:用顺序表实现学生管理系统
1. 问题分析描述
学生管理系统:
包括学号,姓名,性别,年龄
学生存储结构为顺序表
顺序表用动态内存分配实现创建,初始容量为 1(也可以为 0)
顺带还有:
Cursize 当前顺序表中已存入的数量
Maxsize 当前顺序表可以存的最大数量
当插入时,先判断 cursize 是否大于等于 maxsize(存没存满)如果大于等于了(存满了)
Maxsize 扩大的规则:判断 maxsize/2 是否大于 1,如果大于了那么 maxsize 扩大到原来的
1.5 倍,如果小于 1,就扩大 1 就行了这样可以尽量避免内存浪费,又避免了总是进行分配内存
操作导致的时间复杂度变高
主要功能:
初始化:
创建顺序表,给顺序表动态内存分配 1 个学生空间
将 cursize 置空
Maxsize 为 1
以 r+的方式打开 stuInfo.txt 文件读取存入文件的学生信息
用尾插的方式将每次读到的学生信息存入顺序表
增加学生
尾插(插在最后一个学生后面)
插入指定学号后面
插入指定姓名后面
需要输入学生的学号,姓名,性别,年龄
学号必须输入并且不能有重复
删除学生
尾删(删除最后一个学生)
根据学号删除学生
根据姓名删除学生
姓名可能会有重复,将所有同名的学生输出出来让用户选择删哪个
修改学生
根据学号修改学生信息
根据姓名修改学生信息
姓名可能有重复,默认修改第一个找到的学生的姓名(本来想跟删除一样同名的全部展示
出来的,但是没时间写了)
查询学生
根据学号查询学生信息
根据姓名查询学生信息
如有相同姓名则一并展示出来
文件存储到本地 stuInfo.txt 中
结束的时候销毁顺序表
2. 程序代码
1. #include <stdio.h>
2. #include<stdlib.h>
3. #include<malloc.h>
4. #include<string.h>
5. #include<stdbool.h>
6.
7. //
创建学生结构
8. struct student
9. {
10. long long int ID; //
学号
11. char name[11]; //
姓名
12. char gender[3]; //
性别
13. int age; //
年龄
14. };
15.
16. //
创建存学生的顺序表
17. struct stuSqList {
18. struct student* parr;
19. int curSize; //
数组中当前已经存储的学生信息数量
20. int maxSize; //
数组的总大小
21. };
22.
23. //
创建学生顺序表函数
24. struct stuSqList* createSqList();
25.
26. //
初始化顺序表函数
27. void initSqList(struct stuSqList* l);
28.
29. //
创建学生类型
30. struct student createStu(long long int ID, char* name, char* gend
er, int age);
31.
32. //
学生添加菜单
33. void stuInsertMenu(struct stuSqList* list);
34.
35. //
学生删除菜单
36. void stuDelMenu(struct stuSqList* list);
37.
38. //
学生修改菜单
39. void stuModifyMenu(struct stuSqList* list);
40.
41. //
学生查询菜单
42. void stuSearchMenu(struct stuSqList* list);
43.
44. //
尾插
45. void push(struct stuSqList* l, struct student s);
46.
47. //
根据学号中间插
48. void midInsertByID(struct stuSqList* l, struct student s, long lo
ng int ID);
49.
50. //
根据姓名中间插(如果有重名默认插在第一个的后面)
51. void midInsertByName(struct stuSqList* l, struct student s, char*
name);
52.
53. //
遍历
54. void travel(struct stuSqList* list);
55.
56. //
根据学号遍历
(
返回下标
)
57. int travelByID(struct stuSqList* l, long long int ID);
58.
59. //
根据姓名遍历(返回下标)
60. int travelByName(struct stuSqList* l,char* name);
61.
62. //
尾删
63. void pop(struct stuSqList* l);
64.
65. //
根据学号删除学生
66. void delStuByID(struct stuSqList* l, long long int ID);
67.
68. //
根据姓名删除学生
69. void delStuByName(struct stuSqList* l, char* name);
70.
71. //
根据学号修改学生信息
72. void modifyByID(struct stuSqList* l, long long int ID);
73.
74. //
根据姓名修改学生信息
75. void modifyByName(struct stuSqList* l, char* name);
76.
77. //
文件操作
78. //
退出系统的时候保存到本地文件
stuInfo.txt
中
79. void saveToFile(struct stuSqList* l);
80.
81. //
退出前销毁顺序表
82. void destory(struct stuSqList* l);
83.
84. int main() {
85. //
创建顺序表
86. struct stuSqList* list = createSqList();
87. //
初始化顺序表
88. initSqList(list);
89. //
菜单选择
90. int select;
91. while (true)
92. {
93. system("cls");
94. printf("======================== 学生管理系统
========================\n");
95. printf("\t\t -------------------------------\n");
96. printf("\t\t| |\n");
97. printf("\t\t| 1.学生添加 |\n");
98. printf("\t\t| |\n");
99. printf("\t\t| 2.学生删除 |\n");
100. printf("\t\t| |\n");
101. printf("\t\t| 3.学生修改 |\n");
102. printf("\t\t| |\n");
103. printf("\t\t| 4.学生查询 |\n");
104. printf("\t\t| |\n");
105. printf("\t\t| 5.全部学生 |\n");
106. printf("\t\t| |\n");
107. printf("\t\t| 0.保存退出 |\n");
108. printf("\t\t| |\n");
109. printf("\t\t -------------------------------\n");
110. printf("\n\t\t 请输入你的选择:");
111. scanf("%d", &select);
112. switch (select)
113. {
114. case 0:
115. //
先将改完的表保存到文件
116. saveToFile(list);
117. //
再销毁顺序表
118. destory(list);
119. //
最后退出
120. exit(0);
121. break;
122. case 1:
123. stuInsertMenu(list);
124. break;
125. case 2:
126. stuDelMenu(list);
127. break;
128. case 3:
129. stuModifyMenu(list);
130. break;
131. case 4:
132. stuSearchMenu(list);
133. break;
134. case 5:
135. travel(list);
136. break;
137. default:
138. printf("输入选项有误,请重新输入!");
139. system("pause");
140. system("cls");
141. break;
142. }
143. }
144. return 0;
145. }
146.
147. //
创建学生顺序表函数
148. struct stuSqList* createSqList(){
149. struct stuSqList* pNew = malloc(sizeof(struct stuSqList));
150. while (NULL == pNew) {
151. pNew = malloc(sizeof(struct stuSqList));
152. }
153. return pNew;
154. }
155.
156. //
初始化顺序表函数
157. void initSqList(struct stuSqList* l) {
158. l->parr = malloc(1 * sizeof(struct student));
159. l->curSize = 0;
160. l->maxSize = 1;
161. //
文件操作,将本地文件
stuInfo.txt
里的学生信息填入顺序表
162. FILE* fp = fopen("stuInfo.txt", "r+");
163. while (NULL == fp)
164. {
165. printf("文件打开失败,正在重试...\n");
166. fp = fopen("stuInfo.txt", "w+");
167. }
168. struct student s;
169. while (EOF != fscanf(fp, "%lld %s %s %d", &s.ID, s.name, s.gend
er, &s.age)) {
170. push(l, s);