main.cpp
#include"worker.h"
int main()
{
LNode *head=NULL;
InitList(head);
Menu(head);
return 0;
}
worker.cpp
#include <iostream>
#include<iomanip>
#include<stdio.h>
#include<fstream>
#include<conio.h>//catch() 任意键继续
#include <windows.h>//system("cls") 清屏
#include"worker.h"
/************************************
* 功能描述:申请一个新结点,并将其初始化
* 输入参数:无
* 输出参数:无
************************************/
void InitList(LinkList *&head)//创建一个头结点
{
head=(LinkList *)malloc(sizeof(LinkList));
head->next=NULL;
}
void NewNode(LNode *head)// 创建完成调用CreatList()函数将新节点尾插法插入链表
{
LNode *a;
string i;
a=new LNode;//申请空间
cout<<"职工工号"<<endl;
cin>>i;
if(id(i,head)==1)
{
a->id=i;
cout<<"职工姓名"<<endl;
cin>>a->name;
cout<<"职工性别: "<<endl;
cin>>a->sex;
cout<<"职工年龄: "<<endl;
cin>>a->age;
cout<<"职工学历"<<endl;
cin>>a->xueli;
cout<<"职工职务: "<<endl;
cin>>a->zhiwu;
cout<<"职工地址"<<endl;
cin>>a->dizhi ;
CreatList(a,head);
}
else
cout<<"工号重复"<<endl;
}
void CreatList(LNode *a,LNode *head)//添加职工
{
LNode *p;
if(head->next==NULL)//如果链表为空
{
head->next=a;
a->next=NULL;
return;//插入完成返回
}
p = head->next;//从头结点开始找
while(p)//p非空则一直循环
{
if(p->next==NULL)//找到尾节点
{
p->next =a;
a->next =NULL;
return;//插入完成返回
}
p= p->next;//找下一个节点
}
}
int id(string a,LNode *head)//判断工号是否重复
{
LNode *p=head->next;
while(p)
{
if (p->id==a)
{
return 0;
}
p= p->next;
}
return 1;
}
void Destroy(LinkList *&head)//销毁线性表
{
LinkList *pre=head->next,*p=head->next->next; //准备好前驱后置指针
while (p!=NULL)
{
free(pre);//释放内存空间
pre=p;
p=pre->next;
}
free(pre);
head->next=NULL;
cout<<"职工信息已清空"<<endl;
}
void ListLength(LinkList *head)
{ int n=0;
LinkList *p=head->next;
while (p->next!=NULL)
{
n++;
p=p->next;
}
cout<<"一共有"<<n+1<<"个职工."<<endl;
}
/************************************
* 功能描述:显示所有职工的信息
* 输入参数:无
* 输出参数:输出职工信息
************************************/
void DispList(LNode *head)//输出线性表
{
LinkList *p=head->next;
if(head->next==NULL)
{
cout<<"该信息表为空!"<<endl;
return;
}
else
{
while (p!=NULL)
{
paixu(head);
cout<<"姓名"<<setw(10)<<"工号"<<setw(10)<<"年龄"<<setw(10)<<"性别"<<setw(10)<<"学历"<<setw(10)<<"地址"<<setw(10)<<"职位\n";
cout<<"----------------------------------------------------------------------------"<<endl;
cout<<p->name<<setw(10)<<p->id<<setw(10)<<p->age<<setw(10)<<p->sex<<setw(10)<<p->xueli<<setw(10)<<p->dizhi<<setw(10)<<p->zhiwu<<endl;
p=p->next;
}
}
ListLength(head);
}
/************************************
* 功能描述:根据输入的工号删除职工信息
* 输入参数:职工工号
* 输出参数:无
************************************/
void Del(LNode *head)//删除职工
{
string id;
int m;
LNode *p,*pre;
cout<<"请输入要删除职工的工号:";
cin>>id;
if (head->next==NULL)
{
cout<<"该信息表为空!"<<endl;
return;
}
else
{
p=pre=head->next;
while(p)
{
if (p->id==id)
{
cout<<"姓名"<<setw(10)<<"工号"<<setw(10)<<"年龄"<<setw(10)<<"性别"<<setw(10)<<"学历"<<setw(10)<<"地址"<<setw(10)<<"职位\n";
cout<<p->name<<setw(10)<<p->id<<setw(10)<<p->age<<setw(10)<<p->sex<<setw(10)<<p->xueli<<setw(10)<<p->dizhi<<setw(10)<<p->zhiwu<<endl;
cout<<"是否要删除职工信息?"<<endl;
cout<<" 1.是 2.不是 "<<endl;
cin>>m;
if(m==1)
{
if(p==head->next)
{
head->next = head->next->next;
free(p);
p=NULL;
cout<<"信息已删除!"<<endl;
return;
}
else
{
pre->next =p->next;
free(p);
p=NULL;
cout<<"信息已删除!"<<endl;
return;
}
}
if(m==2)
{
return;
}
}
else
{
pre=p;
p=p->next;
}
}
}
cout<<"工号输入有误"<<endl;
Del(head);
}
/************************************
* 功能描述:根据输入的姓名查找职工信息
* 输入参数:职工姓名
* 输出参数:无
************************************/
void SearchName(LNode *head)//按姓名查找职工
{
string name;
int i;
cout<<"请输入要查找的职工姓名"<<endl;
cin>>name;
LNode *p=head->next;
if (head->next==NULL)
{
cout<<"该信息表为空!"<<endl;
return;
}
p=head->next;
while(p)
{
if (p->name==name)
{
i++;
cout<<"姓名"<<setw(10)<<"工号"<<setw(10)<<"年龄"<<setw(10)<<"性别"<<setw(10)<<"学历"<<setw(10)<<"地址"<<setw(10)<<"职位\n";
cout<<p->name<<setw(10)<<p->id<<setw(10)<<p->age<<setw(10)<<p->sex<<setw(10)<<p->xueli<<setw(10)<<p->dizhi<<setw(10)<<p->zhiwu<<endl;
}
p= p->next;
}
if(i==0)
cout<<"没有该职工!"<<endl;
}
/************************************
* 功能描述:根据输入的ID查找信息
* 输入参数:职工ID
* 输出参数:无
************************************/
void SortID(LNode *head)//按工号查找职工
{
string id;
cout<<"请输入要查找的职工号"<<endl;
cin>>id;
LNode *p=head->next;
if (head->next==NULL)
{
cout<<"该信息表为空!"<<endl;
return;
}
p=head->next;
while(p)
{
if (p->id==id)
{
cout<<"姓名"<<setw(10)<<"工号"<<setw(10)<<"年龄"<<setw(10)<<"性别"<<setw(10)<<"学历"<<setw(10)<<"地址"<<setw(10)<<"职位\n";
cout<<p->name<<setw(10)<<p->id<<setw(10)<<p->age<<setw(10)<<p->sex<<setw(10)<<p->xueli<<setw(10)<<p->dizhi<<setw(10)<<p->zhiwu<<endl;
return;
}
p= p->next;
}
cout<<"没有该职工!"<<endl;
}
/************************************
* 功能描述:根据输入的职工号
* 输入参数:职工ID,要修改的选项
* 输出参数:无
************************************/
void change(LNode *head)
{
LNode *p;//
string id;
int m,c;
string sex;
string age;
string xueli;
string zhiwu;
string dizhi;
p=head->next;//
if(head->next==NULL)
{
cout<<"该信息表为空!"<<endl;
return;
}
else
{
cout<<"请输入职工号: "<<endl;
cin>>id;
while(p)
{
if(p->id==id)
{
cout<<"姓名"<<setw(10)<<"工号"<<setw(10)<<"年龄"<<setw(10)<<"性别"<<setw(10)<<"学历"<<setw(10)<<"地址"<<setw(10)<<"职位\n";
cout<<p->name<<setw(10)<<p->id<<setw(10)<<p->age<<setw(10)<<p->sex<<setw(10)<<p->xueli<<setw(10)<<p->dizhi<<setw(10)<<p->zhiwu<<endl;
cout<<"是否要修改职工信息?"<<endl;
cout<<" 1.是 2.不是 "<<endl;
cin>>m;
if(m==1)
{
cout<<"请输入要修改的选项(1编号,2姓名,3性别,4学历,5职务,6地址,7年龄"<<endl;
cin>>c;
switch(c)
{
case 1:
{
cout<<"请输入修改员工编号"<< "更改后的编号是"<<endl;
cin>>p->id;
cout<<"修改员工信息成功!"<<endl;
break;
}
case 2:
{
cout<<"请输入员工更改后的姓名是"<<endl;
cin>>p->name;
cout<<"修改员工信息成功!"<<endl;
break;
}
case 3:
{
cout<<"请输入员工更改后的性别是"<<endl;
cin>>p->sex;
cout<<"修改员工信息成功!"<<endl;
break;
}
case 4:
{
cout<<"请输入员工更改后的学历是"<<endl;
cin>>p->xueli;
cout<<"修改员工信息成功!"<<endl;
break;
}
case 5:
{
cout<<"请输入员工更改后的职务是"<<endl;
cin>>p->zhiwu;
cout<<"修改员工信息成功!"<<endl;
break;
}
case 6:
{
cout<<"请输入员工更改后的地址是"<<endl;
cin>>p->dizhi;
cout<<"修改员工信息成功!"<<endl;
break;
}
case 7:
{
cout<<"请输入修改员工年龄"<< "更改后的年龄是"<<endl;
cin>>p->age;
cout<<"修改员工信息成功!"<<endl;
break;
}
}
return;
}
if(m==2)
{
cout<<"职工信息保留!"<<endl;
return;
}
break;
}
p=p->next;
}
}
cout<<"对不起,不存在工号为"<<id<<"的职工,请重新输入"<<endl;
change(head);
}
void paixu(LNode *head)//按工号排序
{
LNode t,*p,*q,*r;
r=head->next;
while(r)
{
p=r;
q=r->next;
while(q)
{
if((q->id)<(p->id))
{
t.name=q->name;//将q结点的信息给t
t.id=q->id;
t.sex=q->sex;
t.age=q->age;
t.xueli=q->xueli;
t.zhiwu=q->zhiwu;
t.dizhi=q->dizhi;
q->name=p->name;//将p结点的信息给q
q->id=p->id;
q->sex=p->sex;
q->age=p->age;
q->xueli=p->xueli;
q->zhiwu=p->zhiwu;
q->dizhi=p->dizhi;
p->name=t.name;//将t结点的信息给p
p->id=t.id;
p->sex=t.sex;
p->age=t.age;
p->xueli=t.xueli;
p->zhiwu=t.zhiwu;
p->dizhi=t.dizhi;
}
q=q->next;
}
r=r->next;
}
}
/************************************
函数功能:保存链表数据到文件中
************************************/
void save(LNode *head) //保存操作结果
{
/*int i;*/
LNode *p=head->next;
LNode *q=head->next;
FILE *fp; //文件指针
if(p==NULL)
{
printf("现在没有职工信息,请先输入信息再进行操作\n");
return;
}
fp=fopen("worker.txt","w"); //在当前目录下打开goods.txt文件并设置只允许“写”操作
if(!fp)
{
printf("文件不存在\n");
return;
}
//将商品信息写入文件
fprintf(fp,"===========================职工信息一览表===========================\n");
fprintf(fp,"姓名\t工号\t性别\t学历\t职务\t地址\n");
while(p!=NULL)
{
fprintf(fp,"%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t",p->name.c_str(),p->id.c_str(),p->age.c_str(),p->sex.c_str(),p->xueli.c_str(),p->zhiwu.c_str(),p->dizhi.c_str());
fprintf(fp,"\n");
p=p->next;
}
fclose(fp); //把缓冲区内最后剩余的数据输出到内核缓冲区,并释放文件指针
printf("数据已成功导入文件worker.txt!\n");
}
void Menu(LNode *head)
{
int choose;
cout<<"\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※"<<endl;
cout<<"\t 职工信息管理系统 "<<endl<<endl;
cout<<"\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※"<<endl<<endl;
cout<<"请按键选择需要的操作 (请输入数字)"<<endl; cout<<"\n";
cout<<" ╭--------------------------------------—---------------------- ╮"<<endl;
cout<<" │ 1 录入职工信息: │"; cout<<" │ 2 输出职工信息: │"<<endl;
cout<<" │ 3 删除职工信息: │"; cout<<" │ 4 清除所有信息: │"<<endl;
cout<<" │ 5 按姓名查找职工信息: │"; cout<<" │ 6 按ID查找职工信息: │"<<endl;
cout<<" │ 7 修改职工信息: │"; cout<<" │ 8 保存职工信息 │"<<endl;
cout<<" │ 9 退出系统: │"<<endl;
cout<<" ╰------------------------------------------------------------- ╮"<<endl;
cin>>choose;/*取得用户的选择*/
switch(choose)
{
case 1:
system("cls");
NewNode(head);
cout<<"按任意键继续"<<endl;
getch();
break;
case 2:
system("cls");
DispList(head);
cout<<"按任意键继续"<<endl;
getch();
break;
case 3:
system("cls");
Del(head);
//根据姓名查找学生信息
cout<<"按任意键继续"<<endl;
getch();
break;
case 4:
system("cls");
Destroy(head);
cout<<"按任意键继续"<<endl;
getch();
break;
case 5:
system("cls");
SearchName(head);
cout<<"按任意键继续"<<endl;
getch();
break;
case 6:
system("cls");
SortID(head);
getch();
break;
case 7:
system("cls");
change(head);
getch();
break;
case 8:
system("cls");
save(head);
getch();
break;
case 9:
system("cls");
exit(0);
break;
default:
break;
}
Menu(head);/*递归调用*/
}
worker.h
#ifndef WORKER_H_INCLUDED
#define WORKER_H_INCLUDED
#include <string> //string 类型
using namespace std;
typedef struct LNode//职工结构体
{
string name;
string id;
string sex;
string age;
string xueli;
string zhiwu;
string dizhi;
struct LNode *next;//指针域,指向后继节点
} LinkList;
void InitList(LinkList *&head);
void NewNode(LNode *head);//
int id(string a,LNode *head);
void CreatList(LNode *a,LNode *head);//尾插法生成单链表
void Display(LNode *head);//显示职工信息
void SortID();//ID查询
void SearchName();//姓名查询
void Del(LNode *head);//按ID删除
void Destroy(LinkList *&head);
void paixu(LNode *head);
void change(LNode *head);
void Menu(LNode *head);
void save(LNode *head);
#endif // WORKER_H_INCLUDED
执行结果
1.录入
2.输出信息
3.按姓名查找
4.按ID查找
5.修改信息
修改后:
6.删除
7.保存至文件
8.清空所有