数据结构课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
之职工工资管理系统(2)
**大学
数据结构课程设计报告
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
目:
院(系): 计算机工程学院
学生姓名:
班级: 学号: 起迄日期:
2011.6.20-2011.7.01
指导教师:
i
指导教师评语: 成绩:
签名:
年 月 日
2010—2011年度 第 2 学期
i
一、需求分析
1.问题描述
对单位的职工进行管理,包括插入、删除、查找、排序等功能。
2.基本功能要求
职工对象包括姓名、性别、出生年月、工作年月、学历、职务、住址、电话等信息。
(1)新增一名职工:将新增职工对象按姓名以字典方式职工管理文件中。
(2)删除一名职工:从职工管理文件中删除一名职工对象。
(3)查询:从职工管理文件中查询符合某些条件的职工。
(4)修改:检索某个职工对象,对其某些属性进行修改。
(5)排序:按某种需要对职工对象文件进行排序。
3(输入和输出
输入和输出,根据输入提示,输入数字或输入长度最长10字符串
二、 概要设计
1(设计思路
根据职工管理系统问题的描述和详细需求分析,要达到上述功能,链表的数据结构来存储职工信息,并对其进行相应的插入、删除、修改、查询、排序、保存等操作。(1)输入功能的实现:要想实现职工管理系统的输入,必须要建立一个职工信息系统的抽象数据类型,其中职工信息以链表的存储方式实现。(2)系统处理功能的实现:系统管理员根据公司的人员流动情况,在提示信息的提示下,选择相应的服务进行操作。(3)输出的实现:根据选择的操作,输出与之对应的信息。(4)根据职工管理系统问题的分析和设计要求,可以得到该职工管理系统可以分为五个模块:职工信息添加模块、职工信息修改模块、职工信息删除模块、职工信息查询模块、职工信息排序模块
2(数据结构设计
依据给定的数据格式,个人信息由九个字段来组成,即编号、姓名、性别、生日、学历、工龄,职务、电话和住址,外加一个判断关键字。使用线性结构来组织数据,因为数据占据空间比较大,要对表中某项数据进行操作,所以使用链表比较方便。
i
(1)定义头结点
typedef struct node
{
char id[10];char name[10];char sex[10];char birth[10]char gl[10];
char xueli[10];char zhiwu[10];char phone[10];char address[10];
struct node *next;
}node,*linklist;
(2)基本操作操作
int initlist(linklist &L) //建立链表
int creatlist(linklist &L) //创建职工信息:
int del(linklist &L,char id[10]) //删除职工信息:
int searchid(linklist &L,char id[10])// 查找职工信息
void display(linklist &L)// 显示职工信息:
3(软件结构设计
(1)
模块 函数或数据结构 功能
typedef struct Node 定义链表结点 链表数据类型
int initlist(linklist &L) 初始化链表
int creatlist(linklist &L) 创建职工信息
int xinlist(linklist&L) 新增员工信息
int del(linklist &L,char id[10]) 删除职工信息
int xiugai(linklist &L,char id[10]) 修改职工信息
void save(linklist &L) 保存职工信息 函数列表 int searchid(linklist &L,char id[10]) 查询职工信息
int searchid(linklist &L,char name[10]) 查询职工信息
void sortgl(linklist &L) (按工龄) 职工信息排序
void sortnm(linklist &L)(按名字字典) 职工信息排序
void sortid(linklist &L) (按编号) 职工信息排序
i
node *load(node *L) 载入员工信息
void display(linklist &L) 显示员工信息
三、 详细设计
1(程序中所用到的函数原型,操作实现
//初始化链表
int initlist(linklist &L) {L=(linklist)malloc(sizeof(node));
if(!L)
return (0);
L->next=NULL;
return 1;}
//创建链表信息
int creatlist(linklist &L) { linklist p;
p=(linklist)malloc(sizeof(node));
scanf(q->data); }
p->next=L->next;
L->next=p;
return(0);}
//显示函数实现
void display(linklist &L) {linklist p;
for(p=L->next;p;p=p->next)
{ printf(p-.>data)//输出职工信息
}
}
//删除
int del(linklist &L,char a[10]) //按id删除4
{ node *p, *r;声明节点指针
p=L->next;r=L;
while(p)//节点不为空
{if(strcmp(p->a,a)==0)
i
{ i=1; r->next=p->next;
free(p);//释放查找到的节点
printf("删除成功\n");
break;}
r=p;
p=p->next;
}
if(i==0)printf ("找不到需要删除的信息!\n");
return 1;
}
//查找操作的实现
int searchid(linklist &L,char a[10])
{
node *p;
p=L;
while(p)
{
if(strcmp(p->a,a)==0)
{printf(p-.>data)//输出职工信息} p=p->next;
}
return 1;
}
2. 主函数和其他函数的伪码算法;
2.(1)主函数的伪码
void main()
{ linklist L;initlist(L);
while(x)//
{ scanf(y) //输入选择数字
switch(y)
{case 1: creatlist(L);break;
case 2: scanf(,&id);//输入员工编号
xiugai(L,id);//调用修改函数
i
case 3:scanf("%s",&id);// 输入删除员工编号 del(L,id);//调用删除函数
case 4:scanf(,&a);// 请输入查询方式
if(a==1)
{scanf(&id);//输入员工编号
searchid(L,id);//调用查找函数
if(a==2)
{scanf(&name);// 输入查询员工姓名
searchname(L,name); //调用查找函数}
case 5:scanf("%d",&k)//输入排序方式
switch(k)//输入选择
{ case 1: sortid(L)//调用排序函数
case 2: sortnm(L) //调用排序函数
case 3: sortgl(L) //调用排序函数}
case 6: display(L)//调用显示函数
case 7: save(L);// /调用保存函数
case8 :xinlist(L);//调用修改函数
case 9:L=load(L); 调用载入函数}
2.1新增信息
int xinlist(linklist &L)//职工信息的插入姓名并按照升序排列 {q=(linklist)malloc(sizeof(node));//申请新节点 {
scanf(,q->data) //输入员工信息
}
if(L->next==NULL)//如果只有链表的头结点,没有其他的结点,直接插入在头
结点后面
{L->next=q;q->next=NULL;}
else{if(strcmp(L->next->name,q->name)>0)//位于链表头结点之后的位
置
{q->next=L->next;L->next=q;}
for(p=L->next;p;p=p->next)
{ if(p->next!=NULL)
{if(strcmp(p->name,q->name)<0&&strcmp(p->next->name,q->name)>0)//
位于两个结点之间
i
{q->next=p->next;p->next=q; }
else if(strcmp(p->name,q->name)<0&&p->next==NULL)//链表非
空,并且在排序中是最后一个
{p->next=q;q->next=NULL;break;}
}
}
}return (0);
}
2.2修改信息
int xiugai(linklist &L,char a[10])
{ node *p;//声明节点指针
p=L;
while(p)
{if(strcmp(p->a,a)==0)//查找符合要求的员工信息
{ i=1; //找到后i=i,做标志
scanf(q->data) //输入员工信息
p=p->next;}
if(i==0)
printf("不存在修改的学生!\n");
else
printf("修改成功!\n");
return 1;
}
2.3排序信息程序
void sort(linklist &L) {
linklist La;//声明节点指针
linklist p,q,m;//声明节点指针
La=(linklist)malloc(sizeof(node));申请新节点
La->next =NULL;
while(L->next)
{for(q=L->next ,p=L->next ;p->next ;p=p->next )//依次选出工龄最大
的节点
i
{if((strcmp( p->next->a,q->a ))>0 )
{m=p;q=p->next ; }
}
if(q==L->next)//删除符合的节点
{L->next =L->next->next ;}
else
{m->next =q->next ;}
q->next =La->next ;//建立新链表
La->next =q ;
}
L=La;
display(L);//调用显示函数
}
2.4保存信息伪码
void save(linklist &L) //7保存
{
FILE *fp; //定义指向文件的指针
node *p; // 定义移动指针
scanf(outfile)// 提示文件名格式信息
if((fp=fopen(outfile,"wb"))==NULL) //为输出打开一个二进制文件,如没有
则建立
{printf("can not open file\n");
exit(1);
} p=L; //移动指针从头指针开始
while(p!=NULL) //如p不为空
{fwrite(p,sizeof(node),1,fp);//写入一条
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
p=p->next; //指针后移 }
fclose(fp); //关闭文件
}
2.5载入信息伪码
node *load(node *L) //9载入信息
{
node *p,*q,*h=NULL; //定义记录指针变量
FILE *fp; // 定义指向文件的指针
char infile[10]; //保存文件名
i
scanf,infile); //输入文件名
if((fp=fopen(infile,"rb"))==NULL) //打开一个二进制文件,为读方式
{exit(1); }
p=(node *)malloc(sizeof(node)); //申请空间
h=p; //申请到空间,将其作为头指针
while(!feof(fp)) //循环读数据直到文件尾结束
{ if(1!=fread(p,sizeof(node),1,fp))
break; //如果没读到数据,跳出循环
p->next=(node *)malloc(sizeof(node)); //为下一个结点申请空间
q=p; //保存当前结点的指针,作为下一结点的前驱
p=p->next; //指针后移,新读入数据链到当前表尾 }
q->next=NULL; //最后一个结点的后继指针为空
fclose(fp); //关闭文件
return h; /*返回头指针*/ }
3.1新增信息
在新增信息中,对按姓名关键字的链表进行插入新节点。分三种情况进行插入,第一 ,当链表为空直接插在头结点后面;第二,当插入位置在两个节点之间;第三,插入的位置在链表的最后。
开始
建立需要新增信息新节点
查找插入位置
链表为空,插入头插在两个节点之间插在链表最后结点后
插入成功
结束
i
3.2 删除算法设计
在删除操作中,将需要删除的节点的关键字依次与链表中每个节点的关键字作比较,找到后,删除该节点,找不到输出删除位置不合理。
开始
将需要删除的节点关键字与链表中的节点依次对比
找到后释放该节点找不到时,输出删信息,输出“删除除“位置不合理”成功”
结束
3.3 查询算法
在查询算法中,职工管理系统提供了2种查询操作,实现了系统的人性化查询操作。这些查询操作分别为:对姓名进行查询,编号进行查询,些列操作。查找算法中,利用链表的指针的移动扫描整个职工信息表,利用strcmp()函数判断字符串是否匹配。查询算法程序流程图如图4所示:
i
开始
输入查询的信息
依次对比查询信息
否输出查找的职工不是否找到在
是
输出符合的信息
结束
i
3.4排序算法设计
在排序算法中,职工管理系统提供了三种查询操作,实现了系统的基本排序操作。这些排序操作分别为:
对姓名进行排序,对性别进行排序,对出生年月进行排序,对工作年月进行排序,等一些列操作。排序算法中,利用链表的指针的移动扫描整个职工信息表,利用strcmp()函数判断字符串是否匹配。
排序算法流程图如图5所示:
开始
依次选择最大排序关键字的节点
依次删除原链表中符合的节点
用选出的节点用头插法建立新链表
将L指向新建链表的头结点
调用输出函数display()
结束
图5 排序算法程序流程图
i
3.5 修改函数
在修改操作中,将需要修改的节点的关键字依次与链表中每个节点的关键字作比较,找到后,输入需要修改的节点信息节点,输出“修改成功”,找不到 出“该员工不存在”。
开始
将需要修改的节点关键字与链表中的节点依次对比
找到后输入该节点找不到时,输出删信息,输出“修改除“需要修改的学成功”生不存在”
结束
01
4. 函数调用关系图
sortid()
sortnm()
Sortgl()creatlist()
display()
mainxiugai()save()
xinlist()
del()*load()
searchid(
)
sortnm()
i
四( 调试分析
1( 编写的程序实现了,
将新增职工对象按姓名以字典方式职工管理文件中,删除一名职工:从职工管理文件中删除一名职工对象,可以选择用编号或姓名查询职工;检索某个职工对象,对其某些属性进行修改。按需要对职工对象的姓名,工龄,编号进行进行排序, 按照用户的需要连续添加n个信息将链表信息依次存入文件,将存入文件的信息读入内存,进行各种操作
2.程序的性能分析
新增:新增信息的算法中,用直接查找的算法,找到后直接插入时间复杂度总体为O(n)
删除:删除的算法,依次把所删除信息的关键字与链表中的关键字依次对比,找到后删除,时间复杂度为O(n).
修改:依次将修改信息的关键字与链表中的信息对比,找到后,输入改变后的信息。时间复杂度为O(n)。
查找:按用户需要,依次将查找信息的关键字与链表中的信息对比,找到后,输入改变后的信息。时间复杂度为O(n)。
创建:根据用户需求,依次输入n个信息,时间复杂度为O(n)。 排序::用的是选择排序的算法,以此将包含最大关键字的节点选出来,然后逆向建立一条新链表,关键字间的比较次数均为n(n-1)/2,建立单链表的时间复杂度为O(n),总时间复杂度为O(n^2).
保存:依次将链表中的信息读入文件中,时间复杂度为O(n)。
载入:依次从文件中读入内存中n个信息,并且建立链表,时间复杂度为O(n)。 3.上机过程中出现的问题及其解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
;
(1)删除的时候,当删除的职工编号不存在时,会出现运行错误,增加了一个标记变量,当没找到时,标记变量值不变,输出“找不到找不到需要删除的信息”。在查找和修改程序中,找不到职工信息也出现了错误,同样用上述办法解决。
(2)新增职工信息中,需要将插入的信息关键字与链表中的信息的关键字进行对比,当比前小比后大就插入它们中间,但如果链表中只有一个信息,出现错误。解决办法:1.先判断链表是否为空,为空直接插入2.是否在第一个结点之前,插入,3.是否在最后一个位置,确定插入位置插入信息。
(3)当按修改删除信息时,职工姓名可能相同,造成删除错误.解决办法: 在结点数据中加入一个职工编号关键字,每个职工编号唯一,如学生学号,按编号
i
进行删除,减少错误。
(4)从文件中读入内存时,读一个显示一个,不能用链表的方法进行查找,删除等操作.解决办法:将读入信息的时候,直接读入结点数据中,然后建立来年链表,进行操作。
4.程序中可以改进的地方
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
在排序中,按三种关键字排序,都是用的选择排序,可以用冒泡等其它排序方法改进。
在查找中,使用的直接查找,如果存的数据比较多,可以先进行排序,连标有序后再进行折半查找。
5.程序中可以扩充的功能及设计实现假想。
可以按各种关键字进行排序,查找,在排序程序中调整排序的关键字,参照其它关键字的排序需程序进行编写扩充。
五、测试结果
2.选择1后输入员工信息
i
3.显示员工信息
4.按姓名排序后的显示信息
i
.5.新增员工信息
6.新增员工插入了排序后的员工信息中
i
7.删除信息
i
9.查询信息
i
10.保存信息
11.载入信息
i
当调用修改函数时,输入信息出错
当调用删除函数时,输入信息出错
当调用查找函数时,输入信息出错
i
6.用户手册
开始
1按编号员工管理系统
5信息排序2按姓名
1添加信息
5信息显示3按工龄
2修改信息选择6信息保存
7新增信息
3删除信息8载入信息
0退出系统
1按编号4查询信息
2按姓名
i
七、体会与自我评价
《数据结构》是计算机专业一门重要的基础课程,在学习本课程较系统地介绍了程序设计中常用的数据结构以及相应的存储结构和实现算法,本课程将为整个专业的学习以及软件设计水平的提高打下良好的基础而且是计算机考研的。想要学好学好《数据结构》,并通过实践上机调试,来掌握编写一些在特定数据结构上的算法,并通过实践上机调试,更好地掌握各种数据结构及其特点,
经过本次课程设计,我对数据结构基本理论和存储结构及算法设计将有了更深入的理解,并提高我们在实际设计操作中系统分析、结构确定、算法选择、数学建模和信息加工的能力,提高我们的C/C++语言程序设计能力。
我觉得职工管理系统现实生活中,有很大的实际意义,公司里都使用职工管理,来使整个公司的管理更为有效,当然,自己做的职工管理系统比较简单,只是一个大系统的缩影。
这次课程设计是围绕数据结构进行。根据问题描述可知,需要解决问题并不很复杂,整个问题只需要实现一个职工管理系统功能,那就是在这个系统中实现对职工信息的插入、删除、查询、排序、修改以及保存,载入等基本功能。但是,为了实现该功能,却需要优秀的算法和数据结构以保证实现的时间和空间效率。把职工信息存储在一个单链表中,利用指针实现对职工信息的各项基本操作。
虽然设计的程序完成了题目描述所需要实现的功能,但是仍然存在不如人意的地方。那就是可以排序上面多设计几个算法。实现多角度排序。经过这次数据结构课程设计,我们不仅及时巩固的了数据结构、算法知识,并了解了数据结构和算法对于程序时间和空间性能的影响,及软件的开发流程。
当我们面对一个实际问题,应该迅速根据问题性质和特点抽象成特定的数据结构,当然每个问题都有可能能够抽象成多种数据结构,每种数据结构适应于不同的算法。因此应该综合考虑这样的数据结构、算法以及它们的空间和时间效率,然后从中选择一个作为实现程序的基础。
此外,对程序的测试应该要仔细,根据模块的特点和测试阶段,采用各种软件测试方法对程序进行测试,确保各个模块的正确性和完整性,最后集成起来测试其是否正确和完整地实现了整个系统的功能。
i
源代码
#include
#include #include #include
typedef struct node//定义结点类型
{
char id[10];
char name[10];
char sex[10];
char birth[10];
char gl[10];
char xueli[10];
char zhiwu[10];
char phone[10];
char address[10];
struct node *next; }node,*linklist;
//头插法生成单链表1
int creatlist(linklist &L)
{
linklist p;
p=(linklist)malloc(sizeof(node));//生成新结点
if(!p)
{
return (0);
}
else
{
printf("请输入员工编号\n");
scanf("%s",p->id);
printf("请输入员工姓名\n");
i
scanf("%s",p->name);
printf("请输入员工性别\n");
scanf("%s",p->sex);
printf("请输入员工生日\n");
scanf("%s",p->birth);
printf("请输入员工龄\n");
scanf("%s",p->gl);
printf("请输入员工学历\n");
scanf("%s",p->xueli);
printf("请输入员工职务\n");
scanf("%s",p->zhiwu);
printf("请输入员工电话\n");
scanf("%s",p->phone);
printf("请输入员工地址\n");
scanf("%s",p->address);
}
p->next=L->next;
L->next=p;
return(0);}
//初始化单链表2
int initlist(linklist &L) {
L=(linklist)malloc(sizeof(node));
if(!L)
return (0);
L->next=NULL;
return 1;
}
//显示所有员工信息3
void display(linklist &L) {
linklist p;
for(p=L->next;p;p=p->next)
i
{
printf("编号 %-10s",p->id);
printf("姓名 %-10s",p->name);
printf("性别 %-10s",p->sex);
printf("生日 %-10s",p->birth);
printf("工龄 %-10s",p->gl);
printf("学历 %-10s",p->xueli);
printf("职务 %-10s",p->zhiwu);
printf("电话 %-10s",p->phone);
printf("地址 %-10s\n",p->address);
}
}
//按id删除4
int del(linklist &L,char id[10]) { int i=0;
node *p;
node *r;
p=L->next;
r=L;
while(p)
{
if(strcmp(p->id,id)==0)
{ i=1;
r->next=p->next;
free(p);
printf("删除成功\n");
break;
}
r=p;
p=p->next;
}
if(i==0)
printf ("找不到需要删除的信息!请确认所输入职工编号\n");
i
return 1;
}
//查询id5
int searchid(linklist &L,char id[10])
{ int i=0;
node *p;
p=L;
while(p)
{
if(strcmp(p->id,id)==0)
{ i=1;
printf("编号 %-10s",p->id);
printf("姓名 %-10s",p->name);
printf("性别 %-10s",p->sex);
printf("生日 %-10s",p->birth);
printf("工龄 %-10s",p->gl);
printf("学历 %-10s",p->xueli);
printf("职务 %-10s",p->zhiwu);
printf("电话 %-10s",p->phone);
printf("地址 %-10s\n",p->address);
}
p=p->next;
}
if(i==0)
printf("\t不存在该职工!请确认所查职工编号。\n");
return 1;
}
//查询姓名6
int searchname(linklist &L,char name[10])
{ int i=0;
node *p;
p=L;
while(p)
i
{
if(strcmp(p->name,name)==0)
{ i=1;
printf("编号 %-10s",p->id);
printf("姓名 %-10s",p->name);
printf("性别 %-10s",p->sex);
printf("生日 %-10s",p->birth);
printf("工龄 %-10s",p->gl);
printf("学历 %-10s",p->xueli);
printf("职务 %-10s",p->zhiwu);
printf("电话 %-10s",p->phone);
printf("地址 %-10s\n",p->address);
}
p=p->next;
}
if(i==0)
printf("\t不存在该职工!请确认所输入职工姓名\n");
return 1;
}
//修改7
int xiugai(linklist &L,char id[10]) { int i=0;
node *p;
p=L;
while(p)
{
if(strcmp(p->id,id)==0)
{ i=1;
printf("请输入要修改的员工信息\n");
printf("请输入员工编号\n");
scanf("%s",p->id);
printf("请输入员工姓名\n");
scanf("%s",p->name);
printf("请输入员工性别\n");
i
scanf("%s",p->sex);
printf("请输入员工生日\n");
scanf("%s",p->birth);
printf("请输入员工龄\n");
scanf("%s",p->gl);
printf("请输入员工学历\n");
scanf("%s",p->xueli);
printf("请输入员工职务\n");
scanf("%s",p->zhiwu);
printf("请输入员工电话\n");
scanf("%s",p->phone);
printf("请输入员工地址\n");
scanf("%s",p->address);
}
p=p->next;
}
if(i==0)
printf("不存在修改的员工~请确认所输入信息\n");
else
printf("修改成功!\n");
return 1;
}
void sortnm(linklist &L)//姓名排序
{
linklist La;
linklist p,q,m;
La=(linklist)malloc(sizeof(node));
La->next =NULL;
while(L->next)//链表不为空
{
for(q=L->next ,p=L->next ;p->next ;p=p->next )
i
{
if((strcmp( p->next->name,q->name ))>0 )
{
m=p;
q=p->next ;
}
}
if(q==L->next)
{
L->next =L->next->next ;
}
else
{
m->next =q->next ;
}
q->next =La->next ;
La->next =q ;
}
L=La;
printf("按姓名排序成功!\n");
}
void sortid(linklist &L)//编号排序 {
linklist La;
linklist p,q,m;
La=(linklist)malloc(sizeof(node));
La->next =NULL;
while(L->next)
i
{
for(q=L->next ,p=L->next ;p->next ;p=p->next )
{
->id ))>0 ) if((strcmp( p->next->id,q
{
m=p;
q=p->next ;
}
}
if(q==L->next)
{
L->next =L->next->next ;
}
else
{
m->next =q->next ;
}
q->next =La->next ;
La->next =q ;
}
L=La;
printf("按编号排序成功!\n");
}
void sortgl(linklist &L) //工龄排序 {
linklist La;
linklist p,q,m;
La=(linklist)malloc(sizeof(node));
i
La->next =NULL;
while(L->next)
{
for(q=L->next ,p=L->next ;p->next ;p=p->next )
{
if((strcmp( p->next->gl,q->gl ))>0 )
{
m=p;
q=p->next ;
}
}
if(q==L->next)
{
L->next =L->next->next ;
}
else
{
m->next =q->next ;
}
q->next =La->next ;
La->next =q ;
}
L=La;
printf("按工龄排序成功!\n");
}
int xinlist(linklist &L)//-------------------职工信息的插入姓名并
按照升序排列
i
{
linklist p,q;
q=(linklist)malloc(sizeof(node));
if(!q)
{
return (0);
}
else
{
printf("请输入员工编号\n");
scanf("%s",q->id);
printf("请输入员工姓名\n");
scanf("%s",q->name);
printf("请输入员工性别\n");
scanf("%s",q->sex);
printf("请输入员工生日\n");
scanf("%s",q->birth);
printf("请输入员工龄\n");
scanf("%s",q->gl);
printf("请输入员工学历\n");
scanf("%s",q->xueli);
printf("请输入员工职务\n");
scanf("%s",q->zhiwu);
printf("请输入员工电话\n");
scanf("%s",q->phone);
printf("请输入员工地址\n");
scanf("%s",q->address);
}
if(L->next==NULL)//如果只有链表的头结点,没有其他的结点,直接插入
在头结点后面
{
L->next=q;
q->next=NULL;
}
else{//链表非空
i
if(strcmp(L->next->name,q->name)>0)//位于链表头结点之后的
位置
{
q->next=L->next;
L->next=q;
}
for(p=L->next;p;p=p->next)
{
if(p->next!=NULL)
{
if(strcmp(p->name,q->name)<0&&strcmp(p->next->name,q->name)>0)//
位于两个结点之间
{
q->next=p->next;
p->next=q;
break;
}
else if(strcmp(p->name,q->name)<0&&p->next==NULL)//
链表非空,并且在排序中是最后一个
{
p->next=q;
q->next=NULL;
break;
}
}
}
}
printf("新增员工信息成功!\n"); return (0);
}
i
node *load(node *L) //9载入信息
{
node *p,*q,*h=NULL; //定义记录指针变量
FILE *fp; // 定义指向文件的指针
char infile[10]; //保存文件名
f1\\te.txt:\n"); printf("Enter infile name,for example c:\\
scanf("%s",infile); //输入文件名
if((fp=fopen(infile,"rb"))==NULL) //打开一个二进制文件,为读方
式
{
printf("can not open file\n"); //如不能打开,则结束程序
exit(1);
}
printf("\n -----Loading file!-----\n");
p=(node *)malloc(sizeof(node)); //申请空间
if(!p)
{
printf("out of memory!\n");
return h; //返回空头指针
}
h=p; //申请到空间,将其作为头指针
while(!feof(fp)) //循环读数据直到文件尾结束
{
if(1!=fread(p,sizeof(node),1,fp))
break; //如果没读到数据,跳出循环
p->next=(node *)malloc(sizeof(node)); //为下一个结点申请空
间
if(!p->next)
{
printf("out of memory!\n"); /*如没有申请到,则内存溢出*/
return h;
}
q=p;
p=p->next; //指针后移,新读入数据链到当前表尾
}
i
q->next=NULL; //最后一个结点的后继指针为空
fclose(fp); //关闭文件
printf("---You have success read data from file!!!---\n");
return h; /*返回头指针*/
}
/*保存数据到文件*/
void save(linklist &L) //7保存
{
FILE *fp; //定义指向文件的指针
node *p; // 定义移动指针
char outfile[10]; //保存输出文件名
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); //提示
文件名格式信息
scanf("%s",outfile); if((fp=fopen(outfile,"wb"))==NULL) //为输出打开一个二进制文件,如
没有则建立
{
printf("can not open file\n");
exit(1);
}
printf("\nSaving file......\n"); //打开文件,提示正在保存 p=L->next; //移动指针从第一个结点开始
while(p!=NULL) //如p不为空
{
fwrite(p,sizeof(node),1,fp);//写入一条记录 p=p->next; //指针后移
}
fclose(fp); //关闭文件
printf("-----save success!!-----\n"); //显示保存成功 }
//主函数
void main()
{
linklist L;
i
initlist(L);
int a;
int k;
char m;
char name[10];
char id[10];
int y;
int x=1;
while(x)
{
printf("****************************************************\n");
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(" 9载入员工信息\n");
printf(" 0退出\n");
printf("*****************************************************\n")
;
printf("请输入代码:");
scanf("%d",&y);
switch(y)
{
case 1: creatlist(L);
do
{
printf("否继续输入?(y/n)");
i
getchar();
scanf("%c",&m);
if(m=='y')
{
creatlist(L);
}
}
while(m!='n');
break;
case 2: printf("请输入修改员工编号");
getchar();
scanf("%s",&id);
xiugai(L,id);
break;
case 3: printf("请输入删除员工编号\n");
getchar();
scanf("%s",&id);
del(L,id);
break;
case 4: printf("请输入查询方式(1按编号查询,2按姓名查
找)\n");
scanf("%d",&a);
if(a==1)
{
printf("请输入查询员工编号\n");
scanf("%s",&id);
searchid(L,id);
}
if(a==2)
{
printf("请输入查询员工姓名\n");
scanf("%s",&name);
i
searchname(L,name);
}
break;
case 5:printf("请输入排序方式(1按编号排序,2按姓名排序3按
工龄排序)");
scanf("%d",&k);
switch(k)
{
case 1: sortid(L);break;
case 2: sortnm(L);break;
case 3: sortgl(L);break;
default : printf("error\n");break;
}
break;
case 6: printf("所有员工信息如下所示\n");
display(L);break;
case 7: printf("保存所有员工信息\n");
save(L); break;
case 8: printf("请输入新增员工信息\n");
xinlist(L); break; case 9:L=load(L); break;
case 0: x=0; break;
}
}
}
i