课程设计报告(一)一.报告题目:学生管理系统二.实验目的:1.熟悉线性链表,掌握线性链表的基本操作;2.练习求线性表中指定结点元素及修改指定结点的元素、求指定结点的前驱/后继元素、删除指定结点的元素、在指点节点位置插入元素等。3.通过文件保存和读取文件来提升文件操作的能力;4.C语言编程能力的提升训练。三.实验环境:C语言编程,VC++6.0编程工具实现。四.软件系统结构1.总体架构/层次:2.各功能的实现流程图:学生管理系统(汉化版)学生管理功能数据存取处理录入新学生信息/插入新学生数据查找学生信息删除学生信息修改学生信息显示全部学生信息将学生信息存入文件(录入)从文件读取学生数据(装入)函数1:录入功能实现流程图开始输入新学生信息按学号非降序插入到链表中完成函数4:删除功能实现流程图开始输入要修改的学生学号按学号查找该学生找到了该学生信息?修改是完成?Y/N“不用修改”否返回主菜单YN函数2:查找功能实现流程图开始输入学生查找学号按学号查找学生找到记录?是完成查找?Y/N显示该学生信息Y返回主菜单N否函数3:删除功能实现流程图开始输入要删除学生的学号查找该学生链表中存在?是删除该学生信息删除完毕?Y/NYN返回主菜单否函数5:显示功能实现流程图开始链表是否为空?否输出“无记录”显示函数输出全部记录返回主菜单是函数6:文件装入功能实现流程图开始输入文件名打开文件成功?按非降序插入链表是输出“打开文件失败”输出“装入成功”返回主菜单否函数7:文件保存功能实现流程图开始输入文件名打开文件成功?是写入文件输出“存入成功”输出“打开文件失败”返回主菜单否函数8:退出菜单功能实现流程图开始确定退出吗?Y/NYt=0/*t=1是菜单执行条件*/退出N返回主菜单结束五.软件功能设计:本软件是要编写一个学生管理系统,一个学生有很多相关数据,包括学号、姓名、性别、年龄、家庭住址、练习电话,因此我们利用线性链表的知识来编写程序,这是因为线性链表有很多优良的特点,因此该程序是对线性链表的应用练习。本软件利用线性链表的特点,结合文件相关函数的运用,它能够实现以下功能:1.用结点的数据域存放学生的学号、姓名、性别、年龄、家庭住址、练习电话;2.利用结点的指针域访问某个结点的前驱或者后继;3.录入新学生信息并按非降序插入到链表中;4.查找给定学号的结点学生信息;5.删除给定学号的结点学生信息;6.修改给定学号的结点学生信息;7.显示全部结点的学生信息;8.将链表中的学生信息全部存入文件;9.将已存在的学生信息文件中的学生信息按学号非降序插入到当前链表中;六.源程序代码:#includestdio.h#includestring.h#includestdlib.h#includewindows.h#defineNAMELEN15#defineADDRLEN10#defineTELLEN15#defineOVERFLOW0#defineERROR0#defineFALSE0#defineOK1#defineTRUE1structstud{longnum;charname[NAMELEN+1];charsex;intage;charAddr[ADDRLEN+1];longrxsj;charlxfs[TELLEN+1];};typedefstudElemType;//链表结点元素为结构体FILE*fp;typedefstructLNode{ElemTypedata;LNode*next;}*LinkList;//typedefLNode*;intInitList(LinkList&L){//操作结果:构造一个空的线性表LL=(LinkList)malloc(sizeof(LinkList));//产生头结点,并使L指向头结点if(!L)//存储分配失败exit(OVERFLOW);L-next=NULL;//指针域为空returnOK;}intListTraverse(LinkListL,void(*vi)(ElemType)){//条件:线性表已存在//操作结果:一次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败LinkListp=L-next;while(p){vi(p-data);p=p-next;}printf(\n);returnOK;}voidInsertAscend(LinkListL,ElemTypee){//按学号非降序插入LinkListq=L,p=L-next;while(p&&e.nump-data.num){q=p;p=p-next;}q-next=(LinkList)malloc(sizeof(LNode));//插在q后q-next-data=e;q-next-next=p;}voidReadIn(stud&e){//由键盘输入结点信息inta=1;printf(学号:);scanf(%ld,&e.num);printf(姓名(=%d个字符):,NAMELEN);scanf(%s,e.name);while(a){printf(性别(m:男f:女):);scanf(%s,&e.sex);{if(e.sex!='m'&&e.sex!='f')printf(格式不对,重输入:);elseif(e.sex=='m'||e.sex=='f')a=0;}};printf(年龄:);scanf(%d,&e.age);printf(家庭住址(=%d个字符):,ADDRLEN);scanf(%s,e.Addr);printf(入学时间(格式如200709):);scanf(%ld,&e.rxsj);printf(联系方式:);scanf(%s,e.lxfs);getchar();}voidPrint(stude){//显示记录e的内容printf(%ld%-8s,e.num,e.name);if(e.sex=='m')printf(男);elseprintf(女);printf(%8d,e.age);printf(%8s,e.Addr);printf(%5ld,e.rxsj);printf(%15s,e.lxfs);printf(\n);}voidWriteToFile(stude)//装入文件函数{//将结点信息写入fp指定的文件fwrite(&e,sizeof(stud),1,fp);}intReadFromFile(stud&e){//由fp指定的文件读取结点信息到einti;i=fread(&e,sizeof(stud),1,fp);if(i==1)//读取文件成功{printf(ok);returnOK;}elsereturnERROR;}intFindFromNum(LinkListL,longnum,LinkList&p,LinkList&q){//查找表中学号为num的结点,如找到,q指向此结点,p指向q的前驱//并返回TURE,否则返回ERRORp=L;while(p){q=p-next;if(q&&q-data.numnum)break;elseif(q&&q-data.num==num)returnTRUE;else{p=q;}}returnFALSE;}intDeleteElem(LinkListL,longnum){//删除表中学号为num的元素,并返回TURE;如无此元素,则返回FALSELinkListp,q;if(FindFromNum(L,num,p,q))//找到此结点,且q指向该结点,p指向该结点的前驱{p-next=q-next;free(q);returnTRUE;}elsereturnFALSE;}voidModify(ElemType&e){chars[50];printf(学号姓名性别年龄家庭住址入学时间联系方式\n);Print(e);printf(请输入新信息,不需要修改的直接按enter键保持原信息:\n\n);printf(请输入学号:\n);gets(s);if(strlen(s))e.num=atol(s);printf(请输入姓名(=%d个字符):\n,NAMELEN);gets(s);if(strlen(s))strcpy(e.name,s);printf(请输入年龄:\n);gets(s);if(strlen(s))e.age=atoi(s);printf(请输入性别(m:男f:女):\n);gets(s);if(strlen(s))e.sex=s[0];printf(请输入家庭住址(=%d个字符):\n,ADDRLEN);gets(s);if(strlen(s))strcpy(e.Addr,s);printf(请输入入学时间:\n);gets(s);if(strlen(s))e.rxsj=atol(s);printf(请输入联系电话:\n);gets(s);if(strlen(s))strcpy(e.lxfs,s);//修改完毕}voidmain(){inti,t=1;longnum;chars,filename[13];ElemTypee;LinkListT,p,q;InitList(T);while(t){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);printf(\n\n);printf(请选择操作数字:);scanf(%d,&i);getchar();switch(i){case1:ReadIn(e);InsertAscend(T,e);printf(\n\n);break;case2:i=1;while(i){printf(请输入要查找的学生学号:);scanf(%ld,&num);getchar();if(!FindFromNum(T,num,p,q)){printf(没有记录);printf(完成查找?Y/N\n);scanf(%s,&s);if(s=='Y'||s=='y')i=0;}else{printf(学号姓名性别年龄家庭住址入学时间联系方式\n);Print(q-data);printf(\n\n);printf(完成查找?Y/N\n);scanf(%s,&s);{if(s=='Y'||s=='y')i=0;}}}break;case3:i=1;while(i){printf(请输入要删除学生的学号:);scanf(%ld,&num);getchar();if(!FindFromNum(T,num,p,q)){printf(无此学生不用删除\n);printf(删除完毕?Y/N\n);scanf(%s,&s);{if(s=='Y'||s=='y')i=0;}}else{DeleteElem(T,num);printf(已删除!\n);printf(删除完毕?Y/N\n);scanf(%s,&s);{if(s=='Y'||s=='y')i=0;}}}printf(\n\n);break;case4:i=1;while(i){printf(请输入要修改的学生的学号:);scanf(%ld,&num);getchar();if(!FindFromNum(T,num,p,q)){printf(没有这个学生,不用修改\n\n);printf(修改完毕?Y/N\n);scanf(%s,&s);{system(cls);if(s=='Y'||s=='y')i=0;}}else{system(cls);Modify(q-data);printf(修改完毕?Y/N\n);sca