职工管理系统代码解释.docx
- 文档编号:8665518
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:18
- 大小:19.54KB
职工管理系统代码解释.docx
《职工管理系统代码解释.docx》由会员分享,可在线阅读,更多相关《职工管理系统代码解释.docx(18页珍藏版)》请在冰豆网上搜索。
职工管理系统代码解释
#include
#include
#include
#include
#defineALLMAX100
typedefstructNode
//定义一个结构体来表示链表的节点
{
intchusheng,gongzuo,dianhua;
charsex,name[ALLMAX],xueli[ALLMAX],zhiwu[ALLMAX],zhuzhi[ALLMAX];
structNode*next;
}SLNode;
typedefstruct{
/*定义一个结构体来表示基本员工的基本信息,和链表节点的结构体,有所不同
比链表的结构体少了一个指向Node结构体指针变量*/
intchusheng,gongzuo,dianhua;
charname[ALLMAX],sex,xueli[ALLMAX],zhiwu[ALLMAX],zhuzhi[ALLMAX];
}DataType;
voidListInitiate(SLNode**head)
{
//开辟一个SLNode大小的空间,来初始化链表头指针,并让next指向null
if((*head=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit
(1);
(*head)->next=NULL;
}
SLNode*ListInsert(SLNode*head,DataTypex)
{
//此函数功能是插入链表节点,并让节点插入合适位置
SLNode*p,*q,*s;
p=head->next;
//首先先开辟一个节点的内存空间
if((q=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit
(1);
//然后把X里的信息赋值给q链表节点
q->chusheng=x.chusheng;q->gongzuo=x.gongzuo;
q->dianhua=x.dianhua;strcpy(q->name,x.name);
q->sex=x.sex;strcpy(q->xueli,x.xueli);
strcpy(q->zhiwu,x.zhiwu);strcpy(q->zhuzhi,x.zhuzhi);
//strcpy(a1,a2)函数的功能是把a2字符的值赋值给a1
if(head->next==NULL){
//如果只有头节点,而没有其他的节点,则将q节点插入到头节点后
head->next=q;
head->next->next=NULL;
}
else{
//如果有其他节点元素
for(;p;p=p->next){
//不断向后查找,当前面节点name值小于数据X里name值并且后面的节点name值大于数据X里name值的时候插入
if(p->next!
=NULL){
if(strcmp(p->name,x.name)<0&&strcmp(p->next->name,x.name)>0){
/*strcmp(a1,a2)函数的功能是比较a1,a2字符的值,若a1=a2,则返回值为
若a1>a2,则返回一个正值,,若a1 s=p->next; p->next=q; q->next=s; break; } } elseif(strcmp(p->name,x.name)<0&&p->next==NULL){ //不断先后查找,当找到最后一个节点的时候,并且前面所有的name值都小于数据X里name值,把节点插入到链表最后 p->next=q; q->next=NULL; break; } if(strcmp(p->name,x.name)>0){ //后面所以节点name的值都比数据X里name值大,就把节点插入后指针后,即所以链表节点前 s=head->next; head->next=q; q->next=s; break; } } } // returnhead; } voidListDelete(SLNode*head) { //此函数的功能是删除链表中特定的节点,以职员name为关键字 SLNode*p,*s; charx[20]; s=head; p=head->next; if(head->next==NULL){ //当链表中无节点时,给出提示信息 printf("名单中无职工信息,无须删除! \n"); return; } printf("请输入要删除职工的姓名: \n"); //获得要删除的节点的name的值 scanf("%s",x); for(p;p;p=p->next){ //然后不断的往后找,知道节点里的name的值,等于输入的name的值的时候,就退出此for循环,,用break语句 if(strcmp(p->name,x)==0){ //找到后,要删除节点的前面节点指向要删除节点的后面节点 s->next=p->next; free(p);//然后释放要删除节点的内存空间 printf("删除成功! 请继续操作! \n"); //break,退出for循环 break; } s=p; } if(p==NULL){ //如果没有找到要删除的节点,则提示信息 printf("名单中无职工信息,无须删除! \n"); } } voidListxiugai(SLNode*head) { //此函数为修改指定的节点,以职员name为关键字, DataTypex; SLNode*p; p=head->next; if(p==NULL){ //当链表中无节点时,给出提示信息 printf("职工名单无职工信息,无须修改! \n"); return; } printf("请输入要修改的职工姓名: \n"); //获得要修改的节点的name的值 scanf("%s",x.name); printf("依次写入该职工的信息: \n"); for(;p;p=p->next) { //不断往后找,直到找到要修改的节点,让后通过scanf获得用户重新输入的各属性值,再重新赋值给要修改的节点P if(strcmp(x.name,p->name)==0){ scanf("%s%c%d%d%s%s%s%d",p->name,&p->sex,&p->chusheng,&p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,&p->dianhua); break; } } if(p==NULL) //如果没有找到要修改的节点,则提示信息 printf("此职工不存在,无法修改其信息! \n"); printf("修改成功! 请继续操作! \n"); } voidput(SLNode*head,FILE*fp) { //此函数的功能是将,链表中节点的值,打印到worker.txt文件中 SLNode*p; //打开要输入信息的文件 if((fp=fopen("worker.txt","w"))==NULL){ //如果没有打开,则提示错误信息 printf("无法打开‘worker.txt’! \n"); exit(0); } for(p=head->next;p;p=p->next) { //通过for循环,不断的将链表节点信息输入到文件中 fprintf(fp,"%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua); } //输入信息成功后,关闭打开的文件 if(fclose(fp)){ //如果关闭失败,则提示错误信息 printf("无法关闭‘worker.txt’! \n");exit(0); } } voidListfind(SLNodehead) { //此函数的功能是,寻找特定职员的信息 inti; SLNode*p; DataTypex; if(head.next==NULL){ //如果没有链表节点,则提示信息 printf("名单中无职工信息,无法查询! \n"); return; } //打印出一段字符,提示用户,输入不同的数字,来执行不同的操作 printf("0.退出查询系统,回到主菜单\n1.对姓名进行查询\n2.对出生年月进行查询\n3.对工作年月进行查询\n4.对学历进行查询\n5.对职务进行查询\n6.对住址进行查询\n7.对电话号码进行查询\n"); for(;;) { //一个空的for循环,来不断的接受用户的查询,当用户输入时,在通过break语句退出此for循环 //得到用户要操作的数字,通过这个数字的不同来执行不同的查询操作 scanf("%d",&i); if(i==0) //如果用户输入,则退出for循环,也就是退出查询 break; if(i==1){ //输入,按姓名查询 p=head.next; printf("请输入姓名: "); scanf("%s",x.name); i=0; for(p;p;p=p->next){ //通过用户输入的name值,来查询链表各节点中name的值,如相同,则打印到屏幕上 if(strcmp(p->name,x.name)==0){ ++i;//设置一个i值,来判断,有木有查询到所要查询的员工信息 printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua); } } if(i==0) //i=0,说明没有查询到要查询的员工信息,则提示信息 printf("职工名单中不存在此人! \n"); //否则说明,查询成功,即给出提示信息 elseprintf("查询成功! 请继续操作! \n"); } /*下面的程序和上面的程序一样,只是通过获得不同的i值,来通过不同的关键字来查询 ,当i=1.对姓名进行查询i=2.对出生年月进行查询i=3.对工作年月进行查询i=4.对学历进行查询i=5.对职务进行查询i=6.对住址进行查询 i=7.对电话号码进行查询,,,所以,下面的程序就不解释啦*/ if(i==2){ p=head.next; printf("请输入出生年月: "); scanf("%d",&x.chusheng); i=0; for(p;p;p=p->next){ if(p->chusheng==x.chusheng){ ++i; printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua); } } if(i==0) printf("职工名单中没有这个时间出生的! \n"); elseprintf("查询成功! 请继续操作! \n"); } if(i==3){ p=head.next; printf("请输入工作年月: "); scanf("%d",&x.gongzuo); i=0; for(p;p;p=p->next){ if(p->gongzuo==x.gongzuo){ ++i; printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua); } } if(i==0) printf("职工名单中没有这个时间工作的! \n"); elseprintf("查询成功! 请继续操作! \n"); } if(i==4){ p=head.next; printf("请输入学历: "); scanf("%s",x.xueli); i=0; for(p;p;p=p->next){ if(strcmp(p->xueli,x.xueli)==0){ ++i; printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua); } } if(i==0) printf("职工名单中没有这种学历的! \n"); elseprintf("查询成功! 请继续操作! \n"); } if(i==5){ p=head.next; printf("请输入职务: "); scanf("%s",x.zhiwu); i=0; for(p;p;p=p->next){ if(strcmp(p->zhiwu,x.zhiwu)==0){ ++i; printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua); } } if(i==0) printf("职工名单中没有这种职务的! \n"); elseprintf("查询成功! 请继续操作! \n"); } if(i==6){ p=head.next; printf("请输入住址: "); scanf("%s",x.zhuzhi); i=0; for(p;p;p=p->next){ if(strcmp(p->zhuzhi,x.zhuzhi)==0){ ++i; printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua); } } if(i==0) printf("职工名单中没有住这的! \n"); elseprintf("查询成功! 请继续操作! \n"); } if(i==7){ p=head.next; printf("请输入电话: "); scanf("%d",&x.dianhua); i=0; for(p;p;p=p->next){ if(p->dianhua==x.dianhua){ ++i; printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua); } } if(i==0) printf("职工名单中没人用这个号码! \n"); elseprintf("查询成功! 请继续操作! \n"); } //如果用户输入i的值,不是我们提示的值,则给出用户错误信息,并让用户重新输入 if(i! =0&&i! =1&&i! =2&&i! =3&&i! =4&&i! =5&&i! =6&&i! =7) printf("输入出错! 请再次输入! \n"); } } voidprint(SLNode*head) { //此函数,是打印出链表中的所有员工的信息 for(SLNode*p=head->next;p;p=p->next) printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua); } voidListpaixu(SLNode*head) { //此函数,是对职员信息来排序,, inti,n=0,m,flag=1; SLNode*p,*q,*s; if(head->next==NULL){ printf("名单中无职工信息,无法排序! \n"); return; } printf("0.退出排序系统,回到主菜单\n1.对性别进行排序\n2.对出生年月进行排序\n3.对工作年月进行排序\n"); for(;;) { scanf("%d",&i); if(i==0) break; //通过用户输入值的不同,来对节点不同的信息进行排序 if(i==1){ n=0,m,flag=1; for(p=head;NULL! =p;p=p->next) //或的链表节点的数目 n++; for(m=1;flag&&m<=n;n++) { flag=0; for(q=head->next,p=head,s=p;q;s=p,p=q,q=q->next) { //采用冒泡排序法来对链表进行排序 if(p->sex>q->sex) { //如果前面节点sex大于后面的sex,则交换二节点的位置 if(head==p) { //判断p是否为头指针,来进行不同的操作 head->next=q->next; head=q; q->next=p; q=head->next; p=head; } else { p->next=q->next; q->next=p; s->next=q; p=q; q=p->next; } flag=1; } } } printf("排好序的信息如下: \n"); //排序成功后,打印出排序好的职员信息,通过调用print()函数来实现 print(head); } /*下面的程序和上面的程序一样,只是通过获得不同的i值,来通过不同的关键字来排序,所以,下面的程序就不解释啦*/ if(i==2){ n=0,m,flag=1; for(p=head;NULL! =p;p=p->next) n++; for(m=1;flag&&m<=n;n++) { flag=0; for(q=head->next,p=head,s=p;q;s=p,p=q,q=q->next) { if(p->chusheng>q->chusheng) { if(head==p) { head->next=q->next; head=q; q->next=p; q=head->next; p=head; } else { p->next=q->next; q->next=p; s->next=q; p=q; q=p->next; } flag=1; } } } printf("排好序的信息如下: \n"); print(head); } if(i==3){ n=0,m,flag=1; for(p=head;NULL! =p;p=p->next) n++; for(m=1;flag&&m<=n;n++) { flag=0; for(q=head->next,p=head,s=p;q;s=p,p=q,q=q->next){ if(p->gongzuo>q->gongzuo){ if(head==p){ head->next=q->next; head=q; q->next=p; q=head->next; p=head; } else{ p->next=q->next; q->next=p; s->next=q; p=q; q=p->next; } flag=1; } } } printf("排好序的信息如下: \n"); print(head); } if(i! =0&&i! =1&&i! =2&&i! =3) printf("输入出错! 请再次输入! \n"); } } voidmain() { //main函数,程序执行的入口 DataTypex;//定义一个DataType结构体 SLNode*head;//定义一个链表的头节点 inti,n; FILE*fp;//定义一个文件指针 ListInitiate(&head);//初始化链表 printf("请输入职工人数n: ");//提示用户输入员工的人数,来控制总的员工信息 scanf("%d",&n);//获得用户输入的员工的数目值 printf("请输入职工信息: 姓名、性别、出生年月、工作年月、学历、职务、住址、电话\n"); //提示,用户输入那些员工信息 for(i=0;i { //不断获得n个员工的信息 scanf("%s%c%d%d%s%s%s%d",x.name,&x.sex,&x.chusheng,&x.gongzuo,x.xueli,x.zhiwu,x.zhuzhi,&x.dianhua); //并将这些员工信息插入到所建的链表中 head=ListInsert(head,x); } //打开要存放数据的文件 if((fp=fopen("worker.txt","w"))==NULL){ printf("无法打开‘worker.txt’! \n"); exit(0); } //把链表中用户输入的信息,放入worker.txt文件中 put(head,fp); if(fclose(fp)){ printf("无法关闭‘worker.txt’! \n");exit(0); } //打印出本系统的功能,即通过用户输入的不同的值来执行不同的操作 printf("0.结束系统\n1.新增一名职工\n2.删除一名职工\n3.查询职工信息\n4.修改职工信息\n5.对职工信息进行排序\n"); for(;;) { scanf("%d",&i); if(i==0) break; if(i==1){ //增加员工信息 printf("请输入职工信息: 姓名
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 职工 管理 系统 代码 解释