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