最终的职工信息管理系统源代码精.docx
- 文档编号:18616022
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:29
- 大小:19.78KB
最终的职工信息管理系统源代码精.docx
《最终的职工信息管理系统源代码精.docx》由会员分享,可在线阅读,更多相关《最终的职工信息管理系统源代码精.docx(29页珍藏版)》请在冰点文库上搜索。
最终的职工信息管理系统源代码精
#include
#include
#include
#include
intsaveflag=0;//是否需要存盘的标志变量
structemployee
{
charname[15];
charnum[10];
charsex[4];
charpozition[15];
longsalary;
charxueli[20];
charaddress[100];
charmarriage[10];
intage;
};
typedefstructnode
{
structemployeedata;
structnode*next;
}Node,*Link;
voidadd(Linkl;//添加
voiddisp(Linkl;//浏览
voiddel(Linkl;//删除
Node*Locate(Linkl,charfindmess[],charnameornum[];
voidQur(Linkl;//查询
voidTongji(Linkl;//统计
voidSort(Linkl;//排序
voidModify(Linkl;//修改
voidSave(Linkl;//保存
voidprinte(Node*p;//打印链表中的节点
//工具函数
voidprintstart(;
voidWrong(;
voidNofind(;
voidprintc(;
voidmenu(
{
system("color07";
printf("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★\n";
printf("\t\t★★\n";
printf("\t\t★欢迎进入职工信息管理系统★\n";
printf("\t\t★★\n";
printf("\t\t★[1]创建职工信息[2]删除职工信息★\n";
printf("\t\t★[3]查询职工信息[4]修改职工信息★\n";
printf("\t\t★[5]追加职工记录[6]统计职工信息★\n";
printf("\t\t★[7]排序职工信息[8]保存职工信息★\n";
printf("\t\t★[9]浏览职工信息[0]退出系统★\n";
printf("\t\t★★\n";
printf("\t\t★创造者:
龙丹万莎廖杰红沈冠★\n";
printf("\t\t★九天出品必属精品★\n";
printf("\t\t★(^o^(*^__^*O(∩_∩O(≧▽≦★\n";
printf("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★\n";
}
voidDisp(Linkl
{
intcount=0;
Node*p;
p=l->next;//l储存的是单链表头节点的指针,头节点无职工信息
if(!
p//p==NULLNULL在stdlib中定义为0
{
printf("\n====>提示:
没有职工记录可以显示!
\n";
return;
}
printf("\t\t\t\t显示结果\n";
printstart(;
printc(;
printf("\n";
while(p//逐条输出链表中储存的职工信息
{
printe(p;
p=p->next;
}
printstart(;
printf("\n";
}
voidprintstart(
{
printf("------------------------------------------------------------------------------\n";
}
voidWrong(
{
printf("\n===>提示:
输入错误!
\n";
}
voidNofind(
{
printf("\n===>提示:
没有找到该职工!
\n";
}
voidprintc(
{
printf("工号\t姓名\t性别\t年龄\t学历\t职称\t工资\t地址\t婚否\n";
printstart(;
}
voidprinte(Node*p
{
printf("%s\t%s\t%s\t%d\t%s\t%s\t%ld\t%s\t%s\n",p->data.num,p->data.name,p->data.sex,p->data.age,p->data.xueli,p->data.pozition,p->data.salary,p->data.address,p->data.marriage;
}
Node*Locate(Linkl,charfindmess[],charzcornum[]//该函数用于定位链表中符合要求的节点,并返回该指针
{
Node*r;
if(strcmp(zcornum,"num"==0//按工号查询
{
r=l->next;
while(r!
=NULL
{
if(strcmp(r->data.num,findmess==0
returnr;
r=r->next;
}
}
elseif(strcmp(zcornum,"pozition"==0//按职称查询
{
r=l->next;
while(r!
=NULL
{
if(strcmp(r->data.pozition,findmess==0
returnr;
r=r->next;
}
}
elseif(strcmp(zcornum,"name"==0//按姓名查询
{
r=l->next;
while(r!
=NULL
{
if(strcmp(r->data.name,findmess==0
returnr;
r=r->next;
}
}
return0;//若未找到返回一个空指针
}
voidAdd(Linkl//次函数中无节点时r指向list头有节点时r指向list尾
{
Node*p,*r,*s;//实现添加操作的临时结构体指针变量
charnum[10];
intflag=0;
r=l;
s=l->next;//链表无节点时s=NULL有节点时指向第一个职工节点
while(r->next!
=NULL//如果存在后继节点时r指针后移一个
r=r->next;//将指针移至链表末尾准备添加记录
while(1
{
printf("请你输入工号(以‘0’返回上一级菜单:
)";
scanf("%s",num;
if(strcmp(num,"0"==0//输0跳出
break;
s=l->next;//每次从第一个节点开始找看num是否重复
while(s//工号重复时返回主菜单
{
if(strcmp(s->data.num,num==0
{
printf("====>提示:
工号为%s的职工已经存在,若要修改请选择4!
\n",num;
flag=1;
return;
}
s=s->next;
}
p=(Node*malloc(sizeof(Node;//生成新节点p
strcpy(p->data.num,num;
printf("请输入姓名:
";
scanf("%s",p->data.name;
getchar(;
printf("请输入性别:
";
scanf("%s",p->data.sex;
getchar(;
printf("请输入年龄:
";
scanf("%d",&p->data.age;
getchar(;
printf("请输入学历:
";
scanf("%s",p->data.xueli;
getchar(;
printf("请输入职称:
";
scanf("%s",p->data.pozition;
getchar(;
printf("请输入工资:
";
scanf("%ld",&p->data.salary;
getchar(;
printf("请输入地址:
";
scanf("%s",p->data.address;
getchar(;
printf("请输入婚否:
";
scanf("%s",p->data.marriage;
getchar(;
p->next=NULL;//表明这是链表的尾部节点
r->next=p;//将新建的节点加入链表尾部中
r=p;
saveflag=1;
}
}
voidDel(Linkl
{
intsel;
Node*p,*r;//实现删除操作的临时结构体指针变量
charfindmess[20];
if(!
l->next//当list无后继节点时提示和返回del(
{
printf("\n====>提示:
没有记录可以删除!
\n";
return;
}
printf("\n====>1按工号删除\n====>2按姓名删除\n";
scanf("%d",&sel;
if(sel==1
{
printf("请您输入要删除的工号:
";
scanf("%s",findmess;
p=Locate(l,findmess,"num";
if(p
{
r=l;
while(r->next!
=p
r=r->next;//从第一个节点找起直到找到待删除的节点跳出循环
r->next=p->next;
free(p;
printf("\n====>提示:
该职工已经成功删除!
\n";
saveflag=1;
}
elseNofind(;
}
elseif(sel==2
{
printf("请您输入要删除的姓名:
";
scanf("%s",findmess;
p=Locate(l,findmess,"name";
if(p
{
r=l;
while(r->next!
=p
r=r->next;
r->next=p->next;
free(p;
printf("\n====>提示:
该职工已经成功删除!
\n";
saveflag=1;
}
elseNofind(;
}
elseWrong(;
}
voidQur(Linkl
{
intsel;
charfindmess[20];
Node*p;//实现查询操作的临时结构体指针变量
if(!
l->next
{
printf("\n====>提示:
没有资料可查询!
\n";
return;
}
printf("\n====>1按工号查询\n====>2按职称查询\n====>3按姓名查询\n";
scanf("%d",&sel;
if(sel==1
{
printf("请你输入要查找的工号:
";
scanf("%s",findmess;
p=Locate(l,findmess,"num";
if(p
{
printf("\t\t\t\t查找结果\n";
printstart(;
printc(;
printe(p;
printstart(;
}
elseNofind(;
}
elseif(sel==2
{
printf("请您输入要查找的职称:
";
scanf("%s",findmess;
p=Locate(l,findmess,"pozition";
if(p
{
printf("\t\t\t\t查找结果\n";
printstart(;
printc(;
printe(p;
printstart(;
}
elseNofind(;
}
elseif(sel==3
{
printf("请您输入要查找的姓名:
";
scanf("%s",findmess;
p=Locate(l,findmess,"name";
if(p
{
printf("\t\t\t\t查找结果\n";
printstart(;
printc(;
printe(p;
printstart(;
}
elseNofind(;
}
elseWrong(;
}
voidModefy(Linkl
{
Node*p;
charfindmess[20];
if(!
l->next
{
printf("\n====>提示:
没有资料可以修改!
\n";
return;
}
printf("请您输入要修改的职工工号:
";
scanf("%s",findmess;
p=Locate(l,findmess,"num";
if(p
{
printf("请您输入新工号(原来是%s):
",p->data.num;
scanf("%s",p->data.num;
printf("请您输入新姓名(原来是%s):
",p->data.name;
scanf("%s",p->data.name;
printf("请您输入新性别(原来是%s):
",p->data.sex;
scanf("%s",p->data.sex;
printf("请您输入新年龄(原来是%d):
",p->data.age;
scanf("%d",&p->data.age;
printf("请您输入学历(原来是%s):
",p->data.xueli;
scanf("%s",p->data.xueli;
printf("请您输入职称(原来是%s):
",p->data.pozition;
scanf("%s",p->data.pozition;
printf("请您输入工资(原来是%ld):
",p->data.salary;
scanf("%ld",&p->data.salary;
printf("请您输入地址(原来是%s):
",p->data.address;
scanf("%s",p->data.address;
printf("请您输入婚否(原来是%s):
",p->data.marriage;
scanf("%s",p->data.marriage;
printf("\n====>提示:
资料修改成功!
\n";
}
elseNofind(;
}
voidInsert(Linkl//按工号查询到要插入节点的位置然后在该工号之后插入一个新节点
{
Node*s,*r,*p;//p指向插入位置p指新插入记录节点
charch,new_num[10],old_num[10];//前一个保存插入点位置之前的工号后一个保存输入的新记录的工号
intflag=0;
s=l->next;
system("cls";
Disp(l;
while(1
{
printf("请您输入已存在的工号(以0返回上一级菜单:
)";
scanf("%s",old_num;
if(strcmp(old_num,"0"==0
return;
s=l->next;
flag=0;
while(s//查询该工号是否存在
{
if(strcmp(s->data.num,old_num==0
{
flag=1;
break;
}
s=s->next;
}
if(flag==1//若工号存在则进行插入之前的新记录的输入操作
break;
else
{
getchar(;
printf("\n====>%s不存在,是否重新再输入?
(y/n):
",old_num;
scanf("%c",&ch;
if(ch=='y'||ch=='Y'
{
continue;
}
else
{
return;
}
}
}
//以下记录新节点类似add
printf("请您输入待插入的工号(以0返回上一级菜单:
)";
scanf("%s",new_num;
if(strcmp(new_num,"0"==0
return;
s=l->next;//每次从第一个节点开始找看num是否重复
while(s//工号重复时返回主菜单
{
if(strcmp(s->data.num,new_num==0
{
printf("====>提示:
工号为%s的职工已经存在!
\n",new_num;
flag=1;
return;
}
s=s->next;
}
p=(Node*malloc(sizeof(Node;
if(!
p
{
printf("\nallocatememoryfailure";//申请空间失败
return;
}
strcpy(p->data.num,new_num;
printf("请您输入姓名:
";
scanf("%s",p->data.name;
getchar(;
printf("请您输入性别:
";
scanf("%s",p->data.sex;
getchar(;
printf("请您输入年龄:
";
scanf("%d",&p->data.age;
getchar(;
printf("请您输入学历:
";
scanf("%s",p->data.xueli;
getchar(;
printf("请您输入职称:
";
scanf("%s",p->data.pozition;
getchar(;
printf("请您输入工资:
";
scanf("%ld",&p->data.salary;
getchar(;
printf("请您输入地址:
";
scanf("%s",p->data.address;
getchar(;
printf("请您输入婚否:
";
scanf("%s",p->data.marriage;
getchar(;
p->next=NULL;//表明这是链表的结尾
saveflag=1;//在主函数中有对该全局变量的判断若为1则进行存盘操作
r=l->next;//将指针赋值给r因为l中的头节点的下一个节点才实际保存着记录
while(1
{
if(strcmp(r->data.num,old_num==0//在链表中插入一个节点
{
p->next=r->next;
r->next=p;
break;
}
r=r->next;
}//r作为查询指针从第一个节点找起直到找到后跳出循环
Disp(l;
printf("\n\n";
}
voidTongji(Linkl
{
Node*p;
inta=0,b=0,c=0;
intdeal;
p=l;
printf("请输入您想统计的项目\n";
printf("====>1对各工资段的人数进行统计\n";
printf("====>2对各年龄段的人数进行统计\n";
scanf("%d",&deal;
if(deal==1
{
while(1
{
if(p->data.salary>=5000a++;
elseif(p->data.salary>=2000&&p->data.salary<5000b++;
elsec++;
p=p->next;
if(p==NULL
break;
}
system("cls";
Disp(l;
printf("====>工资大于等于5000的人数是:
%d\n",a-1;
printf("====>工资大于等于2000且小于5000的人数是:
%d\n",b;
printf("====>工资小于2000的人数是:
%d\n",c;
}
elseif(deal==2
{
while(1
{
if(p->data.age>=30a++;
elseif(p->data.age>=18&&p->data.age<30b++;
elsec++;
p=p->next;
if(p==NULL
break;
}
system("cls";
Disp(l;
printf("====>年龄大于等于30的人数是:
%d\n",a-1;
printf("====>年龄大于等于18且小于30的人数是:
%d\n",b;
printf("====>年龄小于18的人数是:
%d\n",c;
}
elseWrong(;
}
voidSort(Linkl
{
Linkll;
Node*p,*rr,*s;
inti=0;
intselect;
if(l->next==NULL
{
system("cls";
printf("\n===>没有职工记录!
\n";
getchar(;
return;
}
ll=(Node*malloc(sizeof(Node;
if(!
ll
{
printf("\nallocatememoryfailure";
return;
}
ll->next=NULL;
system("cls";
Disp(l;
p=l->next;
printf("请选择排序方法:
\n";
printf("====>1按年龄排序\n====>2按工资排序\n";
scanf("%d",&select;
while(p
{
s=(Node*malloc(sizeof(Node;//新建节点用于保存从原链表中取出的节点信息
if(!
s//s=NULL
{
printf("\nallocatememoryfailure";
return;
}
s->data=p->data;//填数据域
s->next=NULL;//指针域为空
rr=ll;//rr链表于储存插入单个节点后保存排序的链表ll是这个链表的头指针每次从头开始查找插入位置
if(select==1
{
while(rr->next!
=NULL&&rr->next->data.age>=p->data.age
{
rr=rr->next;//指针移至年龄比p所指节点的年龄小的节点位置
}
if(rr->next==NULL//若新链表ll中的所有节点的年龄都比p大则将p插入末尾
rr->next=s;
else//否则将该节点插入至第一个年龄比他小的前面
{
s->next=rr->next;
rr->next=s;
}
p=p->next;//原链表的指针下移一个节点
}
elseif(select==2
{
while(rr->next!
=NULL&&rr->next->data.salary>=p->data.salary
{
rr=rr->next;
}
if(rr->next==NULL
rr->next=s;
else
{
s->next=rr->next;
rr->next=s;
}
p=p->next;
}
elseWrong(;
}
l->next=ll->next;//ll中储存的是已排序的链表的头指针
Disp(l;
saveflag=1;
printf("\n====>排序完成!
\n";
}
voidSave(Linkl
{
FILE*fp;
Node*p;
intflag=1,count=0;
fp=fopen("employee.txt","wb";
if(fp==NULL
{
printf("\n====>提示:
重新打开文件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最终 职工 信息管理 系统 源代码