程序主体使用链表来写.
目录
1.程序主要功能
程序一共有八个功能
void baocun(wo *head);//保存
void luru(wo *head);//录入
void liulan(wo *head);//浏览
void chaxun(wo *head);//查询
void shanchu(wo *head);//删除
void xiugai(wo *head);//修改
void paixu(wo *head);//排序
void tianjia(wo *head);//添加
2.定义work结构体
typedef struct work
{
int Number; //工号
char Name[20];//姓名
char sex[10];//性别
int birthday;//年龄
char education[20];//学历
char post[20];//职务
float wages;//工资
char add[100];//住址
char Tel[100]; //电话
struct work *next;
} wo;
3.八个功能详细代码
(1)录入职员信息
void luru(wo *head) {
system("cls"); //清屏!
wo *p=head;
wo *q; //设置p和p2为头指针
int a;
printf("请输入你想新增几个职员信息:");
scanf("%d",&a); //新增成员的数量
int c=0;
for(int n=0; n<a; n++)
{
wo *p1=(wo*)malloc(sizeof(wo));
c++;
printf("请输入第%d个职员的信息\n",c);
printf("请输入职工号: ");
scanf("%d",&p1->Number);
while(p1->Number<1)
{
printf("输入的职工号不符合规定,请重新输入!!\n");
printf("请重新输入职工号: ");
scanf("%d",&p1->Number);
}
q=head;
while(q->next !=NULL) {
q=q->next ;
while(p1->Number==q->Number)
{
printf("该职工号已存在,请重新输入!\n");
scanf("%d",&p1->Number);
}
}
printf("请输入姓名: ");
scanf("%s",&p1->Name);
printf("请输入性别(W/M): ");
scanf("%s",&p1->sex);
while(strcmp(p1->sex,"W")!=0&&strcmp(p1->sex,"M")!=0)
{
printf("输入的职工性别不符合规定,请重新输入!!\n");
printf("请重新输入职工性别: ");
scanf("%s",&p1->sex);
}
printf("请输入年龄:(18-60)");
scanf("%d",&p1->birthday);
while(p1->birthday<18||p1->birthday>60)
{
//年龄为18-61岁之间
printf("输入的职工年龄不符合规定,请重新输入!!\n");
printf("请重新输入职工年龄: ");
scanf("%d",&p1->birthday);
}
printf("请输入学历: ");
scanf("%s",&p1->education);
printf("请输入职务: ");
scanf("%s",&p1->post);
printf("请输入工资: ");
scanf("%f",&p1->wages);
while(p1->wages<0) {
printf("输入的工资不符合规定,请重新输入!!\n");
printf("请重新输入职工工资: ");
scanf("%f",&p1->wages);
}
printf("请输入住址: ");
scanf("%s",&p1->add);
printf("请输入电话:");
scanf("%s",&p1->Tel) ;
int len=strlen(p1->Tel);
while(len!=11) { //十一位电话号码
printf("电话格式不正确,请重新输入!!\n");
printf("请输入电话:");
scanf("%s",&p1->Tel) ;
len=strlen(p1->Tel);
}
q=head;
while(q->next !=NULL) {
q=q->next ;
while(strcmp(p1->Tel ,q->Tel)==0)
{
printf("该电话已存在,请重新输入!\n");
scanf("%s",&p1->Tel);
}
}
p->next=p1;
p=p->next;
p->next=NULL;
printf("添加成功!!\n");
}
p->next=NULL; //p的next指向空,结束
printf("\n创建完毕!\n");
getchar();
getchar();
system("cls");
return; //返回主函数!
}
(2)浏览职工信息
浏览的是保存到文件里的信息
void liulan(wo *head) {
system("cls");
wo *p=(wo *)malloc(sizeof(wo));
wo *p1=(wo *)malloc(sizeof(wo));
p=head;
p1=p->next;
printf("职员信息总览:\n");
FILE *fp;
fp=fopen("D:\\职工管理系统.txt","r");//文件名
if(fp==NULL) {
printf("文件不能打开!\n");
}
p=head;
p1=(work*)malloc(sizeof(work));
p->next=p1;
p=p1;
while(1) { //表示无限循环
fscanf(fp,"职工号:%d 姓名:%s 性别:%s 年龄:%d 学历:%s 职务:%s 薪水:%f 地址:%s 电话:%s\n",&p->Number,&p->Name,&p->sex,&p->birthday,&p->education,&p->post,&p->wages,&p->add,&p->Tel);
printf("职工号: %d ",p1->Number);
printf("姓名: %s ",p1->Name);
printf("性别: %s ",p1->sex);
printf("年龄: %d ",p1->birthday);
printf("学历: %s ",p1->education);
printf("职务: %s ",p1->post);
printf("薪水: %f ",p1->wages);
printf("地址: %s ",p1->add);
printf("电话: %s\n",p1->Tel);
if(feof(fp)) { //文件结束返回非0,否则返回0
p->next=NULL;
break;
}
p1=(work*)malloc(sizeof(work));
p->next=p1;
p=p1;
}
fclose(fp);
}
(3)按职工工资高低排序
排序结果自动保存到文件中
排序利用冒泡排序
void paixu(wo *head) {
wo *p,*p1,*q;
p=head;
p1=head->next;
system("cls");
while(p->next!=NULL) {
while(p1->next!=NULL) {
if(p->next->wages<p1->next->wages) {
q=p->next;
p->next=p1->next;
p1->next=p1->next->next;
p->next->next=q;
} else {
p1=p1->next;
}
}
p=p->next;
p1=p->next;
}
p=head->next;
printf("按职员工资从高到低排序如下:\n");
while(p) { //直到p为空循环结束
printf("职工号:%d \n",p->Number);
printf("姓名: %s",p->Name);
printf("性别: %s",p->sex);
printf("年龄: %d",p->birthday);
printf("学历: %s",p->education);
printf("职务: %s",p->post);
printf("薪水: %f",p->wages);
printf("地址: %s",p->add);
printf("电话: %s\n",p->Tel);
p=p->next;
}
FILE *fp; //定义指针变量fp
fp=fopen("D:\\职工工资排序.txt","w"); //文件名
p=head;
p=p->next;
while(p!=NULL) {
fprintf(fp,"职工号:%d 姓名:%s 性别:%s 年龄:%d 学历:%s 职务:%s 薪水:%f 地址:%s 电话:%s\n",p->Number,p->Name,p->sex,p->birthday,p->education,p->post,p->wages,p->add,p->Tel);
p=p->next;
}
fclose(fp);
printf("保存成功!\n");
}
(4)查询职工信息
查询有三种方式进行查询
1.按姓名
2.按职工号
3.按性别(输出W或M的全体职工)
void chaxun(wo *head) {
wo *p=head;
char n[20],s[20];
int i,j;
system("cls");
printf("1.按姓名查询\n2.按职员号查询\n3.按性别查询\n请输入想要查询的方式:");
scanf("%d",&i);
switch(i) { //选择查询方式
case 1:
printf("请输入查询职员的姓名\n");
scanf("%s",&n);
while(p->next!=NULL) {
if(strcmp(p->next->Name,n)==0) { //比较是否存在链表中的name和输入的n是否相同,相同输出
printf("职工号:%d ",p->next->Number);
printf("姓名: %s",p->next->Name);
printf("性别:%s",p->next->sex);
printf("年龄:%d",p->next->birthday);
printf("学历:%s",p->next->education);
printf("职务:%s",p->next->post);
printf("薪水:%f",p->next->wages);
printf("地址:%s",p->next->add);
printf("电话:%s\n",p->next->Tel);
return;
}
p=p->next;
if(p->next==NULL) { //循环,如果p的next最后也未找到输入的数据,输入结果
printf("输入的职工不存在!\n");
return;
}
}
break;
case 2:
printf("请输入想要查询的职工号:");
scanf("%d",&j);
while(p->next!=NULL) {
if(p->next->Number==j) {
printf("职工号:%d ",p->next->Number);
printf("姓名: %s",p->next->Name);
printf("性别:%s",p->next->sex);
printf("年龄:%d",p->next->birthday);
printf("学历:%s",p->next->education);
printf("职务:%s",p->next->post);
printf("薪水:%f",p->next->wages);
printf("地址:%s",p->next->add);
printf("电话:%s\n",p->next->Tel);
return;
}
p=p->next;
if(p->next==NULL) {
printf("输入的职工不存在!\n");
return;
}
}
break;
case 3:
printf("请输入职员性别:");
scanf("%s",s);
while(p->next!=NULL) {
if(strcmp(p->next->sex,s)==0) {
printf("职工号:%d ",p->next->Number);
printf("姓名: %s",p->next->Name);
printf("性别:%s",p->next->sex);
printf("年龄:%d",p->next->birthday);
printf("学历:%s",p->next->education);
printf("职务:%s",p->next->post);
printf("薪水:%f",p->next->wages);
printf("地址:%s",p->next->add);
printf("电话:%s\n",p->next->Tel);
}
p=p->next;
continue;
if(p->next==NULL) {
printf("输入的职工不存在!\n");
return;
}
}
break;
}
}
(5)删除职工信息
通过职工的姓名删除
void shanchu(wo *head) {
system("cls");
wo *p1,*p2;
p1=head;
p2=p1->next;
char name[100];
printf("请输入想要删除的职员姓名:");
scanf("%s",&name);
while(p2!=NULL) {
while(strcmp(name,p2->Name)==0) {
p1->next=p2->next;
free(p2); //p2节点释放
printf("删除成功!");
}
p1=p2;
p2=p2->next;
return;
}
if(p2==NULL) {
printf("未存入该职员的信息,请重新输入!");
}
}
(6)修改职工信息
四种修改(均使用唯一标识的信息)
1.根据原职工号修改新的职工号
2.根据职工号修改姓名
3.根据职工号修改性别
4.全部修改
void xiugai(wo *head) {
system("cls");
liulan(head); //调用浏览函数,先输出所有信息
wo *p1,*p2,*q;
char na[10];
int n,i=0,j,k,xh,t;
p1=p2=head->next;
printf("1.修改职工号\n2.修改姓名\n3.修改性别\n4.全部修改\n请输入修改方式:");
scanf("%d",&j);
switch(j) {
case 1://根据原来的职工号更改职工号
printf("请输入需要修改的职工号");
scanf("%d",&xh);
while(p1!=NULL) {
if(p1->Number==xh) {
i++;
printf("请输入修改后的职员号: ");
scanf("%d",&p1->Number);
while(p1->Number<1) {
printf("输入的职工号不符合规定,请重新输入!!\n");
printf("请重新输入职工号: ");
scanf("%d",&p1->Number);
}
q=head;
while(q->next !=NULL) {
q=q->next ;
if(q==p1)continue;
while(p1->Number==q->Number) {
printf("该职工号已存在,请重新输入!\n");
scanf("%d",&p1->Number);
}
}
printf("职员信息修改完成!");
break;
}
p1=p1->next;
}
if(i==0) {
printf("该职员职工号不存在!\n");
}
return;
case 2://根据职工号修改姓名
printf("请输入想要修改的职工姓名的职工号(修改姓名)");
scanf("%d",&n);
while(p1!=NULL) {
if(p1->Number==n) {
i++;
printf("请输入修改后的职员姓名:");
scanf("%s",&p1->Name);
printf("职员信息修改完成!");
break;
}
p1=p1->next;
}
if(i==0) {
printf("该职员姓名不存在!\n");
}
return;
case 3://根据职工号修改性别
printf("请输入想要修改的职工号");
scanf("%d",&xh);
while(p1!=NULL) {
if(p1->Number==xh) {
i++;
printf("请输入修改后的职员性别: ");
scanf("%s",&p1->sex);
while(strcmp(p1->sex,"W")!=0&&strcmp(p1->sex,"M")!=0) {
printf("输入的职工性别不符合规定,请重新输入!!\n");
printf("请重新输入职工性别: ");
scanf("%s",&p1->sex);
}
printf("职员信息修改完成!");
break;
}
p1=p1->next;
}
if(i==0) {
printf("该职员职工号不存在!\n");
}
return;
case 4://根据职工号修改全部信息
printf("请输入想要修改职员的职工号:");
scanf("%d",&n);
while(n<1) {
printf("输入的职工号不符合规定,请重新输入!!\n");
printf("请重新输入职工号: ");
scanf("%d",&n);
}
while(p1!=NULL) {
if(p1->Number==n) {
i++;
printf("请输入姓名: ");
scanf("%s",&p1->Name);
printf("请输入性别(W/M):");
scanf("%s",&p1->sex);
while(strcmp(p1->sex,"W")!=0&&strcmp(p1->sex,"M")!=0) {
printf("输入的职工性别不符合规定,请重新输入!!\n");
printf("请重新输入职工性别: ");
scanf("%s",&p1->sex);
}
printf("请输入年龄:");
scanf("%d",&p1->birthday);
while(p1->birthday<18||p1->birthday>60) {
printf("输入的职工年龄不符合规定,请重新输入!!\n");
printf("请重新输入职工年龄: ");
scanf("%d",&p1->birthday);
}
printf("请输入学历:");
scanf("%s",&p1->education);
printf("请输入职务: ");
scanf("%s",&p1->post);
printf("请输入工资: ");
scanf("%f",&p1->wages);
while(p1->wages<0) {
printf("输入的工资不符合规定,请重新输入!!\n");
printf("请重新输入职工工资: ");
scanf("%f",&p1->wages);
}
printf("请输入住址: ");
scanf("%s",&p1->add);
printf("请输入电话: ");
scanf("%s",&p1->Tel) ;
int len=strlen(p1->Tel);
while(len!=11) {
printf("电话格式不正确,请重新输入!!\n");
printf("请输入电话:");
scanf("%s",&p1->Tel) ;
len=strlen(p1->Tel);
}
q=head;
while(q->next !=NULL) {
q=q->next ;
if(q==p1)
continue;
while(strcmp(p1->Tel ,q->Tel)==0) {
printf("该电话已存在,请重新输入!\n");
scanf("%s",&p1->Tel);
}
}
printf("职员信息修改完成!");
break;
}
p1=p1->next;
}
if(i==0) {
printf("该职员职工号不存在!\n");
}
return;
}
}
(7)新增职工信息
新增利用头插法
void tianjia(wo *head) {
system("cls");
wo *p,*p1,*q;
p=(work *)malloc(sizeof(work));
p1=(work *)malloc(sizeof(work));
p=head;
printf("请输入新添加职员的信息!");
printf("请输入职工号: ");
scanf("%d",&p1->Number);
while(p1->Number<1) {
printf("输入的职工号不符合规定,请重新输入!!\n");
printf("请重新输入职工号: ");
scanf("%d",&p1->Number);
}
q=head;
while(q->next !=NULL) {
q=q->next ;
while(p1->Number==q->Number) {
printf("该职工号已存在,请重新输入!\n");
scanf("%d",&p1->Number);
}
}
printf("请输入姓名: ");
scanf("%s",&p1->Name);
printf("请输入性别(W/M):");
scanf("%s",&p1->sex);
while(strcmp(p1->sex,"W")!=0&&strcmp(p1->sex,"M")!=0) {
printf("输入的职工性别不符合规定,请重新输入!!\n");
printf("请重新输入职工性别: ");
scanf("%s",&p1->sex);
}
printf("请输入年龄:");
scanf("%d",&p1->birthday);
while(p1->birthday<18||p1->birthday>60) {
printf("输入的职工年龄不符合规定,请重新输入!!\n");
printf("请重新输入职工年龄: ");
scanf("%d",&p1->birthday);
}
printf("请输入学历:");
scanf("%s",&p1->education);
printf("请输入职务: ");
scanf("%s",&p1->post);
printf("请输入工资: ");
scanf("%f",&p1->wages);
while(p1->wages<0) {
printf("输入的工资不符合规定,请重新输入!!\n");
printf("请重新输入职工工资: ");
scanf("%f",&p1->wages);
}
printf("请输入住址: ");
scanf("%s",&p1->add);
printf("请输入电话: ");
scanf("%s",&p1->Tel) ;
int len=strlen(p1->Tel);
while(len!=11) {
printf("电话格式不正确,请重新输入!!\n");
printf("请输入电话:");
scanf("%s",&p1->Tel) ;
len=strlen(p1->Tel);
}
q=head;
while(q->next !=NULL) {
q=q->next ;
while(strcmp(p1->Tel ,q->Tel)==0) {
printf("该电话已存在,请重新输入!\n");
scanf("%s",&p1->Tel);
}
}
p1->next=p->next;
p->next=p1;
p1=p1->next; //头插法
printf("添加成功!");
}
(8)保存职工信息
保存文件
void baocun(wo *head) {
system("cls");
FILE *fp;//定义指针变量fp
fp=fopen("D:\\职工管理系统.txt","w");//文件名
wo *p=head;
p=p->next;
while(p!=NULL) {
fprintf(fp,"职工号:%d 姓名:%s 性别:%s 年龄:%d 学历:%s 职务:%s 薪水:%f 地址:%s 电话:%s\n",p->Number,p->Name,p->sex,p->birthday,p->education,p->post,p->wages,p->add,p->Tel);
p=p->next;
}
fclose(fp);
printf("保存成功!\n");
}
保存的文件
4.主函数
int main() {
system("color b4");
struct work wo[100];
int s;
work *head=(work*)malloc(sizeof(work));
head->next=NULL;
system("cls");
while(1) {
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf(" \t\t***********职工管理系统*********\n");
printf(" \t\t********************************\n");
printf(" \t\t* 1.录入职工信息 *\n");
printf(" \t\t* 2.浏览职工信息 *\n");
printf(" \t\t* 3.查询职工信息 *\n");
printf(" \t\t* 4.删除职工信息 *\n");
printf(" \t\t* 5.修改职工信息 *\n");
printf(" \t\t* 6.新增职工信息 *\n");
printf(" \t\t* 7.工资高低排序 *\n");
printf(" \t\t* 8.退出职工系统 *\n");
printf(" \t\t* 9.保存职工信息 *\n");
printf(" \t\t********************************\n");
printf(" \t\t**********功能均需手动保存!!!\n");
printf(" \t\t***退出系统后查询保存的信息需先浏览*******\n");
printf("请输入选择的功能:");
scanf("%d",&s);
~主界面样式
switch(s) {
case 1: //录入职员信息
luru(head);
system("pause");
system("cls");
break;
case 2: //浏览成员信息
liulan(head);
system("pause");
system("cls");
break;
case 3: //查询职员信息
chaxun(head);
system("pause");
system("cls");
break;
case 4: //输入姓名删除
shanchu(head);
system("pause");
system("cls");
break;
case 5: //修改信息
xiugai(head);
system("pause");
system("cls");
break;
case 6: //添加职员信息
tianjia(head);
system("pause");
system("cls");
break;
case 7: //按工资高低排序
paixu(head);
system("pause");
system("cls");
break;
case 8: //退出
exit(0);
break;
case 9: //信息保存
baocun(head);
system("pause");
system("cls");
break;
default : //乱输入的处理办法
printf("输入有误,请重新输入!!!");
system("pause");
system("cls");
break;
}
}
}