《数据结构课程设计学生管理系统链表.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计学生管理系统链表.doc(17页珍藏版)》请在三一办公上搜索。
1、课程设计任务书、题目:学生信息管理系统、设计内容及要求: 内容:完成简单的学生信息管理系统要求:(1) 学生信息包括:学号、姓名、平时成绩、期末考试成绩;(2) 用单链表存放学生信息;(3) 实现简单的菜单调用;(4) 程序的功能包括:学生信息链表的建立;学生信息的插入;学生信息的查询;学生信息的修改;学生信息的删除;学生信息的输出。编写算法,编码实现基本要求。3.设计时间:6 月27 日7 月1 号目 录一、 需求分析- 3 二、 概要设计-4 三、 详细设计-6 四、 调试分析- 14 五、 用户使用说明- 14 六、 测试结果- 17 七、 附录(略)- 17 一 需求分析分析课程设计任
2、务书,本次数据结构课程设计的任务是利用数据结构中所学的相关知识编程设计实现一个学生信息管理系统,使该系统可以方便的查询学生的各项信息和方便管理。根据任务书中的第五条要求,为来使用者方便使用。需给出输入、插入、查询、修改、显示等功能。根据上面的需求分析,画出程序的功能模块图大致如下:系统设计流程图主页面建立链表查询显示信息退出修改插入按学号按姓名改姓名改学号改平时成绩改期末成绩不修改 退出二、 概要设计根据上面所述的需求分析,结合我们学过的数据结构知识,要想在计算机中储存学生的信息,可以使用顺序存储和链式存储两种数据类型下面给出本程序用到抽象数据类型定义:ADT List数据对象:D=ai|ai
3、ElemSet,i=1,2,,n,n0 数据关系:R1=|ai-1,aiD,i=2,n基本操作P:InitList(&L);操作结果:构造一个空的线性表L。DestroList(&L);初始条件:线性表L已存在。操作结果:销毁线性表L。ClearList(L);初始条件:线性表L已存在。操作结果:将L重置为空。ListEmpty(L);初始条件:线性表已存在。操作结果:若L为空表,则返回TURE,否则返回FALSE。ListLength(L);初始条件:线性表L已存在。操作结果:返回L中数据元素的个数。GetElem(L,I,&e);初始条件:线性表L已存在,1iListLength(L)。操
4、作结果:用e返回中第i个数据元素的值。LocateElem(L,e,compare());初始条件:线性表L已存在,compare()是数据元素判定函数。操作结果:返回中第1个与满足关系的数据元素的位序。若这样的数据元素不存在,则返回值为0。PriorElem(L,cur_e,&pre_e)初始条件:线性表L已存在。操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。NextElem(L,cur_e,&next_e)初始条件:线性表L已存在。操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失
5、败,next_e无定义。ListInsert(&L,i,e)初始条件:线性表L已存在,1iListlength(L)+1。操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1。ListDelete(&L,i,&e)初始条件:线性表L已存在且非空,1iListlength(L)。操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1。ListTraverse(L,visit())初始条件:线性表L已存在。操作结果:依次对L的每一个数据元素调用函数visit()。一旦visit()失败,则操作失败。ADT List除了上述定义的一些基本操作外,为了实现任务书中的相应功能,还要设计
6、如下一些函数:void createList(sequenlist*p1)void printList(sequenlist *head)void insert(sequenlist *L,int i)sequenlist *findList(sequenlist *L)void devise(sequenlist *L)void change(sequenlist *L)void delNode(sequenlist *L)函数调用程序:mainprintListfindListchangedelNodecreateListdevise三、 详细设计使用单向链表指针,能够管理简单的学生信息,
7、是一个设计较为人性化的操作系统。首先,建立学生的信息库。然后根据提示,选择“录入学生信息的个数,依次录入”。若选择继续操作,则会出现菜单栏,可以选择进行学生信息的插入,查询,修改,删除,显示等操作和系统的退出。否则,退出操作程序。根据上面的概要设计,首先要写出数据存储结构的类型定义。系统由头文件名,一个结构体,八个自定义函数和一个主函数构成1系统的总体结构定义如下:1)头文件名:#include #include /包含字符串的比较函数strcmp#include#define LEN sizeof(struct student)2)结构体:typedef struct student cha
8、r num8;/*学号*/ char name9;/*姓名*/ float g;/*平时成绩*/ float s;/*期末成绩*/ struct student *next;sequenlist;3)八个自定义函数:int menu()/提供菜单选项,供用户选择各个功能模块void createList(sequenlist*p1) /建立学生的信息库void printList(sequenlist *head) /显示所有学生信息void insert(sequenlist *L,int i) /插入学生信息sequenlist *findList(sequenlist *L) /查询学生
9、信息void devise(sequenlist *L)/修改学生信息子函数void change(sequenlist *L)/修改学生信息void delNode(sequenlist *L) /删除学生信息4)主函数:void main()/将各函数组合成一个有机的整体,实现各个函数的调用sequenlist *p1,*p;int i; while(1) switch(menu_select() case 1: printf(*n); printf( 学生信息线性表的建立 n); printf(*n); p1=(sequenlist *)malloc(LEN); createList(p
10、1); break case 2: printf(*n); printf(添加学生信息n); printf(*n); printf(请输入要插入的位置:n); scanf(%d,&i); printf(i=%dn,i); printf(请输入要插入学生的信息n); insert(p1,i); break; case 3: printf(*n); printf(查询学生信息n); printf(*n); p=findList(p1); if(p!=NULL) printf(您要查的学生为:n学号 姓名 平时成绩 期末成绩n); printf(-n); printf(%s,%s,%f,%fn,p-
11、num,p-name,p-g,p-s);printf(-n); else printf(没有您要查询的学生信息!); break;case 4: printf(*n); printf(修改学生信息n); printf(*n); change(p1); break; case 5: printf(*n); printf(删除学生信息n); printf(*n); delNode(p1); break;case 6: printf(*n); printf(输出所有学生信息n); printf(*n); printList(p1); break;case 0:printf(退出!n);getchar
12、();return;2各功能模块的设计1)结构体模块:struct student,存储学生多方面的信息,是单向链表的建立和各个函数的运行的基本元素2)菜单模块:int menu_select ()函数,用大量的字符拼图组合,输出形成一个美观实用的菜单表格目录,运用case语句,提示用户输入的数字是否有误,若错误,则显示“输入错误,请重选0 - 6”,再次输入,最后把输入数值返回给主函数。int menu_select()int sn;printf(n 学生信息管理系统n);printf(=n);printf( 1.学生信息线性表的建立n);printf( 2.插 入 学 生 信 息n);pr
13、intf( 3.查 询 学 生 信 息n);printf( 4.修 改 学 生 信 息n);printf( 5.删 除 学 生 信 息n);printf( 6.输 出 所有学生信息n);printf( 0.退 出 管 理 系 统n);printf(=n);printf(请选择0-6:n);for(;)scanf(%d,&sn);if (sn6) printf(nt输入错误,重选0-6n);else break;return sn;3)信息库的建立模块:void createList(sequenlist*p1)函数,运用循环结构和二级指针和一级指针之间的地址值和数据值的相互赋予,新的存储空间的
14、开辟和释放,协助完成了单链表的学生信息的存储。void createList(sequenlist*p1)/ 信息库的建立int n,i,j=0;sequenlist *p2;printf(有几位学生?请输入:n);scanf(%d,&n);printf(以下请输入这%d位学生的信息:n,n);for(i=1;inum,p2-name,&p2-g,&p2-s); p1-next=p2; p1=p2;p1-next=NULL;4)学生信息的插入模块:void insert(sequenlist *L,int i)函数,新建指针变量*s,将新的学生信息插入单向链表中,形成新的学生信息数据库。voi
15、d insert(sequenlist *L,int i) sequenlist * p=L,*s;int j=1;while(p&jnext; +j;s=(sequenlist *)malloc(LEN);scanf(%s %s %f %f,s-num,s-name,&s-g,&s-s);s-next=p-next;p-next=s;5)学生信息的查询模块:sequenlist *findList(sequenlist *L)函数,用if等条件语句,实现“1.按学号查询;2.按姓名查询”两种查询方式,接着运用while循环,核对有无该生信息,既而显示该生的所有信息或显示“无该生信息!”等。s
16、equenlist *findList(sequenlist *L) /学生信息的查询sequenlist *P=L-next;char num8;char name9;int xz;printf(=n);printf(1、按学号查询n);printf(2、按姓名查询n);printf(=n);printf( 请选择: );scanf(%d,&xz);if (xz=1) printf(请输入要查找学生的学号:); scanf(%s,num); while(P!=NULL&strcmp(P-num,num)!=0)P=P-next; if(P=NULL)printf(没有要找的学生n);retu
17、rn(NULL); else return(P); else if (xz=2) printf(请输入要查找学生的姓名:); scanf(%s,name); while(P!=NULL&strcmp(P-name,name)!=0)P=P-next; if(P=NULL)printf(没有要找的学生n); return(NULL); else return(P);6)学生信息的删除模块:void delNode(sequenlist *L)函数,用了对学号查询方式和核对有无该生信息,既而删除该生的所有信息或者显示“没有要删除的信息!”等。void delNode(sequenlist *L)c
18、har num8;sequenlist * P1,*p2,*head;printf(请输入要删除的结点numn);scanf(%s,num);P1=L-next;head=L-next;while(strcmp(P1-num,num)!=0&P1-next!=NULL)p2=P1;P1=P1-next;if(strcmp(P1-num,num)=0)if(P1=head)L-next=P1-next;else p2-next=P1-next;free(P1);printf(信息已删除n);else printf(没有要删除的信息!n);7)学生信息的修改模块:void change(seque
19、nlist *L) 函数,用学号对该学生是否存在进行查找,如存在进入子函数void devise(sequenlist *L),运用switch(choice) case选择要修改的项,如学号、姓名、平时成绩、期末成绩等,如不需修改,则选择0退出修改子函数。如没找到学生,则输出“无学生记录!”void devise(sequenlist *L) sequenlist *head,*P;head=L-next; int choice; choice = -1; do printf(请选择您要修改的学生的信息内容:n); printf(+-+n); printf(| 姓名 请按 1 |n); pr
20、intf(| 学号 请按 2 |n); printf(| 平时成绩 请按 3 |n); printf(| 期末成绩 请按 4 |n); printf(| 取消 请按 0 |n); printf(+-+n); printf(请输入您的选择:); scanf(%d, &choice); switch(choice) case 0: return; case 1: printf(请输入新姓名:); scanf(%s, P-name); break; case 2: printf(请输入新学号:); scanf(%s, P-num); break; case 3: printf(请输入新平时成绩:);
21、 scanf(%f, &P-g); break; case 4: printf(请输入新期末成绩 :); scanf(%f,&P-s); break; default: printf(n无效选项!); break; printf(修改成功!n) ;while(choice != 0);void change(sequenlist *L) sequenlist *p;p = L-next; char num; if(p = NULL) printf(无学生记录!n); return; printf(请输入您要修改的学生的学号:); scanf(%s, &num); if(p-num)devise
22、(p);return;8)所有学生信息的显示模块:void printList(sequenlist *head)函数,运用if判断是否为空,若不空则用while循环,输出每个学生的所有信息。void printList(sequenlist *head)sequenlist *p;printf(n学号 姓名 平时成绩 期末成绩n);printf(-n);p=head;p=p-next;if(head!=NULL)do printf(%s,%s,%f,%fn,p-num,p-name,p-g,p-s);printf(-n);p=p-next;while(p);9)主函数模块:void main
23、(),运用switch,case实现 因菜单函数int menu()的不同的返回值而调用不同的功能函数,又用case循环体简洁、直观的实现操作的循环进行。四调试此次函数调试过程中主要存在两个小问题1 结构体中大小写的定义2Strcmp函数的使用,字符之间的比较五用户使用说明1进入主页面2 建立学生线性表3 输入学生信息4 插入学生信息5 查询学生信息6修改学生信息7删除学生信息8显示所有学生信息 9退出六测试结果如用户使用说明可见:第一模块,录入学生信息可自主选择录入学生的人数且能全部保存。第二模块,可按学号选择插入的位置并插入。第三模块,查询可自主选择按学号或学生姓名查询且能正确输出结果。第四模块,修改可按学号选择要修改的学生信息,并自主选择要修改的信息项。第五模块,按学号选择要删除的节点并快速删除。第六模块,能正确输出所有学生信息。所有模块均能正常工作且能正确执行并自动返回主页面,基本完成了任务书中各项要求。