1、从员工管理文件中删除一名员工对象,分为根据编号删除、根据姓名删除。(3)查询:从员工管理文件中查询符合某些条件(编号、姓名)的员工。(4)修改:根据编号检索出对象,既可以对整个对象修改,也可对某个属性修改。(5)排序:按照年龄、工龄对所有的员工排序(降序),也可以回复排序以前的员工现实状态。2概要设计(一)数据类型定义:#include string.hmalloc.hstdlib.h#define ALLMAX 100 /总共统计的职工的人数typedef struct Node long int age,work_time,num; char sex,nameALLMAX,jobALLMA
2、X; struct Node *next;SLNode;typedef struct char nameALLMAX,sex,jobALLMAX;DataType;(二)主程序流程图(三)各程序模块之间的层次(调用)图3详细设计1、主菜单模块:显示员工管理系统的主菜单,供用户选择所需的功能,通过自己定义的void put( )函数来实现。 2、添加员工模块:输入员工的编号、姓名、年龄、职位、工龄以,通过自己定义的void addMessage( )函数来实现。3、查询员工信息模块:浏览所有员工的相关信息,通过自己定义的void Listfind ( )函数来实现。4、删除员工模块:删除需要删除
3、的员工的所有信息,通过自己定义的void ListDelete ( )函数来实现。5、修改模块:可以修改需要修改的员工的相关信息,通过自己定义的void ListModify( )函数来实现。6、员工信息排序模块:可以按照规定要求对员工信息排序,通过自己定义的void sort( )函数来实现。7、退出系统模块。四、测试过程1、进入系统如图所示:2、根据提示信息输入1、增加员工信息:3、根据提示信息输入3查询员工信息,选择第一种对姓名进行查询做演示:4,根据提示信息修改员工信息:5、根据提示信息输入5,选择按编号进行排序:6、根据提示信息,输入2删除员工信息五、用户使用说明 进入员工管理系统,
4、首先看到的就是主菜单界面选择1:进入添加员工信息模块,按照提示语依次录入员工对象信息。选择2:进入删除员工信息模块。选择3:进入员工查询模块,在此模块下,系统提示:按姓名查询、按编号查询,系统根据用户选择进行相应的处理,退出查询模块时,系统进入主菜单模块。选择4:进入修改员工信息模块,在该模块下,系统提示:修改整条信息,修改部分信息,系统根据用户选择,进行相应的功能处理。当用户选择退出修改模块时,系统进入主菜单模块。选择5:进入排序模块,在该模块下,系统提示:按年龄排序、按工龄排序、回复原排序,系统根据用户的选择,进行相应的处理。选择0:退出系统。六、总结 本次课程设计是围绕数据结构进行。根据
5、问题描述可知,需要解决问题并不复杂,整个问题只需要实现一个员工管理系统功能,那就是在这个系统中实现对员工信息的插入、删除、查询、排序、修改。但是,为了实现该功能,却需要优秀的算法和数据结构以保证实现的时间和空间效率。把员工信息存储在一个单链表中,利用指针实现对员工信息的各项基本操作。虽然设计的程序完成了题目描述所需要实现的功能,但是仍然存在不如人意的地方,比如可以排序上面多设计几个算法,实现多角度排序等。经过这次数据结构课程设计,我们不仅及时巩固的了数据结构、算法、以及软件工程的知识,并明白数据结构和算法对于程序时间和空间性能的影响软件开发流程和工具对于实现特定功能程序的重要意义。当我们面对一
6、个实际问题,应该迅速根据问题性质和特点抽象成特定的数据结构,当然每个问题都有可能能够抽象成多种数据结构,每种数据结构适应于不同的算法。因此应该综合考虑这样的数据结构、算法以及它们的空间和时间效率,然后从中选择一个作为实现程序的基础。七、附录程序源代码typedef structvoid ListInitiate(SLNode *head)/链表初始化 if(*head=(SLNode *)malloc(sizeof(SLNode)=NULL) exit(1);/动态分配存储空间 (*head)-next=NULL;SLNode *ListInsert(SLNode *head,DataType
7、 x)/职工信息的插入姓名并按照升序排列 SLNode *p,*q,*s; p=head-next; if(q=(SLNode *)malloc(sizeof(SLNode)=NULL) exit(1); q-age=x.age;work_time=x.work_time;num=x.num; strcpy(q-name,x.name);sex=x.sex;job,x.job); if(head-next=NULL) /如果只有链表的头结点,没有其他的结点,直接插入在头结点后面 head-next=q;next- else/链表非空 for(;p;p=p-next) if(p-next!=NU
8、LL) if(strcmp(p-name,x.name)name,x.name)0) /位于两个结点之间 s=p- p- q-next=s; break; else if(strcmp(p-name,x.name)=0)break; /如果姓名相同则不插入信息 else if(strcmp(p-p- /链表非空,并且在排序中是最后一个 p- q- break; if(strcmp(p- /位于链表头结点之后的位置 s=head- head- return head;void ListDelete(SLNode *head)/职工信息的删除 SLNode *p,*s; char x20; s=h
9、ead;next=NULL)/链表为空,输出:名单中无职工信息,无须删除! printf(无职工信息,无须删除!n); return; printf(请输入要删除职工的姓名: /输入要删除的人的姓名 scanf(%s,x); for(p;next)/在链表中从头到尾查找输入的人的姓名 if(strcmp(p-name,x)=0) /如果存在,则删除,否则输出: s-next=p- free(p); printf(删除成功!请继续操作! break; s=p; if(p=NULL) /链表本身为空void ListModify(SLNode *head)/职工信息的修改 DataType x;
10、SLNode *p; if(p=NULL)/链表本身为空无职工信息,无须修改!请输入要修改的职工姓名:,x.name);依次写入该职工的新信息: for(; if(strcmp(x.name,p-name)=0)/查找到了该职工的信息姓名n scanf( getchar();性别n%c,&x.sex);年龄n%dx.age);工龄nx.work_time);职务n,x.job);编号nx.num);%s %c %d %d %s %dn,x.name,x.sex,x.age,x.work_time,x.job,x.num);修改成功! if(p=NULL)/如果链表为空此职工不存在!void p
11、ut(SLNode *head,FILE *fp)/职工信息的保存 if(fp=fopen(职工名单.txt,w)=NULL)/无法打开职工名单.txt! exit(0); for(p=head- fprintf(fp,p-name,p-sex,p-age,p-work_time,p-job,p-num); if(fclose(fp)无法关闭 exit(0);void Listfind(SLNode head)/职工信息的查找 int i,j; if(head.next=NULL)/链表为空无职工信息,无法查询! /返回主菜单t*nt* 职工信息查询操作 *nt* *nt* 0.退出查询系统,
12、回到主菜单 *nt* 1.对姓名进行查询 *nt* 2.对编号进行查询 *nt* 3.对职务进行查询 *n while(1)请输入您要选择的操作:i); if(i=0)/输入0,退出查询系统,回到主菜单 else if(i=1)/输入1,对姓名进行查询 p=head.next;请输入姓名: scanf( j=0; for(p;next)name,x.name)=0)/如果存在这个人,那么j自加 +j; printf( if(j=0)/表示没有找到输入的信息 printf(职工名单中不存在此人! else printf(查询成功! else if(i=2)/输入2,对编号进行查询请输入编号: i
13、f(p-num=x.num)/输入的编号在链表中存在/如果存在这个人,那么j自加职工名单中没有这个编号的! else if(i=3)/输入3,对职务进行查询请输入职务:job,x.job)=0)职工名单中没有这种职务的! else if(i!=0 & i!=1 &=2 &=3 &=4 &=5 &=6 &=7)/输入任意不是上述数字的,那么久显示输入错误输入出错!请再次输入! /printf(0.退出查询系统,回到主菜单n1.对姓名进行查询n 2.对编号进行查询查询n3.对对职务进行查询nvoid print(SLNode *head)/职工信息的显示 for(SLNode *p=head-ne
14、xt)/输出所有职工的信息void Listpaixu(SLNode *head)/职工信息的排序 int i,n=0,m,flag=1;next=NULL)/职工链表为空名单中无职工信息,无法排序!nntt*ntt* 职工信息排序操作 *ntt* *ntt* 0.退出排序系统,回到主菜单 *ntt* 1.对编号进行排序 *ntt* 2.对年龄进行排序 *ntt* 3.显示全部职工信息 *n if(i=0)/输入0,退出排序系统,回到主菜单 else if(i=1)/输入1,对编号进行排序 n=0,m,flag=1; for(p=head;NULL!=p;next)/统计职工人数 n+; for(m=1;flag&mnext,p=head,s=p;q;s=p,p=q,q=q- if(p-numq-num)/p为当前节点,p的编号p的后继节点的编号 if(head=p)/p为头结点 head-next=q- head=q; q-next=p;/交换节点信息 q=head- p=head; else p- s- p=q; q=p- flag=1; 排好序的信息如下: print(head);/输出所有节点的信息 return; else if(i=2)/输入2,对年龄进行排序n+)ageage)/对年龄进行排序 if(head=p)n
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1