实现功能:
.h文件
1 #ifndef STUDENT_SYS
2 #define STUDENT_SYS
3 #include<myhead.h>
4
5 #define MAX 100 // 顺序表最大容量
6 typedef int datatype; //
7 typedef struct //学生信息结构体
8 {
9 char name[10]; //名字
10 char sex[10]; //性别
11 char id[10]; //学号
12 int score; //成绩
13 }Student;
14
15 typedef struct
16 {
17 Student list[MAX]; //存放顺序表的结构体数组
18 int len; //顺序表的长度
19 }Student_list,*Student_listPtr;
20
21
22 //定义顺序表的创建函数
23 Student_listPtr list_create();
24
25 //创建学生信息菜单
26 void menu();
27
28 //判空判满
29 //创建好菜单之后,需要往菜单上添加数据
30 //在添加数据之前,都要对表进行判空判满,才能添加数据
31
32 int list_empty(Student_listPtr L);
33
34 int list_full(Student_listPtr L);
35
36 //添加数据
37 int list_add(Student_listPtr L,int n);
38
39
40 //遍历顺序表
41 void list_show(Student_listPtr L);
42
43 //3:输出最高最低成绩信息
44 int list_amx_min(Student_listPtr L);
45
46 //4:输出学生总成绩和平均成绩
47 int list_sum_avg(Student_listPtr L);
48
49 //5:升序降序输出
50 int list_sort(Student_listPtr L);
51
52
53
54 //6:查找学生是否存在
55 int list_search(Student_listPtr L,char *c);
56
57 //选择需要删除的信息函数
58 void delete_xinxi();
59
60 //7:修改学生信息
61 int list_edit(Student_listPtr L,char *c);
62
63 //8:删除学生信息
64 int list_delete(Student_listPtr L,char *d);
65
66 //9查找学生,并输出该学生的排名
67 int list_student_pos(Student_listPtr L,char *c);
68
69 //销毁函数
70 void list_destroy(Student_listPtr L);
71
72 #endif
.c文件
1 #include"student_sys.h"
2 Student_listPtr list_create()
3 {
4 //在堆区申请一个顺序表的大小空间
5 Student_listPtr L=(Student_listPtr)malloc(sizeof(Student_list));
6 if(NULL==L)
7 {
8 printf("创建失败\n");
9 return NULL;
10 }
11
12 //程序执行至此,表示顺序表创建成功
13 memset(L->list,0,sizeof(L->list)); //将数组初始化
14 L->len = 0; //顺序表长度为0
15
16 //printf("创建成功\n"); //检测创建成功,在将这条语句给注释掉
17 return L;
18 }
19
20
21 //创建学生信息菜单
22 void menu()
23 {
24 printf("-------------------学生信息管理系统----------------------\n");
25 printf("------------------输入1:录入学生信息---------------------\n");
26 printf("------------------输入2:输出学生信息---------------------\n");
27 printf("------------------输入3:输出最高最低成绩信息-------------\n");
28 printf("------------------输入4:输出学生总成绩和平均成绩---------\n");
29 printf("------------------输入5:按成绩升降序---------------------\n");
30 printf("------------------输入6:查找某个学生信息,是否存在--------\n");
31 printf("------------------输入7:修改学生信息---------------------\n");
32 printf("------------------输入8:删除学生信息---------------------\n");
33 printf("------------------输入9:查找某个学生的排名---------------\n");
34 printf("------------------输入0:退出-----------------------------\n");
35 }
36
37 //判空判满
38 int list_empty(Student_listPtr L)
39 {
40 return L->len==0;
41 }
42
43 int list_full(Student_listPtr L)
44 {
45 return L->len==MAX;
46 }
47
48
49
50 //添加数据
51
52 //添加数据
53 int list_add(Student_listPtr L,int n)//形参顺序表 n需要录入信息的人数
54 {
55 int i=1;
56 while(i<=n)
57 {
58
59 //判断空满
60 if(NULL==L || list_full(L))
61 {
62 printf("人数已满,无法添加.\n");
63 return -1;
64 }
65
66 printf("请输入第%d个学生姓名:",i);
67 scanf("%s",L->list[L->len].name);
68
69 printf("请输入第%d个学生性别:",i);
70 scanf("%s",L->list[L->len].sex);
71
72 printf("请输入第%d个学生学号:",i);
73 scanf("%s",L->list[L->len].id);
74
75 printf("请输入第%d个学生成绩:",i);
76 scanf("%d",&L->list[L->len].score);
77
78 //表长变化
79 L->len++;
80 printf("添加成功\n");
81 i++;
82 }
83 return 0;
84 }
85
86
87
88 //遍历顺序表
89 void list_show(Student_listPtr L)
90 {
91 //判断逻辑
92 if(NULL==L || list_empty(L))
93 {
94 printf("遍历失败\n");
95 return ;
96 }
97
98 //遍历
99 printf("----------学生信息----------\n");
100 printf("姓名\t性别\t学号\t成绩\n");
101 for(int i=0;i<L->len;i++)
102 {
103 printf("%s\t%s\t%s\t%d\n",L->list[i].name,L->list[i].sex,L->list[i].id,L->list[i].score);
104 }
105 printf("\n");
106 }
107
108
109 //3:输出最高最低成绩信息
110 int list_amx_min(Student_listPtr L)
111 {
112 //判断逻辑
113 if(NULL==L || list_empty(L))
114 {
115 printf("无学生信息,无法查找成绩信息.\n");
116 return 0;
117 }
118 int max=L->list[0].score,i1=0; //最大值 最大值下标
119 int min=L->list[0].score,i2=0; //最小值 最小值下标
120 for(int i=0;i<L->len;i++)
121 {
122 if(max<L->list[i].score)
123 {
124 max=L->list[i].score;
125 i1=i;
126 }
127 if(min>L->list[i].score)
128 {
129 min=L->list[i].score;
130 i2=i;
131 }
132 }
133 printf("---------最高成绩学生信息---------\n");
134 printf("姓名\t性别\t学号\t成绩\n");
135 printf("%s\t%s\t%s\t%d\n",L->list[i1].name,L->list[i1].sex,L->list[i1].id,L->list[i1].score);
136
137 printf("\n");
138 printf("---------最低成绩学生信息---------\n");
139 printf("姓名\t性别\t学号\t成绩\n");
140 printf("%s\t%s\t%s\t%d\n",L->list[i2].name,L->list[i2].sex,L->list[i2].id,L->list[i2].score);
141 return 0;
142 }
143
144
145
146 //输出学生总成绩和平均成绩
147 int list_sum_avg(Student_listPtr L)
148 {
149 //判断逻辑
150 if(NULL==L || list_empty(L))
151 {
152 printf("无学生信息,无法统计成绩.\n");
153 return 0;
154 }
155
156 //成绩总和
157 int sum=0;
158 for(int i=0;i<L->len;i++)
159 {
160 sum+=L->list[i].score;
161 }
162
163 printf("班级一共有%d人,总成绩为%d,平均分为%.2f\n",L->len,sum,(float)sum/L->len);
164
165 }
166
167
168
169 //5:升序降序输出
170 int list_sort(Student_listPtr L)
171 {
172 //判断逻辑
173 if(NULL==L || list_empty(L))
174 {
175 printf("排序失败\n");
176 return -1;
177 }
178 //冒泡排序
179 for(int i=1;i<L->len;i++)
180 {
181 for(int j=0;j<L->len-i;j++)
182 {
183 if(L->list[j].score < L->list[j+1].score)
184 {
185 Student temp=L->list[j];
186 L->list[j] = L->list[j+1];
187 L->list[j+1]=temp;
188
189 } //从大到小排序
190 }
191
192 }
193
194 int b=0;
195 printf("请输入>>>");
196 scanf("%d",&b);
197 if(b==1) //判断需要升序还是降序
198 {
199 list_show(L); //降序 //调用遍历输出函数
200 }
201 else if(b==2)
202 {
203 for(int i=L->len-1;i>=0;i--)
204 {
205 printf("%s\t%s\t%s\t%d\n",L->list[i].name,L->list[i].sex,L->list[i].id,L->list[i].score);//升序
206 }
207 }
208 else
209 {
210 printf("输出错误\n");
211 }
212 return 0;
213 }
214
215
216 //6:查找学生是否存在
217 int list_search(Student_listPtr L,char *c)
218 {
219 //判断逻辑
220 if(NULL==L || list_empty(L))
221 {
222 printf("查找失败\n");
223 return -1;
224 }
225
226 //遍历整个顺序表
227 for(int i=0;i<L->len;i++)
228 {
229 if(strcmp(L->list[i].name,c)==0)
230 {
231
232 printf("姓名\t性别\t学号\t成绩\n");
233 printf("%s\t%s\t%s\t%d\n",L->list[i].name,L->list[i].sex,L->list[i].id,L->list[i].score);//升序
234 return 0;
235 }
236
237 }
238 printf("没有这个学生\n");
239 return -1;
240 }
241
242 //选择需要删除的信息
243 void delete_xinxi()
244 {
245 printf("---------输入1:修改姓名---------\n");
246 printf("---------输入2:修改性别---------\n");
247 printf("---------输入3:修改学号---------\n");
248 printf("---------输入4:修改成绩---------\n");
249 }
250
251
252
253 //7:修改学生信息
254 int list_edit(Student_listPtr L,char *c)
255 {
256 //判断逻辑
257 if(NULL==L || list_empty(L))
258 {
259 printf("无法修改\n");
260 return -1;
261 }
262
263 int index=0;
264 for(int i=0;i< L->len;i++) //遍历找到需要修改的学生的位置
265 {
266 if(strcmp(L->list[i].name,c)==0)
267 {
268 index=i;
269 }
270 }
271 delete_xinxi();
272 int d=0; //选择修改信息
273 printf("请输入>>>");
274 scanf("%d",&d);
275 char stu[10]=""; //输入修改的名字或者性别或者学号
276 int new_score=0; //修改的成绩
277 switch(d)
278 {
279 case 1:
280 printf("输入正确的名字:");
281 scanf("%s",stu);
282 strcpy(L->list[index].name,stu);
283 printf("修改成功\n");
284 break;
285 case 2:
286 printf("输入正确的性别:");
287 scanf("%s",stu);
288 strcpy(L->list[index].sex,stu);
289 printf("修改成功\n");
290 break;
291 case 3:
292 printf("输入正确的学号:");
293 scanf("%s",stu);
294 strcpy(L->list[index].id,stu);
295 printf("修改成功\n");
296 break;
297 case 4:
298 printf("输入正确的成绩:");
299 scanf("%d",&new_score);
300 L->list[index].score=new_score;
301 printf("修改成功\n");
302 break;
303 default:
304 printf("输入错误,无法修改\n");
305 break;
306 }
307 return 0;
308 }
309
310
311
312 //8:删除学生信息
313 int list_delete(Student_listPtr L,char *d)
314 {
315 //判断逻辑
316 if(NULL==L || list_empty(L))
317 {
318 printf("查找失败\n");
319 return -1;
320 }
321 int i3=0;
322 for(int i=0;i< L->len;i++) //遍历找到需要删除的学生的位置
323 {
324 if(strcmp(L->list[i].name,d)==0)
325 {
326 i3=i;
327 }
328 }
329 for(int i=i3+1;i<L->len;i++)
330 {
331 L->list[i-1]=L->list[i];
332 }
333
334 //表长变化
335 L->len--;
336
337 printf("删除成功\n");
338 return 0;
339
340 }
341
342
343 //9查找学生,并输出该学生的排名
344 int list_student_pos(Student_listPtr L,char *c)
345 {
346 //判断逻辑
347 if(NULL==L || list_empty(L))
348 {
349 printf("排序失败\n");
350 return -1;
351 }
352 //冒泡排序
353 for(int i=1;i<L->len;i++)
354 {
355 for(int j=0;j<L->len-i;j++)
356 {
357 if(L->list[j].score < L->list[j+1].score)
358 {
359 Student temp=L->list[j];
360 L->list[j] = L->list[j+1];
361 L->list[j+1]=temp;
362
363 } //从大到小排序
364 }
365
366 }
367
368 int index=0;
369 for(int i=0;i< L->len;i++) //遍历找到需要找学生的位置
370 {
371 if(strcmp(L->list[i].name,c)==0)
372 {
373 index=i;
374 }
375 }
376 printf("%s\t排名:%d\n",L->list[index].name,index+1);
377 printf("姓名\t性别\t学号\t成绩\n");
378 printf("%s\t%s\t%s\t%d\n",L->list[index].name,L->list[index].sex,L->list[index].id,L->list[index].score);
379 return 0;
380
381 }
382
383
384 //销毁函数
385 void list_destroy(Student_listPtr L)
386 {
387 if(NULL!=L)
388 {
389 free(L);
390 L=NULL;//防止野指针
391 }
392 printf("销毁成功\n");
393 }
394
395
main.c文件
1 #include"student_sys.h"
2 int main(int argc, const char *argv[])
3 {
4 Student_listPtr L=list_create(); //创建顺序表函数
5
6 char c[10]=""; //名字字符数组
7 if(NULL==L)
8 {
9 return -1;
10 }
11 while(1)
12 {
13 menu(); //调用菜单函数
14 printf("请输入>>>");
15 int num=0;
16 scanf("%d",&num); //num表示选择功能
17 switch(num)
18 {
19 case 1:
20
21 printf("\t------------录入学生信息------------\t\n");
22 int a=0;
23 printf("请输入需要输入的人数:");
24 scanf("%d",&a);
25 list_add(L,a);//调用添加学生函数
26 break;
27 case 2:
28 list_show(L); //调用遍历学生信息函数
29 break;
30 case 3:
31
32 list_amx_min(L);//调用最高/最低成绩学生信息函数
33 break;
34 case 4:
35 list_sum_avg(L); //调用输出最高最低成绩
36 break;
37 case 5:
38 printf("-------------输入1:学生成绩降序输出-----------\n");
39 printf("-------------输入2::学生成绩升序输出-----------\n");
40 list_sort(L);
41 break;
42 case 6:
43 printf("请输入需要查找的学生信息:");
44 scanf("%s",c);
45 list_search(L,c); //调用查找学生信息
46 break;
47 case 7:
48 printf("请输入需要修改的学生信息的名字:");
49 scanf("%s",c);
50 list_edit(L,c);
51 break;
52 case 8:
53
54 printf("请输入需要删除的学生信息的名字:");
55 scanf("%s",c);
56 list_delete(L,c); //调用删除学生信息函数
57 break;
58 case 9:
59 printf("请输入需要查找的学生信息:");
60 scanf("%s",c);
61 list_student_pos(L,c);
62 break;
63 case 0:
64 list_destroy(L);
65 return 0;
66 default:
67 printf("输入错误\n");
68 break;
69
70 }
71 }
72
73 list_destroy(L);
74 return 0;
75 }