一、问题描述
二、解题思路与源码
在这里我们要处理多个数据,如果使用数组就一定要对其大小进行定义,这在数据处理过程中显得极为不方便,所以我们使用链表。单链表是一种链式存取的数据结构,每个结点既存取数据元素本身的信息(数据域data),又存储数据元素的间接信息(指针域next)。它的存储空间不是预先分配的,是在运行时根据需要动态生成,每个结点存放在一个独立的存储单元中,节点间的逻辑关系依靠存储单元中附加的指针来给出。

为存储员工信息,我们需要声明定义一个结构体类型,成员变量包括编号、姓名、性别、年龄、部门、入职时间等。给结构体取别名,用Link代替Node*可以使代码更加简洁。
//声明员工结构体作为链表节点
struct Employee{
string number; //编号
string name; //姓名
string sex; //性别
string department; //部门
string age; //年龄
string time; //入职时间
struct Employee* Next; //用作指向自己的指针
};
//定义结构体变量及取别名
typedef struct Employee Node;
typedef Node* Link;

分别建立具有录入、修改、删除、查询等功能的子函数,完成相应功能,对程序实现模块化。
//函数声明
Link Create(Link Head); //初始化链表
void Release(Link Head); //释放链表
Link Input(Link Head); //录入员工数据(前插法)
Link Search(Link Head); //查询员工信息
void Display_List(Link Head); //显示所有员工信息
void Display_Node(Link pNode); //显示员工信息
Link Modify(Link Head); //修改员工信息
Link Del(Link Head); //删除员工信息
void Save_ByFile(Link Head,fstream& ofile); //保存员工信息
初始化链表,创建一个带头节点的空链表,头结点的数据域一般不存储任何信息,指针域存储指向开始结点的指针,即第一个元素结点的存储位置。
//创建一个带头节点的空链表
Link Create(Link Head){
Head=(Link)new Node;
if(!Head){
cout<<"分配内存失败!"<<endl;
return NULL;
}
Head->number=""; //指针引用结构体中的成员变量
Head->name="";
Head->sex="";
Head->department="";
Head->age="";
Head->time="";
Head->Next=NULL;
return Head;
}

录入员工数据(前插法插入数据)
//录入员工数据(前插法)
Link Input(Link Head){
Link pNew; //声明新节点
string n_umber,n_ame,s_ex,d_epartment,a_ge,t_ime;
pNew=(Link)new Node;
cout<<endl<<"请输入员工编号:";
cin>>n_umber;
cout<<"请输入员工姓名:";
cin>>n_ame;
cout<<"请输入员工性别:";
cin>>s_ex;
cout<<"请输入员工部门:";
cin>>d_epartment;
cout<<"请输入员工年龄:";
cin>>a_ge;
cout<<"请输入员工入职时间:";
cin>>t_ime;
cout<<endl;
pNew->number=n_umber;
pNew->name=n_ame;
pNew->sex=s_ex;
pNew->department=d_epartment;
pNew->age=a_ge;
pNew->time=t_ime;
pNew->Next=Head->Next; //新建节点的数据域指向头节点
Head->Next=pNew; //pNew插入到Head的后面
cout<<"已成功录入!";
return Head;
}

释放链表(循环删除各节点直至头指针为空)
//释放链表
void Release(Link Head){
Link ptr; //声明一个操作用的指针
while(Head!=NULL){
ptr=Head; //指向首元节点
Head=Head->Next; //指针后移
delete ptr; //释放节点资源
}
}

