职工信息管理系统单链表实现C语言源程序Word文档下载推荐.docx
《职工信息管理系统单链表实现C语言源程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《职工信息管理系统单链表实现C语言源程序Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。
![职工信息管理系统单链表实现C语言源程序Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-12/14/243cb1f3-2ff0-4361-bab7-ea0851e3a69c/243cb1f3-2ff0-4361-bab7-ea0851e3a69c1.gif)
\n"
);
exit(-1);
(*head)->
next=NULL;
/*将头结点的指针域置为空*/
}
ListNode*Locatenum(LinkListhead,charfind[])//通过职工工号查找,返回定位指针。
LinkListp;
p=head->
next;
if(!
p)//如果职工信息记录为空,返回NULL。
returnNULL;
while(p)
{
if(strcmp(p->
data.num,find)==0)
returnp;
p=p->
}
returnNULL;
ListNode*Locatename(LinkListhead,charfind[])//通过职工姓名查找,返回定位指针。
data.name,find)==0)
ListNode*Locatesalary(LinkListhead,intsalary)//通过职工工资查找,返回定位指针。
if(p->
data.salary==salary)
voidNofind()
printf("
\n***提示***:
没有找到该职工!
voidModify(LinkListL)//修改功能。
ListNode*p;
charfind[20];
L->
next)
{
\n***提示***:
没有资料可以修改!
return;
}
请你输入要修改的职工工号:
"
scanf("
%s"
find);
p=Locatenum(L,find);
if(p)
请你输入新的工号(原来是%s):
p->
data.num);
scanf("
getchar();
请你输入新的姓名(原来是%s):
data.name);
请你输入新的性别(原来是%s):
data.sex);
请你输入新的年龄(原来是%d):
data.age);
%d"
&
p->
请你输入新的学历(原来是%s):
data.education);
请你输入新的工资(原来是%d):
data.salary);
请你输入新的电话(原来是%s):
data.phone);
请你输入新的住址(原来是%s):
data.address);
资料修改成功!
saveflag=1;
else
Nofind();
//if(p)结束
}//voidModify(LinkListL)//修改功能结束
voidAdd(LinkListhead)/*录入职工信息*/
system("
cls"
ListNode*p,*r,*s;
/*实现添加操作的临时的结构体指针变量*/
intsign;
/*标记重复工号的变量*/
r=head;
s=head->
/*链表没有节点时,s=NULL;
链表有节点时,指向第一个职工节点*/
while(r->
next!
=NULL)/*如果存在后继结点时,r指针后移一个*/
r=r->
/*将指针移至于链表最末尾,准备添加记录*/
输入‘#’将退出职工信息录入,退回至主菜单!
\n\n"
while
(1)
(PS:
职工号为‘#’即退出录入功能)\n\n"
请输入职工号:
fflush(stdin);
//清除缓冲区。
gets(num);
if(strcmp(num,"
#"
)==0)/*输入‘0’,跳出while
(1),即跳出Add()函数*/
break;
s=head->
/*每次从第一个节点开始找,看num是否重复。
*/
while(s)
{
if(strcmp(s->
data.num,num)==0)
{
printf("
***提示***\n工号为:
‘%s’的职工信息已经存在!
num);
若要修改请按‘4’,放弃请按‘0’!
scanf("
sign);
if(sign==4)
Modify(head);
else
return;
}
s=s->
}//while(s)
if((p=(LinkList)malloc(sizeof(ListNode)))==NULL)//生成没赋值的新节点p。
printf("
退出程序!
exit(-1);
}
strcpy(p->
data.num,num);
printf("
请输入该职工姓名:
scanf("
getchar();
请输入该职工的性别:
(注:
男性:
male;
女性:
female)"
请输入该职工的年龄:
请输入该职工的学历:
请输入该职工的工资:
请输入该职工的电话号码:
请输入该职工的住址:
gets(p->
p->
/*表明这是链表的尾部结点*/
r->
next=p;
/*将新建的结点加入链表尾部中*/
r=p;
saveflag=1;
}//while
(1)
}//voidAdd函数结束。
voidprintline()//打印横线。
--------------------------------------------------------------------------------\n"
voidprintsubject()//打印各分类标题。
工号\t姓名性别年龄学历工资电话\t\t住址\n"
voidprintLinkList(LinkListp)//打印p结点各个数据成员的值。
%s%s%s%d%s%d%s%s\n"
data.num,p->
data.name,p->
data.sex,p->
data.age,p->
data.education,p->
data.salary,p->
data.phone,p->
voidAllemployeeinfo(LinkListhead)//显示所有职工信息。
intcount=0;
p)
***提示***:
目前没有存储任何职工记录!
返回主菜单,请重新选择功能!
\t\t\t\t显示结果\n"
printline();
printsubject();
printLinkList(p);
count++;
已经存储了%d条职工信息!
count);
voidWrong()
输入错误!
voidmenu()//主菜单。
\t*******************************************************************\n"
\t**\n"
\t*<
职工信息管理系统_单链表实现>
*\n"
\t*[1]录入职工信息[2]删除职工信息*\n"
\t*[3]查询职工信息[4]修改职工信息*\n"
\t*[5]插入职工记录[6]统计职工信息*\n"
\t*[7]排序[8]保存职工信息*\n"
\t*[9]显示所有职工记录[0]退出系统*\n"
\t*版权所有人:
彭林*\n"
\t*电子132班*\n"
\t*1319200063*\n"
}//voidmenu菜单结束。
voidDel(LinkListL)//删除职工信息。
intselect;
//删除方式选择记录变量。
ListNode*p,*r;
next)//当list无后继结点时,提示和结束Del()函数。
没有记录可以删除!
\n按工号删除,请按‘1’\n按姓名删除,请按‘2’\n"
\n=====>
功能选择:
select);
if(select==1)
请输入要删除的职工工号:
p=Locatenum(L,find);
if(p)
{
r=L;
while(r->
=p)
r=r->
//从第一个结点找起,直到发现r->
next=p,是待删除结点,跳出循环。
next=p->
free(p);
该职工信息已成功删除!
}
else
Nofind();
}//if(select==1).
elseif(select==2)
请输入要删除的职工姓名:
p=Locatename(L,find);
}//if(select==2).
else
Wrong();
//显示输入错误的话
}//voidDel()删除函数结束。
voidSearch(LinkListL)//查询职工信息。
intsign=0;
//实现查询操作的临时结构体指针变量。
next)
没有职工信息资料可以查询!
\n按工号查找,请按‘1’\n按工资查找,请按‘2’\n按姓名查找,请按‘3’\n"
if(select==1)//工号。
请输入要查找的工号:
\t\t\t\t查找结果\n"
printline();
//打印横线。
printsubject();
//打印各分类标题。
printLinkList(p);
//打印p结点各个数据成员的值。
elseif(select==2)//工资。
请输入要查找的工资:
salary);
p=Locatesalary(L,salary);
\t\t\t\t查找结果\n"
sign++;
while(p)
p=Locatesalary(p,salary);
if(p)
if(sign==0)
elseif(select==3)//姓名。
请输入要查找的姓名:
}//voidSearch()查询函数结束。
voidSave(LinkListL)//信息保存到文件中。
FILE*fp;
intflag=1;
fp=fopen("
Employeeinfo.txt"
"
wb"
if(fp==NULL)
打开文件时发生错误!
p=L->
if(fwrite(p,sizeof(ListNode),1,fp)==1)//将第一个记录结点值写入文件。
{
p=p->
//依次写入下一个结点的值。
count++;
//文件的记录数+1。
}
else
flag=0;
写入文件过程发生错误!
}//while(p).
if(count>
0)
文件保存成功。
(有%d条记录已经保存。
)\n"
saveflag=0;
system("
//清屏。
文件保存失败!
‘0’条记录被保存。
fclose(fp);
}//voidSave()函数结束。
voidSort(LinkListL)//排序功能函数。
ListNode*p,*m,*n;
inti,j,count=0;
//清屏。
无任何职工信息!
返回主菜单!
按工资从低到高排序:
***以下为排序前的所有职工记录***\n"
Allemployeeinfo(L);
//不包含头结点的职工信息结点的总个数。
for(i=0;
i<
count-1;
i++)//单链表的冒泡排序。
for(j=0;
j<
count-1-i;
j++)
n=L;
p=L->
m=p->
while(m)
if(p->
data.salary>
m->
data.salary)
n->
p->
next=m->
m->
n=m;
m=p->
else
n=p;
p=m;
m=m->
***以下为排序后的所有职工记录***\n"
Allemployeeinfo(L);
排序成功!
voidStatistics(LinkListL)//统计职工中的最高工资和最低工资。