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