题目:使用链表、文件(合理使用链表,如在插入、删除时使用合理,其它场合未必合理)。(2)职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不相同)。试设计一职工信息管理系统,使之能够提供下列功能:①系统以菜单方式工作②职工信息录入功能(职工信息用文件保存)。③职工信息浏览功能。④职工信息查询功能,查询方式有两种:按学历查询;按职工号查询。⑤职工信息删除、插入、修改功能。⑥基于各种基本数据的统计计算。例如,统计职工总人数、本科以上学历人数等。(代码在下面,调用menu函数后输入了数据,但是在选择下面功能执行的时候总是无法执行,求帮助)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZEWO sizeof(struct Worker)
#define SIZEJD sizeof(struct Jd)
void creatFile(char *FName);/*创建文件*/
struct Jd*CreatL(char *FName);/*创建链表*/
void WriteToFile(struct Jd*head,char*FName);
void menu();/*菜单*/
void Entry(struct Jd*L);/*录入职工信息*/
void Liulan(struct Jd*L);/*浏览职工信息*/
void Search1(struct Jd*L);/*按照学历查找*/
void Search2(struct Jd*L);/*按照职工号查找*/
void Delete(struct Jd*L);/*删除职工信息*/
void Add(struct Jd*L);/*添加职工信息*/
void Revise(struct Jd*L);/*修改职工信息*/
void WriteToFile(struct Jd *L,char *FName);/*将链表节点数据写往文件*/
void Zong(struct Jd*L);/*计算职工总人数*/
void Ben(struct Jd*L);/*计算本科以上学历的总人数*/
struct Worker
{
int number;
char name[20];
char sex[20];
int age;
char xueli[20];
float gongzi;
char zhuzhi[20];
char phone[20];
};
struct Jd
{
struct Worker yuan;
struct Jd *next;
};
int main()
{
while(1)
{
menu();
}
return 0;
}
void creatFile(char *FName)
{
int i=1;
struct Worker zhi;
FILE *fp;
if((fp=fopen(FName,"wb"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
while(i!=0)
{
printf("enter data of worker:\n");
printf("职工号:");
scanf("%d",&zhi.number);
printf("姓名:");
scanf("%s",zhi.name);
printf("性别:");
scanf("%s",zhi.sex);
printf("年龄:");
scanf("%d",&zhi.age);
printf("学历:");
scanf("%s",zhi.xueli);
printf("工资:");
scanf("%f",&zhi.gongzi);
printf("住址:");
scanf("%s",zhi.zhuzhi);
printf("电话号码:");
scanf("%s",zhi.phone);
if(fwrite(&zhi,SIZEWO,1,fp)!=1)
printf("file write error\n");
printf("还需要输入新的职工数据");
scanf("%d",&i);
}
fclose(fp);
}
struct Jd*CreatL(char *FName)
{
FILE *fp;
struct Jd *p1,*p2,*head=NULL;
struct Worker zhi;
if((fp=fopen(FName,"rb"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
while(fread(&zhi,SIZEWO,1,fp)==1)
{
p1=(struct Jd*)malloc(SIZEJD);
p1->yuan=zhi;
p1->next=NULL;
if(head==NULL)
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
}
fclose(fp);
return (head);
}
void WriteToFile(struct Jd*L,char *FName)
{
FILE *fp;
struct Jd *p1;
if((fp=fopen(FName,"wb"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
p1=L;
while(p1!=NULL)
{
fwrite(&(p1->yuan),SIZEWO,1,fp);
p1=p1->next;
}
fclose(fp);
}
void menu()
{
int i;
printf("欢迎使用职工管理系统\n");
printf("1.职工信息录入\n");
printf("2.职工信息浏览\n");
printf("3.职工信息查询(按学历)\n");
printf("4.职工信息查询(按职工号)\n");
printf("5.职工信息删除\n");
printf("6.职工信息插入\n");
printf("7.职工信息修改\n");
printf("8.统计职工总人数\n");
printf("9.统计本科以上学历人数\n");
printf("请输入您想要选择的功能编号:");
scanf("%d",&i);
struct Jd*L=NULL;
char FileName[128]={'\0'};
strcpy(FileName,"worker.txt");
switch (i)
{
case 1:
{
creatFile(FileName);
L=CreatL(FileName);
}
break;
case 2:
Liulan(L);
break;
case 3:
Search1(L);
break;
case 4:
Search2(L);
break;
case 5:
Delete(L);
break;
case 6:
Add(L);
break;
case 7:
Revise(L);
break;
case 8:
Zong(L);
break;
case 9:
Ben(L);
break;
default:
printf("请输入正确的数字才能使用菜单!");
break;
}
}
void Liulan(struct Jd*L)
{
struct Jd*p1;
p1=L;
while(p1!=NULL)
{
printf("%d %s %s %d %s %.2f %s %s\n",p1->yuan.number,p1->yuan.name,p1->yuan.sex,p1->yuan.age,p1->yuan.xueli,p1->yuan.gongzi,p1->yuan.zhuzhi,p1->yuan.phone);
p1=p1->next;
}
}
void Search1(struct Jd*L)
{
char xue[20];
printf("请输入您要查询的学历:");
scanf("%s",xue);
struct Jd*p1;
p1=L;
while(p1!=NULL)
{
if(strcmp(p1->yuan.xueli,xue)==0)
printf("%d %s %s %d %s %.2f %s %s\n",p1->yuan.number,p1->yuan.name,p1->yuan.sex,p1->yuan.age,p1->yuan.xueli,p1->yuan.gongzi,p1->yuan.zhuzhi,p1->yuan.phone);
p1=p1->next;
}
}
void Search2(struct Jd *L)
{
int num;
printf("请输入您要查询的职工号:");
scanf("%d",&num);
struct Jd* p1;
p1=L;
while(p1!=NULL)
{
if(p1->yuan.number==num)
{
printf("%d %s %s %d %s %.2f %s %s\n",p1->yuan.number,p1->yuan.name,p1->yuan.sex,p1->yuan.age,p1->yuan.xueli,p1->yuan.gongzi,p1->yuan.zhuzhi,p1->yuan.phone);
break;
}
p1=p1->next;
}
}
void Delete(struct Jd*L)
{
int num,flag=0;
printf("请输入您要删除的职工号:");
scanf("%d",&num);
struct Jd* p1,*p2;
p1=L;
p2=L;
while(p1!=NULL)
{
if(p1->yuan.number==num)
{
flag=1;
if(p1==L)
{
L=L->next;
free(p1);
p1=L;/*L发生了改变,因此一定要给p1,p2重新赋值*/
p2=L;
}
else
{
p2->next=p1->next;
free(p1);
p1=p2;/*p1被释放了,后续应该从p2所在的节点开始检测*/
}
}
else
{
p2=p1;
p1=p1->next;
}
}
if(flag==0)
printf("没有您要删除的职工号,请确认后再进行操作!\n");
else
{
printf("删除成功!\n");
WriteToFile(L,"worker.txt");
}
}
void Revise(struct Jd*L)
{
int num,flag=0;
printf("请输入您要修改信息的职工的职工号:");
scanf("%d",&num);
struct Jd *p1;
p1=L;
while(p1!=NULL)
{
if(p1->yuan.number==num)
{
flag=1;
printf("请输入您要修改的内容:\n");
scanf("%d %s %s %d %s %f %s %s",&p1->yuan.number,p1->yuan.name,p1->yuan.sex,&p1->yuan.age,p1->yuan.xueli,&p1->yuan.gongzi,p1->yuan.zhuzhi,p1->yuan.phone);
}
p1=p1->next;
}
if(flag==0)
printf("没有您要删除的职工号,请确认后再进行操作!\n");
else
{
printf("删除成功!\n");
WriteToFile(L,"worker.txt");
}
}
void Revise(struct Jd*L)
{
int num,flag=0;
printf("请输入您要修改信息的职工的职工号:");
scanf("%d",&num);
struct Jd *p1;
p1=L;
while(p1!=NULL)
{
if(p1->yuan.number==num)
{
flag=1;
printf("请输入您要修改的内容:\n");
scanf("%d %s %s %d %s %f %s %s",&p1->yuan.number,p1->yuan.name,p1->yuan.sex,&p1->yuan.age,p1->yuan.xueli,&p1->yuan.gongzi,p1->yuan.zhuzhi,p1->yuan.phone);
}
p1=p1->next;
}
if(flag==0)
printf("未能找到您要修改的职工的职工号,请检查后再输入!\n");
else
{
printf("修改成功!\n");
WriteToFile(L,"worker.txt");
}
}
void Add(struct Jd*L)
{
printf("请输入要插入的职工的各项信息:");
struct Jd *p1,*p2,*p;
p1=L;
p2=L;
p=(struct Jd*)malloc(SIZEJD);
p->next=NULL;
scanf("%d %s %s %d %s %f %s %s",&p->yuan.number,p->yuan.name,p->yuan.sex,&p->yuan.age,p->yuan.xueli,&p->yuan.gongzi,p->yuan.zhuzhi,p->yuan.phone);
while(p1!=NULL)
{
p2=p1;
p1=p1->next;
}
p2->next=p;
p1=L;
while(p1!=NULL)
{
printf("%d %s %s %d %s %.2f %s %s\n",p1->yuan.number,p1->yuan.name,p1->yuan.sex,p1->yuan.age,p1->yuan.xueli,p1->yuan.gongzi,p1->yuan.zhuzhi,p1->yuan.phone);
p1=p1->next;
}
printf("添加成功!\n");
WriteToFile(L,"worker.txt");
}
void Zong(struct Jd*L)
{
struct Jd*p1;
p1=L;
int count=0;
while(p1!=NULL)
{
count++;
p1=p1->next;
}
printf("职工的总人数为:%d\n",count);
}
void Ben(struct Jd*L)
{
struct Jd*p1;
p1=L;
int count=0;
while(p1!=NULL)
{
if(strcmp(p1->yuan.xueli,"硕士")==0||strcmp(p1->yuan.xueli,"博士")==0||strcmp(p1->yuan.xueli,"博士后")==0)
count++;
p1=p1->next;
}
printf("本科以上学历的人数为:%d\n",count);
}