显示单个员工信息(指针引用结构体中的成员变量,指针名->成员名)
//显示员工信息
void Display_Node(Link pNode){
cout<<setw(12)<<left<<pNode->number
<<setw(12)<<left<<pNode->name
<<setw(10)<<left<<pNode->sex
<<setw(12)<<left<<pNode->department
<<setw(10)<<left<<pNode->age
<<setw(12)<<left<<pNode->time<<endl;
}
查询员工信息(利用循环使指针不断后移直至找到)
//查询员工信息
Link Search(Link Head){
Link ptr;
string n_umber;
ptr=Head;
cout<<endl<<"请输入员工编号:";
cin>>n_umber;
while(ptr->Next){
if(ptr->Next->number==n_umber){
cout<<endl<<"----------------------------查询结果------------------------------"<<endl
<<endl<<"编号 姓名 性别 部门 年龄 入职时间"<<endl;
Display_Node(ptr->Next); //打印满足条件的节点
return ptr;
}
ptr->Next=ptr->Next->Next; //查询下一节点
}
cout<<endl<<"查询不到该员工的信息!"<<endl;
return ptr;
}
显示所有员工信息
//显示所有员工信息
void Display_List(Link Head){
Link ptr;
ptr=Head->Next;
cout<<"===========================所有员工信息==========================="<<endl
<<"编号 姓名 性别 部门 年龄 入职时间"<<endl;
while(ptr){
Display_Node(ptr);
ptr=ptr->Next;
}
}
修改员工信息
//修改员工信息
Link Modify(Link Head){
Link ptr;
ptr=Search(Head);
string n_umber,n_ame,s_ex,d_epartment,a_ge,t_ime;
if(ptr->Next){
cout<<endl<<"--------请开始修改--------"<<endl;
cout<<endl<<" 请修改员工编号:";
cin>>n_umber;
cout<<" 请修改员工姓名:";
cin>>n_ame;
cout<<" 请修改员工性别:";
cin>>s_ex;
cout<<" 请修改员工部门:";
cin>>d_epartment;
cout<<" 请修改员工年龄:";
cin>>a_ge;
cout<<" 请修改员工入职时间:";
cin>>t_ime;
ptr->Next->number=n_umber;
ptr->Next->name=n_ame;
ptr->Next->sex=s_ex;
ptr->Next->department=d_epartment;
ptr->Next->age=a_ge;
ptr->Next->time=t_ime;
cout<<endl<<"修改成功!"<<endl;
}
return Head;
}
删除员工信息
//删除员工信息
Link Del(Link Head){
Link ptr;
char flag;
Link ptr_front;
ptr_front=Search(Head);
ptr=ptr_front->Next;
if(ptr){
cout<<"是否要删除该员工的信息!(Y/N):";
cin>>flag;
if (flag=='Y'||flag=='y'){
ptr_front->Next=ptr->Next;
delete ptr; //删除此节点
cout<<"删除成功!";
}
}
return Head;
}
保存员工信息
//保存信息
void Save_ByFile(Link Head,fstream& ofile){
Link pNode;
pNode=Head->Next;
ofile.clear(); //清除文件结束状态
while(pNode){
ofile<<setw(10)<<left<<pNode->number
<<setw(10)<<left<<pNode->name
<<setw(10)<<left<<pNode->sex
<<setw(10)<<left<<pNode->department
<<setw(10)<<left<<pNode->age
<<setw(10)<<left<<pNode->time<<endl;
pNode=pNode->Next;
}
cout<<"数据文件保存成功!"<<endl;
}
主函数
int main(){
Link Head=0;
Head=Create(Head); //创建链表
fstream iofile;
iofile.open("mess.txt"); //打开文件
if(!iofile){
cout<<"打开文件失败!"<<endl;
return -1;
}
int menu;
while(1){
cout<<endl<<" ┃▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔┃"<<endl
<<" ┃ 人事管理系统 ┃"<<endl
<<" ┃──────────────────────────────────┃"<<endl
<<" ┃ 1.录入信息 ┃"<<endl
<<" ┃ 2.修改信息 ┃"<<endl
<<" ┃ 3.删除信息 ┃"<<endl
<<" ┃ 4.查询信息 ┃"<<endl
<<" ┃ 5.所有信息 ┃"<<endl
<<" ┃ 6.退出系统 ┃"<<endl
<<" ┃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁┃"<<endl;
cout<<endl<<"请选择相应操作菜单项:";
cin>>menu;
switch(menu){
case 1:
Head=Input(Head); //录入信息
break;
case 2:
Head=Modify(Head); //修改信息
break;
case 3:
Head=Del(Head); //删除信息
break;
case 4:
Search(Head); //查询信息
break;
case 5:
Display_List(Head); //显示信息
break;
case 6:
Save_ByFile(Head,iofile); //保存信息
cout<<"成功退出系统!"<<endl;
return 0;
default:
cout<<"请选择正确的菜单项进行操作!"<<endl;
}
}
Release(Head); //释放链表
iofile.close(); //关闭文件
return 0;
}
三、结果展示
录入单个员工信息
修改单个员工信息及显示所有员工信息
删除单个员工信息
查询单个员工信息