数据结构课程设计职工信息管理系统单链表实现程序源代码.docx
《数据结构课程设计职工信息管理系统单链表实现程序源代码.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计职工信息管理系统单链表实现程序源代码.docx(29页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计职工信息管理系统单链表实现程序源代码.docx](https://file1.bdocx.com/fileroot1/2023-3/1/e5e810df-4c51-433e-9c89-4c14ca8d98d6/e5e810df-4c51-433e-9c89-4c14ca8d98d61.gif)
数据结构课程设计职工信息管理系统单链表实现程序源代码
//要求用C语言完成课程设计职工信息管理系统—单链表实现
#include
#include
#include
intsaveflag=0;/*是否需要存盘的标志变量*/
structemployee
{
charname[15];
charnum[10];/*工号*/
charsex[4];
charbm[15];
charzc[20];
intgz;
};
typedefstructnode
{
structemployeedata;
structnode*next;
}Node,*Link;
//Linkl(注意是:
字母l不是数字1)
voidadd(Linkl);
voiddisp(Linkl);//查看职工所有信息
voiddel(Linkl);//删除功能
Node*Locate(Linkl,charfindmess[],charnameornum[]);
voidQur(Linkl);//查询功能
voidTongji(Linkl);//统计
voidSort(Linkl);//排序
voidModify(Linkl);//修改功能
voidsave(Linkl);//将单链表l中的数据写入文件
voidprinte(Node*p);//本函数用于打印链表中某个节点的数据内容*/
//以下4个函数用于输出中文标题
voidprintstart();
voidWrong();
voidNofind();
voidprintc();
voidmenu()
{
printf("\t*****************************************************************\n");
printf("\t**\n");
printf("\t*职工信息管理系统_结构体数组实现*\n");
printf("\t**\n")
printf("\t*[1]增加职工信息[2]删除职工信息*\n");
printf("\t*[3]查询职工信息[4]修改职工信息*\n");
printf("\t*[5]插入职工记录[6]统计职工记录*\n");
printf("\t*[7]排序[8]保存职工信息*\n");
printf("\t*[9]显示数据[0]退出系统*\n");
printf("\t**\n");
printf("\t*****************************************************************\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;
}
printf("\t\t\t\t显示结果\n");
printstart();//打印横线
printc();//打印各学科标题
printf("\n");
while(p)//逐条输出链表中存储的职工信息
{
printe(p);
p=p->next;
}
printstart();
printf("\n");
}//voidDisp结束
voidprintstart()
{
printf("-----------------------------------------------------------------------\n");
}
voidWrong()
{
printf("\n=====>提示:
输入错误!
\n");
}
voidNofind()
{
printf("\n=====>提示:
没有找到该职工!
\n");
}
voidprintc()/*本函数用于输出中文*/
{
printf("工号\t姓名性别部门职称工资总工资平均工资\n");
}
voidprinte(Node*p)/*本函数用于打印链表中某个节点的数据内容*/
{
printf("%-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,"num")==0)/*按工号查询*/
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.num,findmess)==0)/*若找到findmess值的工号*/
returnr;
r=r->next;
}
}
elseif(strcmp(zcornum,"zc")==0)/*按职称查询*/
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.zc,findmess)==0)/*若找到findmess值的职工职称*/
returnr;
r=r->next;
}
}
return0;/*若未找到,返回一个空指针*/
}
//add()函数中,无节点时,r指向list头,有节点时,r指向末尾节点
voidAdd(Linkl)/*增加职工*/
{
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',跳出while
(1),即跳出add()函数
break;
s=l->next;//作用?
每次从第一个节点开始找,看num是否重复。
while(s)//工号重复时,返回主菜单
{
if(strcmp(s->data.num,num)==0)
{
printf("=====>提示:
工号为'%s'的职工已经存在,若要修改请你选择'4修改'!
\n",num);
flag=1;
//break;
return;
}
s=s->next;
}//while(s)
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.bm);
getchar();
printf("请你输入职工职称:
");
scanf("%d",&p->data.zc);
getchar();
printf("请你输入职工工资:
");
scanf("%d",&p->data.gz);
getchar();
/*信息输入已经完成*/
p->next=NULL;/*表明这是链表的尾部结点*/
r->next=p;/*将新建的结点加入链表尾部中*/
r=p;
saveflag=1;
}//while
(1)
}//voidAdd增加结束
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,是待删除结点,跳出循环
r->next=p->next;//rr->next(p)p->next
free(p);
printf("\n=====>提示:
该职工已经成功删除!
\n");
saveflag=1;
}
else
Nofind();//显示一句话
}//if(sel==1)
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;//rr->next(p)p->next
free(p);
printf("\n=====>提示:
该职工已经成功删除!
\n");
saveflag=1;
}
else
Nofind();
}//if(sel==2)
else
Wrong();//显示输入错误的话
}//voidDel删除结束
voidQur(Linkl)//查询功能
{
intsel;
charfindmess[20];
Node*p;//实现查询操作的临时的结构体指针变量
if(!
l->next)
{
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)
{
printf("\t\t\t\t查找结果\n");
printstart();//打印横线
printc();//打印各学科标题
printe(p);//打印p结点各个数据成员的值
printstart();//打印横线
}
else
Nofind();
}//if(sel==1)
elseif(sel==2)/*职称*/
{
printf("请你输入要查找的职称:
");
scanf("%s",findmess);
p=Locate(l,findmess,"zc");
if(p)
{
printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
else
Wrong();
}//voidQur查询结束
voidModify(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);
getchar();
printf("请你输入新性别(原来是%s):
",p->data.sex);
scanf("%s",p->data.sex);
getchar();
printf("请你输入新的部门(原来是%s):
",p->data.bm);
scanf("%d",&p->data.bm);
printf("请你输入新的职称(原来是%s):
",p->data.zc);
scanf("%d",&p->data.zc);
getchar();
printf("请你输入新的工资(原来是%d):
",p->data.gz);
scanf("%d",&p->data.gz);
printf("\n=====>提示:
资料修改成功!
\n");
//shoudsave=1;
}
else
Nofind();//if(p)结束
}//voidModify(Linkl)//修改功能结束
//插入记录:
按工号查询到要插入的节点的位置,然后在该工号之后插入一个新节点。
voidInsert(Linkl)
{
Node*s,*r,*p;/*p指向插入位置,p指新插入记录节点*/
charch,new_num[10],old_num[10];
//old_num[]保存插入点位置之前的工号,new_num[]保存输入的新记录的工号
intflag=0;
s=l->next;
system("cls");
Disp(l);
while
(1)
{
//stringinput(s,10,"pleaseinputinsertlocationaftertheNumber:
");
printf("请你输入已存在的工号(以'0'返回上一级菜单:
)");
scanf("%s",old_num);
if(strcmp(old_num,"0")==0)//输入'0',跳出while
(1),即跳出Insert()函数
return;
s=l->next;//作用?
每次从第一个节点开始找
flag=0;
while(s)/*查询该工号是否存在,flag=1表示该工号存在*/
{
if(strcmp(s->data.num,old_num)==0)
{
flag=1;
break;
}
s=s->next;
}
if(flag==1)
break;/*若工号存在,则进行插入之前的新记录的输入操作*/
else
{
getchar();
printf("\n=====>Thenumber%sisnotexisting,tryagain?
(y/n):
",old_num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{continue;}
else
{return;}//回主菜单
}
}//while
(1)
/*以下新记录的插入新节点,工号不能跟已存在的工号相同,操作与Add()相同*/
printf("请你输入待插入的工号(以'0'返回上一级菜单:
)");
scanf("%s",new_num);
if(strcmp(new_num,"0")==0)//输入'0',跳出while
(1),即跳出add()函数
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;
}//while(s)
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.bm);
getchar();
printf("请你输入职称:
");
scanf("%d",&p->data.zc);
getchar();
printf("请你输入工资:
");
scanf("%d",&p->data.gz);
getchar();
//信息输入已经完成
p->next=NULL;/*表明这是链表的尾部结点*/
saveflag=1;/*在main()有对该全局变量的判断,若为1,则进行存盘操作*/
/*将指针赋值给r,因为l中的头节点的下一个节点才实际保存着学生的记录*/
r=l->next;
while
(1)
{
if(strcmp(r->data.num,old_num)==0)/*在链表中插入一个节点*/
{
p->next=r->next;
r->next=p;
break;
}
r=r->next;
}//while
(1),r作为查询指针,依次从第一个节点找起,找到后跳出while
(1)循环
Disp(l);
printf("\n\n");
//getchar();
}
voidTongji(Linkl)//统计
{
Node*max,*min;/*用于指向工资最高的节点*/
Node*t=l->next;
if(!
t)
{
system("cls");
printf("\n=====>Notemployeerecord!
\n");
getchar();
return;
}
system("cls");
Disp(l);
max=min=t;
while(t)
{
if(t->data.gz>=max->data.gz)max=t;
if(t->data.gz<=min->data.gz)min=t;
t=t->next;
printf("最高工资为:
%d\n",max);
printf("\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->data.gz);
printf("最低工资为:
%d\n",min);
printf("\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->data.gz);
}
}
voidSort(Linkl)//排序
{
Linkll;
Node*p,*rr,*s;
inti=0;
if(l->next==NULL)
{system("cls");
printf("\n=====>Notemployeerecord!
\n");
getchar();
return