C语言课程设计职工信息管理系统单链表实现程序源代码Word文档格式.docx
《C语言课程设计职工信息管理系统单链表实现程序源代码Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言课程设计职工信息管理系统单链表实现程序源代码Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
//将单链表l中的数据写入文件
voidprinte(Node*p);
//本函数用于打印链表中某个节点的数据内容*/
//以下4个函数用于输出中文标题
voidprintstart();
voidWrong();
voidNofind();
voidprintc();
voidmenu()
{
printf("
\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"
}//voidmenu菜单结束
voidDisp(Linkl)//显示单链表l中存储的职工记录,内容为employee结构中定义的内容
intcount=0;
Node*p;
p=l->
next;
//l存储的是单链表中头结点的指针,该头结点没有存储职工信息,指针域指向的后继结点才有职工信息
if(!
p)/*p==NULL,NUll在stdlib中定义为0*/
{
printf("
\n=====>
提示:
没有职工记录可以显示!
\n"
return;
}
\t\t\t\t显示结果\n"
printstart();
//打印横线
printc();
//打印各学科标题
while(p)//逐条输出链表中存储的职工信息
printe(p);
p=p->
}//voidDisp结束
voidprintstart()
-----------------------------------------------------------------------\n"
}
voidWrong()
输入错误!
voidNofind()
没有找到该职工!
voidprintc()/*本函数用于输出中文*/
工号\t姓名性别部门职称工资总工资平均工资\n"
voidprinte(Node*p)/*本函数用于打印链表中某个节点的数据内容*/
%-12s%s\t%s\t%d\t%d\t%d\t%d\t%d\n"
p->
data.num,p->
data.name,p->
data.sex,p->
data.bm,p->
data.zc,p->
data.gz);
//Locate(l,findmess,"
num"
/*该函数用于定位连表中符合要求的结点,并返回该指针*/
Node*Locate(Linkl,charfindmess[],charzcornum[])
Node*r;
if(strcmp(zcornum,"
)==0)/*按工号查询*/
r=l->
while(r!
=NULL)
{
if(strcmp(r->
data.num,findmess)==0)/*若找到findmess值的工号*/
returnr;
r=r->
}
elseif(strcmp(zcornum,"
zc"
)==0)/*按职称查询*/
data.zc,findmess)==0)/*若找到findmess值的职工职称*/
return0;
/*若未找到,返回一个空指针*/
//add()函数中,无节点时,r指向list头,有节点时,r指向末尾节点
voidAdd(Linkl)/*增加职工*/
Node*p,*r,*s;
/*实现添加操作的临时的结构体指针变量*/
intflag=0;
r=l;
s=l->
//链表没有节点时,s=null;
/链表有节点时,指向第一个职工节点
while(r->
next!
=NULL)//如果存在后继结点时,r指针后移一个
r=r->
/*将指针移至于链表最末尾,准备添加记录*/
while
(1)
请你输入工号(以'
0'
返回上一级菜单:
)"
scanf("
%s"
num);
if(strcmp(num,"
0"
)==0)//输入'
跳出while
(1),即跳出add()函数
break;
s=l->
//作用?
每次从第一个节点开始找,看num是否重复。
while(s)//工号重复时,返回主菜单
if(strcmp(s->
data.num,num)==0)
{
printf("
=====>
工号为'
%s'
的职工已经存在,若要修改请你选择'
4修改'
!
flag=1;
//break;
return;
}
s=s->
}//while(s)
p=(Node*)malloc(sizeof(Node));
//生成没赋值的新节点p
strcpy(p->
data.num,num);
请你输入姓名:
"
p->
data.name);
getchar();
请你输入性别:
data.sex);
请你输入职工所在部门:
%d"
&
p->
data.bm);
请你输入职工职称:
data.zc);
请你输入职工工资:
/*信息输入已经完成*/
next=NULL;
/*表明这是链表的尾部结点*/
r->
next=p;
/*将新建的结点加入链表尾部中*/
r=p;
saveflag=1;
}//while
(1)
}//voidAdd增加结束
voidDel(Linkl)/*删除*/
intsel;
Node*p,*r;
/*实现删除操作的临时的结构体指针变量*/
charfindmess[20];
l->
next)//当list无后继结点时,提示和结束返回del()
{
没有记录可以删除!
1按工号删除\n=====>
2按姓名删除\n"
scanf("
sel);
if(sel==1)//按工号删除
请你输入要删除的工号:
findmess);
p=Locate(l,findmess,"
if(p)
r=l;
while(r->
=p)
r=r->
//从第一个结点找起,直到发现r->
next=p,是待删除结点,跳出循环
r->
next=p->
//rr->
next(p)p->
next
free(p);
printf("
该职工已经成功删除!
saveflag=1;
else
Nofind();
//显示一句话
}//if(sel==1)
elseif(sel==2)//按姓名删除
请你输入要删除的姓名:
name"
}//if(sel==2)
else
Wrong();
//显示输入错误的话
}//voidDel删除结束
voidQur(Linkl)//查询功能
//实现查询操作的临时的结构体指针变量
next)
没有资料可以查询!
1按工号查找\n=====>
2按职称查找\n"
if(sel==1)/*工号*/
请你输入要查找的工号:
\t\t\t\t查找结果\n"
printstart();
printc();
printe(p);
//打印p结点各个数据成员的值
}//if(sel==1)
elseif(sel==2)/*职称*/
请你输入要查找的职称:
}//voidQur查询结束
voidModify(Linkl)//修改功能
没有资料可以修改!
请你输入要修改的职工工号:
p=Locate(l,findmess,"
if(p)
请你输入新工号(原来是%s):
data.num);
请你输入新姓名(原来是%s):
请你输入新性别(原来是%s):
请你输入新的部门(原来是%s):
请你输入新的职称(原来是%s):
请你输入新的工资(原来是%d):
资料修改成功!
//shoudsave=1;
Nofind();
//if(p)结束
}//voidModify(Linkl)//修改功能结束
//插入记录:
按工号查询到要插入的节点的位置,然后在该工号之后插入一个新节点。
voidInsert(Linkl)
Node*s,*r,*p;
/*p指向插入位置,p指新插入记录节点*/
charch,new_num[10],old_num[10];
//old_num[]保存插入点位置之前的工号,new_num[]保存输入的新记录的工号
system("
cls"
Disp(l);
while
(1)
//stringinput(s,10,"
pleaseinputinsertlocationaftertheNumber:
请你输入已存在的工号(以'
old_num);
if(strcmp(old_num,"
跳出while
(1),即跳出Insert()函数
return;
每次从第一个节点开始找
flag=0;
while(s)/*查询该工号是否存在,flag=1表示该工号存在*/
{
data.num,old_num)==0)
{
break;
}
}
if(flag==1)
/*若工号存在,则进行插入之前的新记录的输入操作*/
else
getchar();
Thenumber%sisnotexisting,tryagain?
(y/n):
scanf("
%c"
ch);
if(ch=='
y'
||ch=='
Y'
)
{continue;
}
else
{return;
}//回主菜单
}//while
(1)
/*以下新记录的插入新节点,工号不能跟已存在的工号相同,操作与Add()相同*/
请你输入待插入的工号(以'
new_num);
if(strcmp(new_num,"
while(s)//工号重复时,返回主菜单
if(strcmp(s->
data.num,new_num)==0)
的职工已经存在'
flag=1;
return;
s=s->
}//while(s)
p=(Node*)malloc(sizeof(Node));
p)
\nallocatememoryfailure"
/*如没有申请到,打印提示信息*/
return;
/*返回主界面*/
}
strcpy(p->
data.num,new_num);
getchar();
请你输入部门:
请你输入职称:
请你输入工资:
//信息输入已经完成
p->
saveflag=1;
/*在main()有对该全局变量的判断,若为1,则进行存盘操作*/
/*将指针赋值给r,因为l中的头节点的下一个节点才实际保存着学生的记录*/
r=l->
if(strcmp(r->
data.num,old_num)==0)/*在链表中插入一个节点*/
p->
next=r->
}//while
(1),r作为查询指针,依次从第一个节点找起,找到后跳出while
(1)循环
\n\n"
//getchar();
voidTongji(Linkl)//统计
Node*max,*min;
/*用于指向工资最高的节点*/
Node*t=l->
t)
system("
Notemployeerecord!
max=min=t;
while(t)
if(t->
data.gz>
=max->
data.gz)max=t;
data.gz<
=min->
data.gz)min=t;
t=t->
最高工资为:
%d\n"
max);
\t%s\t%s\t%s\t%s\t%s\t%d\n\n"
t->
data.num,t->
data.name,t->
data.sex,t->
data.bm,t->
data.zc,t->
最低工资为:
min);
voidSort(Linkl)//排序
Linkll;
Node*p,*rr,*s;
inti=0;
if(l->
next==NULL)
{system("
return;
ll=(Node*)malloc(sizeof(Node));
/*用于创建新的节点*/
ll)
ll->