C语言课程设计职工信息管理系统单链表实现程序源代码.docx

上传人:b****6 文档编号:3326209 上传时间:2022-11-21 格式:DOCX 页数:24 大小:21.82KB
下载 相关 举报
C语言课程设计职工信息管理系统单链表实现程序源代码.docx_第1页
第1页 / 共24页
C语言课程设计职工信息管理系统单链表实现程序源代码.docx_第2页
第2页 / 共24页
C语言课程设计职工信息管理系统单链表实现程序源代码.docx_第3页
第3页 / 共24页
C语言课程设计职工信息管理系统单链表实现程序源代码.docx_第4页
第4页 / 共24页
C语言课程设计职工信息管理系统单链表实现程序源代码.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

C语言课程设计职工信息管理系统单链表实现程序源代码.docx

《C语言课程设计职工信息管理系统单链表实现程序源代码.docx》由会员分享,可在线阅读,更多相关《C语言课程设计职工信息管理系统单链表实现程序源代码.docx(24页珍藏版)》请在冰豆网上搜索。

C语言课程设计职工信息管理系统单链表实现程序源代码.docx

C语言课程设计职工信息管理系统单链表实现程序源代码

//C语言课程设计职工信息管理系统—单链表实现

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1