1、数据结构之学生成绩管理系统 学生成绩管理系统 一、 实验目的 1. 通过此次课程设计中学生成绩管理系统的题目,掌握链表等数据结构的基本操作方面的知识,并能灵活的解决一些基本的问题,加深对其性质及各项操作的理解; 2. 将所学数据结构方面的知识与一门具体的语言C语言来进行实现,感受数据结构的强大作用,加深理解。 二、 试验要求 管理系统中有五个要求:输入 查找 修改 插入 删除 存储 (1) 输入要求:能够通过键盘输入和文件输入两种 查找要求:能够根据学生号查找单个学生的信息,也可以遍历所有学生信息 (2) 修改要求:能够根据学生号修改单个学生所有信息 )(3插入要求:能够实现头插和尾插(4)
2、删除要求:能够根据学生号删除单个学生信息)5 (存储要求:通过链表存储所有信息)(6 三、 算法的思想与算法实现步骤 1. 基本思想 通过链表数据类型进行基本操作,主要有三个模块:分别是主函数模块、 主要操作函数及基本操作函数。 其中,主函数负责其他子函数的调用实现以及基本界面的操作 主要函数包括: void StuInput(Student *); /学生成绩管理系统的输入函数,由主函数调用 void StuSelect(Student *); /学生成绩管理系统的查找函数,由主函数调用 void StuAlter(Student *); /学生成绩管理系统的修改函数,由主函数调用 void
3、 StuInsert(Student *); /学生成绩管理系统的插入函数,由主函数调用 学生成绩管理系统的删除函数,由主函数调用void StuDelect(Student *); / void StuSave(Student *); /学生成绩管理系统的存储函数,由主函数调用 基本操作函数: void StuOutput(Student *p); /输出函数 int StuImport(Student *head,Student *p); /输入函数 void StuInputHand(Student *head); /学生成绩管理系统的手动输入函数,由输入函数调用 void StuInp
4、utFile(Student *head); /学生成绩管理系统的文件输入函数,由输入函数调用 void StuSelectErg(Student *head); /学生成绩管理系统的遍历函数,由查找函数调用 void StuSelectNumFind(Student *head); /学生成绩管理系统的按学号查找函数,由查找函数调用 void StuSelectSubFind(Student *head); /学生成绩管理系统的按科目查找函数,由查找函数调用 2. 实现步骤 首先,分析题目要求划分实现模块,定义基本数据类型,诸如结构体、链表等; 其次,针对上述的基本操作实现具体需要进行的操作
5、,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能; 最后,编写主函数对每个实现进行按需调用,实现操作。 流程图3. main StuMain StuSave StuInsert StuDelect StuInput StuSelect StuAlter StuSelectSubStuSelectEStuSelectNStuInputStuInpuFindrgHandumFindFile 四代码:#include #include #include struct Student char name10; char subject10; int num; int grade; S
6、tudent *next; ; main函数调用 /学生成绩管理系统的主函数,由 void StuMain(); /学生成绩管理系统的输入函数,由主函数调用void StuInput(Student *); 学生成绩管理系统的查找函数,由主函数调用 void StuSelect(Student *); / 学生成绩管理系统的修改函数,由主函数调用 /void StuAlter(Student *); 学生成绩管理系统的插入函数,由主函数调用 /void StuInsert(Student *); /学生成绩管理系统的删除函数,由主函数调用 void StuDelect(Student *);
7、学生成绩管理系统的存储函数,由主函数调用/ void StuSave(Student *); 输出函数 / void StuOutput(Student *p); 输入函数 int StuImport(Student *head,Student *p); / void StuOutput(Student *p) /打印函数,将链表的该节点信息输出 牰湩晴尨学生姓名:); printf(%s ,p-name); 牰湩晴尨学生号:); printf(%d ,p-num); 牰湩晴尨科目: ); printf(%s ,p-subject); 牰湩晴尨学生成绩:); printf(%d n,p-gra
8、de); int StuImport(Student *head,Student *p) Student *Opinion=(Student *)malloc(sizeof(Student); /用来判断输入节点中学生号是否有重复 Opinion=head-next; 牰湩晴尨学生姓名:n); scanf(%s,p-name); 牰湩晴尨学生号:n); scanf(%d,&p-num); 牰湩晴尨科目:n); scanf(%s,p-subject); if(Opinion!=NULL) if(Opinion-num=p-num&!strcmp(Opinion-subject,p-subject
9、) 牰湩晴尨该学生这门科目已有成绩,请重新输入n); return 1; Opinion=Opinion-next; 牰湩晴尨学生成绩:n); scanf(%d,&p-grade); return 0; void main() StuMain(); void StuMain() char decide=y; /定义while变量,函数是否继续进行 变量,函数跳转到哪个switch定义/ num=1; int 子函数 Student *head; /定义链表的头指针 head=(Student *)malloc(sizeof(Student); /给头指针开辟空间 head-next=NULL;
10、 /初始化头指针 while(decide!=n) printf( *n); printf( * 1 输入 2 查找 3 修改 4 插入 *n); printf( * 5 删除 6 存储 7 退出 *n); printf( *n); scanf(%d,&num); switch(num) case 1: StuInput(head); break; case 2: StuSelect(head); break; case 3: StuAlter(head); break; case 4: StuInsert(head); break; case 5: StuDelect(head); brea
11、k; case 6: StuSave(head); break; default: decide=n; break; ; void StuInputHand(Student *head); /学生成绩管理系统的手动输入函数,由输入函数调用 void StuInputFile(Student *head); /学生成绩管理系统的文件输入函数,由输入函数调用 学生成绩管理系统的输入函数,由主函数调用/ void StuInput(Student *head) char decide=y; /定义while变量,函数是否继续进行 int num; /定义switch变量,函数跳转到哪个子函数 whi
12、le(decide!=n) printf( *n); printf( * 1 手动输入 2 文件输入 3 退出 *n); printf( *n); scanf(%d,&num); switch(num) case 1: StuInputHand(head); break; case 2: StuInputFile(head); default: decide=n; break; void StuInputHand(Student *head) /学生成绩管理系统的手动输入函数,由输入函数调用 if(head-next=NULL) Student *point=(Student *)malloc
13、(sizeof(Student); /链表中最后一个节点,只在该函数中存在 point-next=NULL; int decide=1; while(decide!=0) Student *p=(Student *)malloc(sizeof(Student); p-next=NULL; StuImport(head,p); if(head-next=NULL) head-next=p; point=p; else point-next=p; point=p; 牰湩晴尨是否继续:1/0n); scanf(%d,&decide); else 牰湩晴尨管理系统中已存在信息,若想输入学生信息,请转插
14、入子系统); void StuInputFile(Student *head) /学生成绩管理系统的文件输入函数,由输入函数调用 if(head-next!=NULL) 牰湩晴尨学生管理系统中已有信息,请跳转到插入选项n); return ; FILE *fp; 牰湩晴尨请输入文件名(包括物理地址)n); char filename10; scanf(%s,filename); if(fp=fopen(filename,)=NULL) printf(can not open filen); return; Student *point=(Student *)malloc(sizeof(Stud
15、ent); Student *Opinion=(Student *)malloc(sizeof(Student); /用来判断输入节点中学生号是否有重复 while(!feof(fp) Opinion=head-next; Student *p=(Student *)malloc(sizeof(Student); p-next=NULL; fread(p,sizeof(Student),1,fp); if(Opinion!=NULL) if(Opinion-num=p-num&!strcmp(Opinion-subject,p-subject) 牰湩晴尨该文件中有重复学生信息,请验明再传输n)
16、; head-next=NULL; return ; Opinion=Opinion-next; if(head-next=NULL) head-next=p; point=p; else point-next=p; point=p; ; Opinion=head-next; while(Opinion-next!=NULL) Opinion=Opinion-next; if(Opinion-next-next=NULL) Opinion-next=NULL; ; fclose(fp); 牰湩晴尨传输成功n); void StuSelectErg(Student *head); /学生成绩管理
17、系统的遍历函数,由查找函数调用 void StuSelectNumFind(Student *head); /学生成绩管理系统的按学号查找函数,由查找函数调用 void StuSelectSubFind(Student *head); /学生成绩管理系统的按科目查找函数,由查找函数调用 void StuSelect(Student *head) /学生成绩管理系统的查找函数,由主函数调用 char decide=y; /定义while变量,函数是否继续进行 int num; /定义switch变量,函数跳转到哪个子函数 while(decide!=n) printf( *n); printf(
18、 * 1 遍历 2 学号查找 3 科目查找 4 退出 *n); printf( *n); scanf(%d,&num); switch(num) case 1: StuSelectErg(head); break; case 2: StuSelectNumFind(head); break; case 3: StuSelectSubFind(head); break; default: decide=n; break; void StuSelectErg(Student *head) /学生成绩管理系统的遍历函数,由查找函数调用 Student *p=(Student *)malloc(siz
19、eof(Student); p=head-next; int i=1; while(p!=NULL) 牰湩晴尨第%d位学生信息:n,i); StuOutput(p); p=p-next; i+; void StuSelectNumFind(Student *head) /学生成绩管理系统的查找子系统,有查找函数调用 int num; 牰湩晴尨输入想要查找学生的学生号:n); scanf(%d,&num); Student *p=(Student *)malloc(sizeof(Student); p=head-next; int i=1; while(p!=NULL) if(num=p-num
20、) StuOutput(p); i+; p=p-next; if(i=1) ); 没有该学生信息牰湩晴尨 void StuSelectSubFind(Student *head) /学生成绩管理系统的按科目查找函数,由查找函数调用 char Sub10; 牰湩晴尨输入想要查找科目:n); scanf(%s,Sub); Student *p=(Student *)malloc(sizeof(Student); p=head-next; int i=1; while(p!=NULL) if(!strcmp(Sub,p-subject) StuOutput(p); i+; p=p-next; if(
21、i=1) 牰湩晴尨没有该学生信息); void StuAlter(Student *head) /学生成绩管理系统的修改函数,由主函数调用 int num; 牰湩晴尨输入想要查找学生的学生号:n); scanf(%d,&num); char Sub10; 牰湩晴尨输入想要查找科目:n); scanf(%s,Sub); Student *p=(Student *)malloc(sizeof(Student); p=head-next; int i=1; while(p!=NULL) if(num=p-num&!strcmp(Sub,p-subject) 牰湩晴尨输入修改成绩:n); scanf(
22、%d,&p-grade); 牰湩晴尨修改成功n); i+; p=p-next; if(i=1) 牰湩晴尨没有该学生信息); void StuInsert(Student *head) /学生成绩管理系统的插入函数,由主函数调用 Student *point=(Student *)malloc(sizeof(Student); point=head-next; while(point-next!=NULL) point=point-next; /找到尾结点 char decide=y; /定义while变量,函数是否继续进行 int num; /定义switch变量,函数跳转到哪个子函数 whi
23、le(decide!=n) printf( *n); printf( * 1 头插 2 尾插 3 退出 *n); printf( *n); scanf(%d,&num); Student *p=(Student *)malloc(sizeof(Student); switch(num) case 1: StuImport(head,p); p-next=head-next; head-next=p; 牰湩晴尨插入成功n); break; case 2: StuImport(head,p); point-next=p; p-next=NULL; 牰湩晴尨插入成功n); break; defaul
24、t: decide=n; break; void StuDelect(Student *head) /学生成绩管理系统的删除函数,由主函数调用 int num; 牰湩晴尨输入想要删除学生的学生号:n); scanf(%d,&num); char Sub10; 牰湩晴尨输入想要删除科目:n); scanf(%s,Sub); Student *p=(Student *)malloc(sizeof(Student); p-next=head-next; int i=1; while(p-next!=NULL) if(num=p-next-num&!strcmp(Sub,p-next-subject)
25、 StuOutput(p-next); 牰湩晴尨是否删除:1/0n); scanf(%d,&i); if(num=head-next-num&!strcmp(Sub,head-next-subject) head-next=head-next-next; else p-next=p-next-next; i=2; 牰湩晴尨删除成功n); break; p=p-next; if(i=1) 牰湩晴尨没有该学生信息n); void StuSave(Student *head) /学生成绩管理系统的存储函数,由主函数调用 FILE *fp; char filename10; 牰湩晴尨请输入存储文件名(包括物理地址)n); scanf(%s,filename); Student *p=(Student *)malloc(sizeof(Student); p=head-next; if(fp=fopen(filename,w)=NULL) printf(cannot open file); return; printf(input data:/n); while(p!=NULL) fwrite(p,sizeof(St
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1