员工管理系统.doc
#include <stdio.h>#include <string.h>#include <stdlib.h>#define ALLMAX 200 /总共统计的职工的人数typedef struct Nodelong int born_date,age,tele_num,job_num; char sex,nameALLMAX,degreeALLMAX,jobALLMAX,addressALLMAX;struct Node *next;SLNode;typedef structlong int born_date,age,tele_num,job_num;char nameALLMAX,sex,degreeALLMAX,jobALLMAX,addressALLMAX;DataType;void ListInitiate(SLNode *head)/链表初始化if(*head=(SLNode *)malloc(sizeof(SLNode)=NULL) exit(1);/动态分配存储空间(*head)->next=NULL;SLNode *ListInsert(SLNode *head,DataType x)/职工信息的插入SLNode *p,*q,*s;p=head->next;if(q=(SLNode *)malloc(sizeof(SLNode)=NULL) exit(1);/动态分配存储空间q->born_date=x.born_date; q->age=x.age;q->tele_num=x.tele_num;q->job_num=x.job_num;strcpy(q->name,x.name);q->sex=x.sex; strcpy(q->degree,x.degree);strcpy(q->job,x.job); strcpy(q->address,x.address);if(head->next=NULL)/如果只有链表的头结点,没有其他的结点,直接插入在头结点后面head->next=q;head->next->next=NULL;else/链表非空for(;p;p=p->next)if(p->next!=NULL)if(strcmp(p->name,x.name)<0&&strcmp(p->next->name,x.name)>0)/位于两个结点之间s=p->next;p->next=q;q->next=s;break;/else if(strcmp(p->name,x.name)=0)break; /如果姓名相同则不插入信息else if(strcmp(p->name,x.name)<0&&p->next=NULL)/链表非空,并且在排序中是最后一个p->next=q;q->next=NULL;break;if(strcmp(p->name,x.name)>0)/位于链表头结点之后的位置s=head->next;head->next=q;q->next=s;break;return head;void print(SLNode *head)/职工信息的显示for(SLNode *p=head->next;p;p=p->next)/输出所有职工的信息printf("%s %c %ld %ld %s %s %s %ld %ldn",p->name,p->sex,p->born_date,p->age,p->degree,p->job,p->address,p->tele_num,p->job_num);void printLink(SLNode *head)/职工信息的显示printf("职工名单:n姓名、性别、出生年月、年龄、学历、职务、住址、电话、工号n");print(head);void put(SLNode *head,FILE *fp)/职工信息的保存SLNode *p;if(fp=fopen("Employee.txt","a")=NULL)printf("无法打开'Employee.txt'!n");/exit(0);/return 0;for(p=head->next;p;p=p->next)fprintf(fp,"%s %c %ld %ld %s %s %s %ld %ldn",p->name,p->sex,p->born_date,p->age,p->degree,p->job,p->address,p->tele_num,p->job_num);if(fclose(fp)printf("无法关闭'Employee.txt'!n"); /exit(0);/return 0;void ListDelete(SLNode *head)/职工信息的删除SLNode *p,*s;char x20;int a,job_num;s=head;p=head->next;if(head->next=NULL)/链表为空,输出:名单中无职工信息,无须删除!printf("名单中无此职工信息,无须删除!n");return; printf("n");printf("t*n");printf("t* 职工信息删除操作 *n");printf("t* *n"); printf("t* 0.退出查询系统,回到主菜单tt 1.按姓名进行删除 t *nt* 2.按工号进行删除 tt *n"); printf("t*n");while(1)printf("请选择你要进行的操作:");scanf("%d",&a);if(a=0)break; else if(a=1)printf("请输入要删除职工的姓名:n"); /输入要删除的人的姓名scanf("%s",x);for(p;p;p=p->next)/在链表中从头到尾查找输入的人的姓名if(strcmp(p->name,x)=0)/如果存在,则删除,否则输出:名单中无职工信息,无须删除!s->next=p->next;free(p);printf("删除成功!请继续操作!n");printLink(head);break;s=p;if(p=NULL) printf("名单中无此职工信息,无须删除!n"); else if(a=2)printf("请输入要删除职工的工号:n"); /输入要删除的人的工号scanf("%ld",&job_num);for(p;p;p=p->next)/在链表中从头到尾查找输入的人的工号if(p->job_num=job_num)/如果存在,则删除,否则输出:名单中无职工信息,无须删除!s->next=p->next;free(p);printf("删除成功!请继续操作!n");printLink(head); s=p;if(p=NULL)printf("名单中无此职工信息,无须删除!n");void ListModify(SLNode *head)/职工信息的修改DataType x;SLNode *p;p=head->next;/*if(p=NULL)printf("职工名单无职工信息,无须修改!n");return;*/printf("请输入要修改的职工姓名:n");scanf("%s",x.name);for(;p;p=p->next)if(strcmp(x.name,p->name)=0)/查找到了该职工的信息printf("依次写入该职工的新信息:n");printf("请输入职工信息:n姓名、性别、出生年月、年龄、学历、职务、住址、电话、工号n");scanf("%s %c %ld %ld %s %s %s %ld %ld",p->name,&p->sex,&p->born_date,&p->age,p->degree,p->job,p->address,&p->tele_num,&p->job_num);printf("修改成功!请继续操作!n");break;if(p=NULL)printf("此职工不存在,无法修改其信息!n");void Listfind(SLNode head)/职工信息的查找int i,j;SLNode *p;DataType x;if(head.next=NULL)/链表为空printf("名单中无职工信息,查询失败!n");return;/返回主菜单printf("n"); printf("tn");printf("t * 职工信息查询操作 * n");printf("t * n");printf("t n");printf("t 0.结束管理系统tttt1.姓名进行查询tnt 2.出生年月查询tttt3.职工学历查询tnt 4.职工年龄查询tttt5.职工职务查询tnt 6.职工住址查询tttt7.职工电话查询tnt 8.职工工号查询tttt tn"); printf("t n");printf("tn"); while(1)printf("请输入您要选择的操作:");scanf("%d",&i);if(i=0)/输入0,退出查询系统,回到主菜单break;else if(i=1)/输入1,对姓名进行查询p=head.next;printf("请输入姓名:");scanf("%s",x.name);j=0;for(p;p;p=p->next)if(strcmp(p->name,x.name)=0)/如果存在这个人,那么j自加+j;printf("n姓名、性别、出生年月、年龄、学历、职务、住址、电话、工号n");printf("%s %c %ld %ld %s %s %s %ld %ldn",p->name,p->sex,p->born_date,p->age,p->degree,p->job,p->address,p->tele_num,p->job_num);if(j=0)/表示没有找到输入的信息printf("职工名单中不存在此人!n");else printf("查询成功!继续操作!n");else if(i=2)/输入2,对出生年月进行查询p=head.next;printf("请输入出生年月:");scanf("%ld",&x.born_date);j=0;for(p;p;p=p->next)if(p->born_date=x.born_date)/输入的出生年月在链表中存在+j;/如果存在这个人,那么j自加printf("n姓名、性别、出生年月、工作年月、学历、职务、住址、电话、工号n");printf("%s %c %ld %ld %s %s %s %ld %ldn",p->name,p->sex,p->born_date,p->age,p->degree,p->job,p->address,p->tele_num,p->job_num);if(j=0)/表示没有找到输入的信息printf("职工名单中没有这个时间出生的!n");else printf("查询成功!请继续操作!n");else if(i=4)/输入4,对职工年龄进行查询p=head.next;printf("请输入职工年龄:");scanf("%ld",&x.age);j=0;for(p;p;p=p->next)if(p->age=x.age)+j;/如果存在这个人,那么j自加printf("n姓名、性别、出生年月、年龄、学历、职务、住址、电话、工号n");printf("%s %c %ld %ld %s %s %s %ld %ldn",p->name,p->sex,p->born_date,p->age,p->degree,p->job,p->address,p->tele_num,p->job_num);if(j=0)/表示没有找到输入的信息printf("职工名单中没有这个年龄的!n");else printf("查询成功!请继续操作!n");else if(i=3)/输入3,对学历进行查询p=head.next;printf("请输入学历:");scanf("%s",x.degree);j=0;for(p;p;p=p->next)if(strcmp(p->degree,x.degree)=0)+j;/如果存在这个人,那么j自加printf("n姓名、性别、出生年月、工作年月、学历、职务、住址、电话、工号n");printf("%s %c %ld %ld %s %s %s %ld %ldn",p->name,p->sex,p->born_date,p->age,p->degree,p->job,p->address,p->tele_num,p->job_num);if(j=0)/表示没有找到输入的信息printf("职工名单中没有这种学历的!n");else printf("查询成功!请继续操作!n");else if(i=5)/输入5,对职务进行查询p=head.next;printf("请输入职务:");scanf("%s",x.job);j=0;for(p;p;p=p->next)if(strcmp(p->job,x.job)=0)+j;/如果存在这个人,那么j自加printf("n姓名、性别、出生年月、年龄、学历、职务、住址、电话、工号n");printf("%s %c %ld %ld %s %s %s %ld %ldn",p->name,p->sex,p->born_date,p->age,p->degree,p->job,p->address,p->tele_num,p->job_num);if(j=0)/表示没有找到输入的信息printf("职工名单中没有这种职务的!n");else printf("查询成功!请继续操作!n");else if(i=6)/输入6,对住址进行查询p=head.next;printf("请输入住址:");scanf("%s",x.address);j=0;for(p;p;p=p->next)if(strcmp(p->address,x.address)=0)+j;/如果存在这个人,那么j自加printf("n姓名、性别、出生年月、年龄、学历、职务、住址、电话、工号n");printf("%s %c %ld %ld %s %s %s %ld %ldn",p->name,p->sex,p->born_date,p->age,p->degree,p->job,p->address,p->tele_num,p->job_num);if(j=0)/表示没有找到输入的信息printf("职工名单中没有住这的!n");else printf("查询成功!请继续操作!n");else if(i=7)/输入7,对电话号码进行查询p=head.next;printf("请输入电话:");scanf("%ld",&x.tele_num);j=0;for(p;p;p=p->next)if(p->tele_num=x.tele_num)+j;/如果存在这个人,那么j自加printf("n姓名、性别、出生年月、年龄、学历、职务、住址、电话、工号n");printf("%s %c %ld %ld %s %s %s %ld %ldn",p->name,p->sex,p->born_date,p->age,p->degree,p->job,p->address,p->tele_num,p->job_num);if(j=0)/表示没有找到输入的信息printf("职工名单中没人用这个号码!n");else printf("查询成功!请继续操作!n");else if(i=8)/输入8,对工号进行查询p=head.next;printf("请输入工号:");scanf("%ld",&x.job_num);j=0;for(p;p;p=p->next)if(p->job_num=x.job_num)+j;/如果存在这个人,那么j自加printf("n姓名、性别、出生年月、年龄、学历、职务、住址、电话、工号n");printf("%s %c %ld %ld %s %s %s %ld %ldn",p->name,p->sex,p->born_date,p->age,p->degree,p->job,p->address,p->tele_num,p->job_num);if(j=0)/表示没有找到输入的信息printf("职工名单中没有这个工号的!n");else printf("查询成功!请继续操作!n");else if(i!=0 && i!=1 && i!=2 && i!=3 && i!=4 && i!=5 && i!=6 && i!=7 && i!=8)/输入任意不是上述数字的,那么久显示输入错误printf("输入出错!请再次输入!n");printf("n");printf("t*n");printf("t* 职工信息查询操作 *n");printf("t* *n");printf("t* 0.退出查询系统,回到主菜单tt 1.对姓名进行查询t*nt* 2.对出生年月进行查询 tt 3.对学历进行查询t*nt* 4.对职工年龄进行查询 tt 5.对职务进行查询t*nt* 6.对住址进行查询 tt 7.对电话进行查询t*nt* 8.对职工工号进行查询 tt t*n"); printf("t*n"); void Listpaixu(SLNode *head)/职工信息的排序int i,n=0,m,flag=1;SLNode *p,*q,*s;if(head->next=NULL)/职工链表为空printf("名单中无职工信息,无法排序!nn");return;/printf("输入出错!请再次输入!nn");printf("tt.n");printf("tt. 职工信息排序操作 .n");printf("tt. .n"); printf("tt.t0.退出排序系统,回到主菜单 .ntt.t1.对性别进行排序 .ntt.t2.对出生年月进行排序 .ntt.t3.对职工年龄进行排序 .ntt.t4.对工号进行排序 .n");printf("tt.n");while(1)printf("请输入您要选择的操作:");scanf("%d",&i);if(i=0)/输入0,退出排序系统,回到主菜单break;else if(i=1)/输入1,对性别进行排序n=0,m,flag=1;for(p=head;NULL!=p;p=p->next)/统计职工人数n+; for(m=1;flag&&m<=n;m+) flag=0; for(q=head->next,p=head,s=p;q;s=p,p=q,q=q->next)if(p->sex>q->sex)/p为当前节点,p的性别>p的后继节点的性别if(head=p)/p为头结点 head->next=q->next; head=q; q->next=p;/交换节点信息q=head->next;p=head;elsep->next=q->next; q->next=p; s->next=q; p=q; q=p->next; flag=1; printf("排好序的信息如下:n");printLink(head);/输出所有节点的信息/return;else if(i=2)/输入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->born_date>q->born_date)/对出生年月进行排序if(head=p) head->next=q->next; head=q; q->next=p;q=head->next;p=head;elsep->next=q->next; q->next=p; s->next=q; p=q; q=p->next; flag=1;printf("排好序的信息如下:n");printLink(head);/return;else if(i=3)/输入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->age>q->age)if(head=p) head->next=q->next; head=q; q->next=p;q=head->next;p=head;elsep->next=q->next; q->next=p; s->next=q; p=q; q=p->next; flag=1;printf("排好序的信息如下:n");printLink(head);/return;else if(i=4)/按工号排序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->job_num>q->job_num)if(head=p) head->next=q->next; head=q; q->next=p;q=head->next;p=head;elsep->next=q->next; q->next=p; s->next=q; p=q; q=p->next; flag=1;printf("排好序的信息如下:n");printLink(head);/return;else if(i!=0&&i!=1&&i!=2&&i!=3&&i!=4)printf("输入出错!请再次输入!nn");printf("tt.n");printf("tt. 职工信息排序系统 .n");printf("tt. .n"); printf("tt.t0.退出排序系统,回到主菜单 .ntt.t1.对性别进行排序 .ntt.