《例810为某一单位编写一个简单的员工信息管理程序其中,.doc》由会员分享,可在线阅读,更多相关《例810为某一单位编写一个简单的员工信息管理程序其中,.doc(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、例810为某一单位编写一个简单的员工信息管理程序。其中, 例8.10 为某一单位编写一个简单的员工信息管理程序。其中,每一个员工的属性包括:员工编号(不重复)、姓名、年龄、所属部门、职位、;主要的管理功能包括:增加员工;删除员工;按照编号查询员工的信息;修改员工的属性等。要求利用散列表存储员工信息。分析根据题意要求,定义员工记录类型的C语言描述如下:typedef struct intkey_num; /*员工的编号,即员工记录的关键字*/ char name10;/*员工的姓名*/ intage;/*员工的年龄*/ char department15; /*员工所在的部门*/ char po
2、sition15; /*员工的职位*/ long tele;/*员工的*/employee_type; 为了永久的保存员工的信息,防止重复的输入,假定已经将员工信息保存在文件“emp_list.dat中。下面给出了保存员工信息的函数save(),用户可以调用此函数实现在磁盘上建立文件。 void save FILE *fp; int i; employee_type s; if fpfopenemp_list.dat,wbNULL /*以写的方式翻开文件emp_list.dat*/ printfcannot open filen; return; fori0;iSIZE;i+/*循环次数由SI
3、ZE决定,它需要事先定义*/ scanf%d%s%d%s%s%ld, /*读取员工信息*/ &s.key_num,s.name,&s.age,s.department,s.position,&s.tele; if fwrite&s,sizeofemployee_type,1,fp!1 /*将员工信息s写入文件中*/ printffile write errorn; fclosefp;/*关闭文件*/ 对员工信息实现管理首先需要将员工信息从文件读入到内存的散列表中,接着对员工信息进行输出、修改、插入、删除、查询等操作,实际上就是对散列表实现根本操作,当操作完成之后,把处理后的结果再写回文件中。根
4、据题意,程序中包括如下功能: (1)输出员工信息表。 (2)编辑员工信息:首先输入员工的编号,假设找到对应的员工记录,那么输入其它需要修改的属性信息,把修改后的员工记录写回原来的位置;假设没有找到对应的员工记录,那么插入一个新记录,需要输入新员工的各项属性信息,然后把新员工插入到散列表的适宜位置上。 (3)删除员工信息:根据输入的员工编号,删除对应的员工记录。 (4)按照员工的编号查询对应员工的所有相关信息。在此仅设计出最根本的查询功能,用户可以根据实际的需求设计出更为复杂的查询功能。 用散列表存储员工信息,需要设计出合理的散列函数和解决冲突的方法。在本程序中,员工的编号是员工记录的关键字。这
5、里为了问题的简单化,选择除留余数法设计散列函数,即hashkey key % M,M为散列表的长度。在处理冲突问题时,本程序使用的是链地址法,如果使用线性探测法解决冲突,读者只需对程序作简单的修改即可实现。 2.程序源代码#include#include#include#define M 13 /*M为散列表的长度,可根据具体问题,自己设计大小*/typedef struct /*定义员工记录的类型*/intkey_num; char name10;intage; char department15; char position15; long tele;employee_type;typed
6、ef struct node /*定义存储员工记录的单链表*/employee_type data; struct node *next;Lnode;void initHashLnode *h/*初始化散列表,将散列表中每一个单元置为空*/int i; fori0;iM;i+ hiNULL;int hashint key /*散列函数,根据关键字计算散列地址*/return key%M;int insertLnode *h, employee_type item /*向散列表中插入一个记录item*/int d;Lnode *p;dhashitem.key_num;/*计算新记录的散列地址*/
7、pLnode *mallocsizeofemployee_type;/*为新记录分配存储空间*/if pNULL return 0;/*返回0表示插入失败*/p-dataitem;p-nexthd; /*将新记录插入到对应单链表的表头*/hdp;return 1;/*插入成功返回1*/ void loadLnode *h /*将事先写入文件的员工信息读入散列表*/FILE *fp; employee_type s; if fpfopenemp_list.dat,rbNULL /*翻开文件,如果失败输出信息并返回*/ printfcannot open the filen; return; fr
8、ead&s,sizeofemployee_type,1,fp;/*从文件里读取员工记录*/while!feoffp /*文件没结束*/ if !inserth,s /*向散列表插入员工的信息*/ printfcan not insert hash,load failed;/*插入失败,返回*/return; fread&s,sizeofemployee_type,1,fp; /*继续读取下一个记录*/ fclosefp; void printLnode *h/*输出散列表中的员工信息*/ int i; Lnode *p; printfn-员工信息列表- n; fori0;iM;i+ /*依次访
9、问散列中的每一记录*/ if hi/*对应的元素不为空*/ phi;/*遍历输出单链表*/ whilep printf%d,%s,%d,%s,%s,%ldn,p-data.key_num,p-data.name, p-data.age,p-data.department,p-data.position,p-data.tele; pp-next; printf employee_type *searchLnode *h,int k /*在散列表中查询编号为k的员工的信息*/ int d; Lnode *p;dhashk;/*计算散列地址*/phd;/*得到对应单链表的表头指针*/ whilep/
10、*在对应的单链表中查询员工的信息*/ ifp-data.key_numk /*假设在单链表中查找成功,返回该记录的地址*/ return &p-data;else pp-next; return NULL;/*查找失败返回空指针*/ int deleLnode *h,int k /*在散列表中删除编号为k的员工*/int d; Lnode *p,*q;dhashk; /*计算散列地址*/phd; /*得到对应单链表的表头指针*/if !p return 0; /*假设单链表为空,返回0,说明删除失败*/if p-data.key_numk /*假设删除的记录是表头结点,删除它并返回1*/hdp
11、-next; freep; return 1; qp-next;/*假设删除的记录是非表头结点,在单链中查找被删除的记录*/whileqif q-data.key_numk /*找到被删除的记录,删除它并返回1*/ p-nextq-next;freeq; return 1; else pq; -next; return 0;/*返回0,说明删除失败*/ void save Lnode *h/*将散列表中的记录写回文件*/ FILE *fp;int i;Lnode *p;employee_type s ;if fpfopenemp_list.dat,wbNULL /*翻开文件*/ printfc
12、annot open filen; return; for i0;iM;i+/*依次访问散列表中的每一个记录*/if hi /*如果对应的单链表非空*/ phi; /*得到表头指针*/ whilep/*遍历单链表,将每一个记录写入文件*/ if fwrite&p-data,sizeofemployee_type,1,fp!1 printffile write errorn; /*写文件失败*/ fclosefp; return; pp-next; fclose fp; /*关闭文件*/ mainLnode *hashM; /*定义一个散列表*/ employee_type *s,emp; in
13、t p; int flag1,select; initHash hash; /*初始化散列表*/ load hash;/*把文件中的记录读入散列表中*/ whileflag /*当flag为真时执行循环*/ printfn* 欢送使用本软件*n;/*显示菜单*/ printf 1 输出员工信息列表 n; printf 2 编辑员工信息n; printf 3 删除员工信息n; printf 4 查询员工信息n; printf 5 退出软件 n; printf*n; printf 请输入你的选择1-5:n; scanf%d,&select; /*根据菜单提示输入操作选项*/ switch sele
14、ctcase 1:/*输出员工信息表*/ printhash; break; case 2: /*修改或者增加员工信息*/ printf输入员工编号:; scanf%d,&p; emp.key_nump; if ssearchhash,p/*假设该编号存在,修改信息*/ printf%d号员工原来的信息是 :%s,%d,%s,%s,%ldn, p,s-name,s-age,s-department,s-position,s-tele; printf-请输入更新的信息-n 姓名,年龄,部门,职位, 号码:n; scanf%s%d%s%s%ld,emp.name,&emp.age, emp.dep
15、artment,emp.position,&emp.tele;*semp; /*将修改后的信息写入散列表中*/ else /*假设编号不存在,增加一个新的员工*/ printf-请输入新员工的信息-n 姓名,年龄,部门,职位, 号码:n; scanf%s%d%s%s%ld,emp.name,&emp.age, emp.department,emp.position,&emp.tele; inserthash,emp; /*在散列表中插入一个新记录*/ break;case 3: /*删除员工信息*/ printf请输入要删除员工的编号:; scanf%d,&p;if delehash,p pr
16、intf删除成功n; else printf此员工不存在n; break;case 4: /*查询员工的信息*/ printf请输入要查询的员工编号:; scanf%d,&p; ssearchhash,p;/*在散列表中作查询*/if s /*查找成功,输出对应的员工的信息*/ printf查询结果:n%d,%s,%d,%s,%s,%ldn, s-key_num,s-name,s-age,s-department,s-position,s-tele; else printf此员工不存在n; break;case 5: /*选择退出软件*/ printf本次操作结束. 再见!n; flag0; savehash; /*把处理之后的散列表重新写回原文件*/ 程序运行的结果如下: