C++基于多态的职工管理系统完整代码

1.头文件.h 部分:

1.1  Worker.h

/*这是一个抽象的职工父类,以下类都继承自该类:1.Employee类 2.Manager类 3.Boss类 */#pragma once  
#include<iostream>  
#include<string>
using namespace std; //使用标准命名空间 class Worker
{public://1.显示个人信息 virtual void Show_Info() = 0;//2.获取岗位名称virtual string Get_DeptName() = 0; //职工编号 int W_Id;//职工姓名 string W_Name;//职工所在部门名称编号 int W_DeptId; 
};

1.2  Employee.h

#pragma once  //防止头文件重复包含 /*这是一个普通员工类,该类继承自Worker类,并实现了父类Worker中的纯虚函数。*/ #include<iostream>  //包含标准输入输出流 
#include<string>
#include "Worker.h"
using namespace std; //使用标准命名空间class Employee:public Worker
{public://1.构造函数Employee(int id, string name, int dept_id);//2.显示个人信息 void Show_Info();//3.获取岗位名称string Get_DeptName(); 
};

1.3  Manager.h

#pragma once  //防止头文件重复包含
/*这是一个经理类,该类继承自Worker类,并实现了父类Worker中的纯虚函数。*/ #include<iostream>  //包含标准输入输出流 
#include<string>
#include "Worker.h"
using namespace std; //使用标准命名空间 class Manager:public Worker
{public://1.构造函数Manager(int id, string name, int dept_id);//2.显示个人信息 void Show_Info();//3.获取岗位名称string Get_DeptName(); 
};

1.4  Boss.h

#pragma once  //防止头文件重复包含 /*这是一个老板类,该类继承自Worker类,并实现了父类Worker中的纯虚函数。*/ #include<iostream>  //包含标准输入输出流 
#include<string>
#include "Worker.h"
using namespace std; //使用标准命名空间 class Boss:public Worker
{public://1.构造函数Boss(int id, string name, int dept_id);//2.显示个人信息 void Show_Info();//3.获取岗位名称string Get_DeptName(); };

1.5  DataStructType.h

//这是一个职工数据链表的结点结构和头指针结构的声明头文件 #pragma once  //防止头文件重复包含 //职工数据链表结点结构 
typedef struct wlist 
{Worker* WorkerDataPtr;//职工链表结点数据域wlist* next;
}WorkerLinkNode;//职工数据链表头指针结构 
typedef struct header
{int worker_num;  //记录当前链表的结点数(职工人数) WorkerLinkNode* next;
}Header;

1.6  WorkerMangers.h

#pragma once  //防止头文件重复包含 
/*
该头文件声明了一个WorkerManager类,用于实现职工信息的管理。该类包含了一些成员函数,
如构造函数、添加职工、显示职工、修改职工、删除职工等。同时,它还包含一些用于管理
职工链表的成员变量,如链表的头指针和尾指针,以及一些与文件相关的标志。
*/
#include<iostream>  //包含标准输入输出流 
#include<string>
#include "Worker.h"
#include "DataStructType.h"
#define EMPFILE "DataFile.txt"using namespace std; //使用标准命名空间 //创建职工管理类 
class WorkerManger
{public:          /*****************************WorkerManger类成员函数相关声明*****************************///1.WorkerManger类的构造函数 WorkerManger();//2..读取当前打开文件中的职工人数int Get_WorkerNum();//3.初始化职工数据链表 void Init_WorkerLinkList();//4.显示系统菜单函数void Show_Menu();//5.退出系统函数void Exit_System(); //6.添加职工功能函数void Add_worker(); //7.保存员工信息到文件void Save_File();//8.显示职工数据void Show_worker(); //9.查找职工void FinD_Worker();//10.修改职工信息void MoD_Worker(); //11.删除职工信息void Del_Worker(); //12.检查当前链表是否为空bool Is_Empty_LinkList(); //13.排序职工链表及文件数据void Sort_Worker();//14.升序排序函数 void Asce_sort(int low, int high, WorkerLinkNode* Array); //15.降序排序函数void DesE_sort(int low, int high, WorkerLinkNode* Array);//16.清空文件数据void Clean_File();//17.根据职工编号判断职工是否存在,存在则返回结点指针 ,否则返回空 WorkerLinkNode* Is_ExistWorker(int E_id);	//18.根据职工姓名判断职工是否存在,存在则返回结点指针 ,否则返回空 WorkerLinkNode* Is_ExistWorker(string E_name);//19.返回当前数据结点的前驱结点,无前驱结点则返回空 WorkerLinkNode* Get_Pre(WorkerLinkNode* &curr_node);//20.返回当前数据结点的后继结点,无后继结点则返回空  WorkerLinkNode* Get_Suc(WorkerLinkNode* &curr_node); //21.将链表数据存在到临时数组中,便于排序WorkerLinkNode* Store_Array();//22.将排好序的数组数据,连接成链表WorkerLinkNode* Recom_Link(WorkerLinkNode* Array);//23.WorkerManger类的析构函数 ~WorkerManger();	/*****************************WorkerManger类成员变量相关声明*****************************///1.职工链表头指针Header*LinkHeader; //2.职工链表尾指针WorkerLinkNode* EndPtr; //3.判断文件是否为空标志bool File_IsEmpty;//4.判断文件是否存在标志bool File_IsExist; 
};

2.实现文件.cpp 部分:

2.1  Employee.cpp

//Employee 的类的实现
#include "Employee.h"//构造函数
Employee::Employee(int id, string name, int dept_id)
{this->W_Id = id;this->W_Name = name;this->W_DeptId = dept_id;
}//显示个人信息 
void Employee::Show_Info()
{cout << "岗位编号:" << this->W_Id<< "\t职工姓名:" << this->W_Name<< "\t岗位:" << this->Get_DeptName()<< "\t岗位职责: 完成经理交给的任务" << endl; 
}//获取岗位名称
string Employee::Get_DeptName()
{return "员工"; 
} 

2.2   Manager.cpp

//Manager 的类的实现
#include "Manager.h"//构造函数
Manager::Manager(int id, string name, int dept_id)
{this->W_Id = id;this->W_Name = name;this->W_DeptId = dept_id;
}//显示个人信息 
void Manager::Show_Info()
{cout << "岗位编号:" << this->W_Id<< "\t职工姓名:" << this->W_Name<< "\t岗位:" << this->Get_DeptName()<< "\t岗位职责: 完成老板交给的任务,并下发任务给员工" << endl; 
}//获取岗位名称
string Manager::Get_DeptName()
{return "经理"; 
} 

2.3   Boss.cpp

//Boss 的类的实现
#include "Boss.h"//构造函数
Boss::Boss(int id, string name, int dept_id)
{this->W_Id = id;this->W_Name = name;this->W_DeptId = dept_id;
}//显示个人信息 
void Boss::Show_Info()
{cout << "岗位编号:" << this->W_Id<< "\t职工姓名:" << this->W_Name<< "\t岗位:" << this->Get_DeptName()<< "\t岗位职责: 管理公司所有事务" << endl; 
}//获取岗位名称
string Boss::Get_DeptName()
{return "总裁"; 
}

2.4   WorkerMangers.cpp

//WorkerManager类的实现 
/********************************************头文件包含域*************************************/#include "WorkerMangers.h"
#include "Worker.h"
#include "Employee.h"
#include "Manager.h"
#include "Boss.h"
#include <fstream>
using namespace std;/*************************************WorkerManger类的成员函数实现域******************************///1.构造函数 
WorkerManger::WorkerManger()
{//1.构建职工链表头指针结点和尾指针,指针初始为空,结点数初始化为0  this->LinkHeader = new Header;this->LinkHeader->next =NULL;this->LinkHeader->worker_num = 0;EndPtr = NULL;//2.判断职工数据文件是否存在 ifstream ifs;ifs.open(EMPFILE, ios::in);//1.文件不存在if(!ifs.is_open()){cout << "文件不存在!" << endl;//初始化标记 this->File_IsEmpty = true; //文件为空 this->File_IsExist = false; //文件不存在 return;}//2.文件存在else{//2.1检查当前文件是否为空文件 char ch;ifs >> ch;if(ifs.eof())  //2.1.1文件为空的情况 {cout << "文件为空!" << endl;//初始化标记 this->File_IsEmpty = true; //文件为空 this->File_IsExist = true; //文件存在 ifs.close();return; }else //2.1.2文件不为空的情况 {//读取文件数据到链表中 int num = this->Get_WorkerNum();cout << "当前职工人数:" << num << endl;this->File_IsEmpty = false;//文件不为空 this->File_IsExist = true; //文件存在ifs.close();}} 
}/********************************************************************************************/
//2.读取当前打开文件中的职工人数
int WorkerManger::Get_WorkerNum()
{//1.打开文件 ifstream ifs;ifs.open(EMPFILE, ios::in);//以读文件方式打开文件 //2.创建临时变量,用于读取文件 int G_id;  //职工编号 string G_name; //职工姓名int G_deptId; //职工所在部门名称编号//3.读取文件数据 int num; //记录文件中职工人数while(ifs >> G_id && ifs >> G_name && ifs >> G_deptId) {num++;}//关闭文件 ifs.close();return num;
}/********************************************************************************************/
//3.初始化职工数据链表 
void WorkerManger::Init_WorkerLinkList()
{//1.检查当前文件是否存在 if(this->File_IsExist)  //存在 {if(this->File_IsEmpty == false)  //文件不为空 {//1.1创建流对象,以读文件方式打开文件 ifstream ifs;ifs.open(EMPFILE, ios::in);//2.创建临时变量,临时存储文件中读取的职工数据 int I_id;string I_name;int I_deptId;//2.1用于标记第一次链接(头指针指向第一个数据结点) int first = 1; //3.开始读取职工文件数据 while(ifs >> I_id && ifs >> I_name && ifs >> I_deptId) {//3.1创建文件数据结点 WorkerLinkNode* file_worker = new WorkerLinkNode;//3.2根据职工部门编号 deptId 选择创建相对应的结点数据域 switch(I_deptId){case 1:file_worker->WorkerDataPtr = new Employee(I_id, I_name,1);break;case 2:file_worker->WorkerDataPtr = new Manager(I_id, I_name,2);break;case 3:file_worker->WorkerDataPtr = new Boss(I_id, I_name,3);break;}//4.将数据节点依次链接到链表中if(first)//4.1头指针链接第一个文件数据结点 {this->LinkHeader->next = file_worker;this->EndPtr = file_worker;first = 0;} else  //依次链接后续数据结点 {this->EndPtr->next = file_worker;this->EndPtr = this->EndPtr->next;}this->LinkHeader->worker_num++;}this->EndPtr->next = NULL;  //5.将尾结点的指针指向空//6.关闭文件ifs.close();}else  //文件为空 {return; } 	}else  //不存在 {cout << "文件不存在,请检查文件路径是否正确!" << endl;return;}}/********************************************************************************************/
//4.显示系统菜单函数
void WorkerManger::Show_Menu()
{cout << "*********************************************" << endl;cout << "*********  欢迎使用职工管理系统! **********" << endl;cout << "*************  0.退出管理程序  *************" << endl;cout << "*************  1.增加职工信息  *************" << endl;cout << "*************  2.显示职工信息  *************" << endl;cout << "*************  3.删除离职职工  *************" << endl;cout << "*************  4.修改职工信息  *************" << endl;cout << "*************  5.查找职工信息  *************" << endl;cout << "*************  6.按照编号排序  *************" << endl;cout << "*************  7.清空所有文档  *************" << endl;cout << "*********************************************" << endl;cout << endl; 
}/********************************************************************************************/
//5.退出系统函数 
void WorkerManger::Exit_System()
{cout << "欢迎下次使用!" << endl;system("pause");system("cls");exit(0);
}/********************************************************************************************/
//6.添加职工信息函数
void WorkerManger::Add_worker()
{//1.检查文件是否存在 if(!this->File_IsExist){cout << "文件不存在,无法添加!请检查文件路径是否合法" << endl;return;}//2.输入添加新员工数量int add_num = 0;  cout << "请输入增加职工数量:" << endl;cin >> add_num;//3.检查输入是否合法 if(add_num < 0){cout << "输入有误!" << endl;system("pause");system("cls");return;}//4.开始添加员工数据 for(int i = 0;i < add_num;i++){//4.1.创建临时变量,临时存储用户输入的职工数据int A_Id;string A_Name; int A_Dselect; //4.2依次输入数据 cout << "请输入第" << i+1 << "个新职工编号:" << endl; cin >> A_Id;cout << "请输入第" << i+1 << "个新职工姓名:" << endl; cin >> A_Name;cout << "请选择该职工的岗位:" << endl;cout << "1. 普通职工" << endl; cout << "2. 经理" << endl; cout << "3. 老板" << endl;  cin >> A_Dselect;//4.3对所输入的职工部门编号进行检查	while(A_Dselect != 1 && A_Dselect != 2 && A_Dselect != 3) {cout << "输入有误,请重新输入:" << endl;cin >> A_Dselect;}//4.4创建职工数据结点 WorkerLinkNode* new_worker = new WorkerLinkNode;//4.5根据所输入的职工部门编号,创建相应的链表结点数据域 switch(A_Dselect){case 1:new_worker->WorkerDataPtr = new Employee(A_Id, A_Name,1);break;case 2:new_worker->WorkerDataPtr = new Manager(A_Id, A_Name,2);break;case 3:new_worker->WorkerDataPtr = new Boss(A_Id, A_Name,3);break;}//4.6动态更新尾指针 bool is_emptyLink = this->Is_Empty_LinkList();if(is_emptyLink == false) //当前链表不为空的处情况 ,初始化时头指针已经指向第一个数据结点,这里只需要处理尾指针 {this->EndPtr->next = new_worker;this->EndPtr = new_worker;this->LinkHeader->worker_num++;}else  //当前链表为空的情况,初始化时头尾指针均为空 {this->LinkHeader->next = new_worker;this->EndPtr = new_worker;this->LinkHeader->worker_num++;} }//5.链表尾结点指向空 this->EndPtr->next = NULL; system("pause");system("cls");
}/********************************************************************************************/
//7.将链表数据重写入文件中 
void WorkerManger::Save_File()
{//1.检查文件是否存在 if(!this->File_IsExist){cout << "文件不存在,无法保存!请检查文件路径是否合法" << endl;return;}//2.创建流对象,以写文件的方式打开文件 ofstream ofs;ofs.open(EMPFILE, ios::out);//3.保存数据 WorkerLinkNode* wptr = this->LinkHeader->next;//用于提取每个职工的结点数据 //依次读取文件 while(wptr != NULL){ofs << wptr->WorkerDataPtr->W_Id << " " << wptr->WorkerDataPtr->W_Name << " " << wptr->WorkerDataPtr->W_DeptId << endl;wptr = wptr->next;//更新文件标记,表示当前文件不为空 this->File_IsEmpty = false;}//关闭文件 ofs.close(); 	
}
/********************************************************************************************/
//8.显示当前文件中所有员工数据 
void WorkerManger::Show_worker()
{if(this->Is_Empty_LinkList()){cout << "文件不存在或记录为空!" << endl;}else{WorkerLinkNode* get = this->LinkHeader->next;//用于提取每个职工的结点数据while(get != NULL){get->WorkerDataPtr->Show_Info();get = get->next;}}system("pause");system("cls");
} /********************************************************************************************/
//9.查找职工
void WorkerManger::FinD_Worker()
{//1.检查文件是否存在以及是否为空 if(this->Is_Empty_LinkList()){cout << "文件不存在或记录为空,无法查找!" << endl;return;}//2.根据用户输入选择对应查找方式 int check_choice = 1;cout << "请输入查找方式:" << endl;cout << "1.按职工编号查找" << endl;cout << "2.按姓名查找" << endl;cin >> check_choice;//3.开始查找 int E_id;string E_name;WorkerLinkNode* result = NULL;switch(check_choice){case 1:cout << "请输入职工编号:" << endl;cin >> E_id;result = this->Is_ExistWorker(E_id);//编号查找if(result){cout << "查找成功,该职工信息如下:" << endl;result->WorkerDataPtr->Show_Info();}else{cout << "查无此人!" << endl;}break;case 2:cout << "请输入职工姓名:" << endl;cin >> E_name;result = this->Is_ExistWorker(E_name);//姓名查找if(result){cout << "查找成功,该职工信息如下:" << endl;result->WorkerDataPtr->Show_Info();}else{cout << "查无此人!" << endl;}break;  default:cout << "输入错误,查无此人!" << endl;break;   }system("pause");system("cls");
} /********************************************************************************************/
//10.修改职工信息
void WorkerManger::MoD_Worker()
{//1.检查文件是否存在以及是否为空 if(this->Is_Empty_LinkList()){cout << "文件不存在或记录为空,无法查找!" << endl;system("pause");system("cls");return;}//2.用户输入需要需改信息的职工编号int M_id;cout << "请输入职工编号:" << endl;cin >> M_id;//3.查找该职工是否存在WorkerLinkNode* wk = this->Is_ExistWorker(M_id);if(wk) //该职工存在 {//4.1输出提示信息 cout << "查到" << M_id << "号职工" << endl; //4.2开始修改职工信息 string M_name; //创建临时变量存储信息int M_deptId;cout << "输入新姓名:" << endl;cin >> M_name;cout << "输入岗位:" << endl;cout << "1. 普通职工" << endl; cout << "2. 经理" << endl; cout << "3. 老板" << endl; cin >> M_deptId; //4.3根据所输入的职工部门编号,创建相应的链表结点数据域 switch(M_deptId){case 1:wk->WorkerDataPtr = new Employee(M_id, M_name,1);break;case 2:wk->WorkerDataPtr = new Manager(M_id, M_name,2);break;case 3:wk->WorkerDataPtr = new Boss(M_id, M_name,3);break;}}else  //不存在 {cout << "查无此人!" << endl;system("pause");system("cls");return; }system("pause");system("cls");}/********************************************************************************************/
//11.删除职工信息
void WorkerManger::Del_Worker()
{//1.检查文件是否存在以及是否为空 if(this->Is_Empty_LinkList()){cout << "文件不存在或记录为空,无法查找!" << endl;return;}//2.根据用户输入选择对应查找方式 int check_choice = 1;cout << "请输入查找方式:" << endl;cout << "1.按职工编号查找" << endl;cout << "2.按姓名查找" << endl;cin >> check_choice;//3.开始查找 int D_id;string D_name;int D_flag = 0;//标记是否删除职工信息, WorkerLinkNode* result = NULL;switch(check_choice){case 1:cout << "请输入需要删除的职工编号:" << endl;cin >> D_id;result = this->Is_ExistWorker(D_id);//编号查找if(result != NULL){cout << "查找成功,该职工信息如下:" << endl;result->WorkerDataPtr->Show_Info();cout << "确定要删除该职工所有信息?" << endl;cout << "1.确定删除!" << endl;cout << "0.在考虑一下" << endl; cin >> D_flag;if(D_flag==1)//确定删除数据 {//获取被删除结点的前驱节点和后继结点 WorkerLinkNode* pre = NULL;  //前驱节点WorkerLinkNode* suc =NULL;   //后继结点if(this->LinkHeader->next == result)  //1.需要删除的结点为第一个结点 {this->LinkHeader->next = this->LinkHeader->next->next;}else  //2.要删除的结点不是第一个结点 {//2.创建临时指针,用于遍历查找目标职工结点 WorkerLinkNode* temptr = this->LinkHeader->next;//3.开始遍历查找while(temptr->next != result){temptr = temptr->next;}temptr->next = temptr->next->next;//更新尾指针while(temptr->next != NULL){temptr = temptr->next;}this->EndPtr = temptr;this->EndPtr->next = NULL;}this->LinkHeader->worker_num--; //释放空间 delete result->WorkerDataPtr;result->next = NULL;delete result;result = NULL;if(result == NULL){cout << "成功删除该职工结点!" << endl;}else{cout << "删除失败!" << endl;}}else if(D_flag == 0)  //放弃删除数据 {system("pause");system("cls");return;}else{cout << "输入错误!" << endl;system("pause");system("cls");return;}}else{cout << "查无此人!" << endl;}break;case 2:cout << "请输入需要删除的职工姓名:" << endl;cin >> D_name;result = this->Is_ExistWorker(D_name);//姓名查找if(result){cout << "查找成功,该职工信息如下:" << endl;result->WorkerDataPtr->Show_Info();cout << "确定要删除该职工所有信息?" << endl;cout << "1.确定删除!" << endl;cout << "0.在考虑一下" << endl; cin >> D_flag;if(D_flag == 1)//确定删除数据 {//获取被删除结点的前驱节点和后继结点 WorkerLinkNode* pre = NULL;  //前驱节点WorkerLinkNode* suc =NULL;   //后继结点if(this->LinkHeader->next == result)  //1.需要删除的结点为第一个结点 {this->LinkHeader->next = this->LinkHeader->next->next;}else  //2.要删除的结点不是第一个结点 {//2.创建临时指针,用于遍历查找目标职工结点 WorkerLinkNode* temptr = this->LinkHeader->next;//3.开始遍历查找while(temptr->next != result){temptr = temptr->next;}temptr->next = temptr->next->next;}//释放空间 delete result->WorkerDataPtr;delete result;result = NULL;if(result == NULL){cout << "成功删除该职工结点!" << endl;}else{cout << "删除失败!" << endl;}	}else if(D_flag == 0)  //放弃删除数据 {system("pause");system("cls");return;}else{cout << "输入错误!" << endl;system("pause");system("cls");return;}}else{cout << "查无此人!" << endl;}break;  default:cout << "输入错误,查无此人!" << endl;break;   }system("pause");system("cls");
}//12.检查当前链表是否为空 
bool WorkerManger::Is_Empty_LinkList()
{if(this->LinkHeader->next == NULL){return true;}return false;
}/********************************************************************************************/		
//13.排序职工链表及文件数据
void WorkerManger::Sort_Worker() 
{//1.提示用户选择排序方式 int s_choice = 1; cout << "请选择排序方式:" << endl;cout << "1.按职工号进行升序" << endl;cout << "2.按职工号进行降序" << endl;cin >> s_choice;//2.将链表数据存在到临时数组中,便于排序WorkerLinkNode* Array = this->Store_Array();if(s_choice == 1) //升序 {this->Asce_sort(0, this->LinkHeader->worker_num-1, Array);}else if(s_choice == 2) //降序{this->DesE_sort(0, this->LinkHeader->worker_num-1, Array);}else{cout << "输入不合法,无法进行排序!" << endl;}//3.将排序好的数组重新连接成链表this->Recom_Link(Array); cout << "排序完成!" << endl;Array = NULL;system("pause");system("cls");
}	//快速排序算法函数
//14.升序 
void WorkerManger::Asce_sort(int low, int high, WorkerLinkNode* Array)
{int i = low;int j = high;if(i > j){return;}WorkerLinkNode A_temp = Array[low];WorkerLinkNode A_t;while(i != j){//升序 while(Array[j].WorkerDataPtr->W_Id >= A_temp.WorkerDataPtr->W_Id && i < j){j--;}while(Array[j].WorkerDataPtr->W_Id <= A_temp.WorkerDataPtr->W_Id && i < j){i++;}if(i < j){A_t = Array[i];Array[i] = Array[j];Array[j] = A_t;}}Array[low] = Array[i];Array[i] = A_temp;this->Asce_sort(low, i-1, Array);this->Asce_sort(i+1, high, Array);
}//15.降序 
void WorkerManger::DesE_sort(int low, int high, WorkerLinkNode* Array)
{	int i = low;int j = high;if(i > j){return;}WorkerLinkNode D_temp = Array[low];WorkerLinkNode D_t;while(i != j){//升序 while(Array[j].WorkerDataPtr->W_Id <= D_temp.WorkerDataPtr->W_Id && i < j){j--;}while(Array[j].WorkerDataPtr->W_Id >= D_temp.WorkerDataPtr->W_Id && i < j){i++;}if(i < j){D_t = Array[i];Array[i] = Array[j];Array[j] = D_t;}}Array[low] = Array[i];Array[i] = D_temp;this->DesE_sort(low, i-1, Array);this->DesE_sort(i+1, high, Array);
}//16.清空文件数据和链表数据 
void WorkerManger::Clean_File()
{//提示用户是否进行清空操作 int C_choice;cout << "确认清空?" << endl;cout << "1.确认" << endl; cout << "2.返回" << endl;cin >> C_choice; if(C_choice == 2) {system("pause");system("cls");return;}else if(C_choice == 1){//.清空文件存储数据ofstream ofs;ofs.open(EMPFILE, ios::trunc);//2.清空链表数据WorkerLinkNode* C_temp = this->LinkHeader->next;WorkerLinkNode* C_t = NULL;for(int i = 0;i < this->LinkHeader->worker_num;i++) {C_t = C_temp;C_temp = C_temp->next;delete C_t->WorkerDataPtr; //清空结点数据域 C_t->next = NULL;  //结点指针域悬空 }this->LinkHeader->next = NULL;this->EndPtr = NULL;this->LinkHeader->worker_num = 0;cout << "成功清空所有文件数据!" << endl;}else{cout << "输入有误,无法正常操作!" << endl;}system("pause");system("cls");}//17.根据职工编号判断职工是否存在
WorkerLinkNode* WorkerManger::Is_ExistWorker(int E_id)
{	//1.检查文件是否存在以及是否为空 if(this->Is_Empty_LinkList()){cout << "文件不存在或记录为空,无法查找!" << endl;return NULL;}//2.创建临时指针,用于遍历查找目标职工结点 WorkerLinkNode* temptr = this->LinkHeader->next;//3.开始遍历查找while(temptr->WorkerDataPtr->W_Id != E_id){temptr = temptr->next;if(temptr == NULL){return NULL;}}//4.成功找到则返回结点return &(*temptr);
}//18.根据职工姓名判断职工是否存在,并返回结点指针 
WorkerLinkNode* WorkerManger::Is_ExistWorker(string E_name)
{//1.检查文件是否存在以及是否为空 if(this->Is_Empty_LinkList()){cout << "文件不存在或记录为空,无法查找!" << endl;return NULL;}//2.创建临时指针,用于遍历查找目标职工结点 WorkerLinkNode* temptr = this->LinkHeader->next;//3.开始遍历查找 while(temptr->WorkerDataPtr->W_Name != E_name){temptr = temptr->next;if(temptr == NULL){return NULL;}}//4.成功找到则返回结点指针 return &(*temptr);
}/********************************************************************************************/
//19.返回当前数据结点的前驱节点 
WorkerLinkNode* WorkerManger::Get_Pre(WorkerLinkNode* &curr_node)
{//1.检查当前职工数据链表是否存在以及是否为空 if(this->Is_Empty_LinkList()){cout << "数据链表为空,无法查找!" << endl;return NULL;}//2.创建临时指针,用于遍历查找目标职工结点 WorkerLinkNode* temptr = this->LinkHeader->next;//3.检查当前查找的结点是否为链表头结点,为头结点则返回当前结点并输出提示信息 if(temptr == curr_node) {cout << "该结点无前驱节点!" << endl;return NULL; }//4.检查输入的参数结点指针是否为空if(curr_node == NULL){cout << "该结点指针为空,无法查找继结点!" << endl;return NULL;}  //4.开始遍历查找while(temptr->next != curr_node){temptr = temptr->next;if(temptr == NULL){return NULL;//未找到前驱节点则返回空 }}//4.成功找到则返回该结点指针 return &(*temptr);
}/********************************************************************************************/		
//20.返回当前数据结点的后继节点 
WorkerLinkNode* WorkerManger::Get_Suc(WorkerLinkNode* &curr_node)
{//1.检查当前职工数据链表是否存在以及是否为空 if(this->Is_Empty_LinkList()){cout << "数据链表为空,无法查找!" << endl;return NULL;}//2.检查输入的参数结点指针是否为空if(curr_node == NULL){cout << "该结点指针为空,无法查找继结点!" << endl;return NULL;} //2.返回后继结点return curr_node->next;
}	/********************************************************************************************/		
//21.将链表数据存在到临时数组中,便于排序
WorkerLinkNode*  WorkerManger::Store_Array()
{//1.判断链表是否为空 if(this->Is_Empty_LinkList()){cout << "文件不存在或记录为空!" << endl;return NULL; }else{//2.创建临时数组存储节点数据 WorkerLinkNode* S_Array = new WorkerLinkNode[this->LinkHeader->worker_num];//3.开始提取节点数据存入数组 WorkerLinkNode* temp_node = this->LinkHeader->next;//用于提取每个职工的结点数据for(int i = 0;i < this->LinkHeader->worker_num && temp_node != NULL;i++){S_Array[i] = *temp_node;temp_node = temp_node->next;}return S_Array;}} 
/********************************************************************************************/
//22.将排好序的数组数据,连接成链表
WorkerLinkNode* WorkerManger::Recom_Link(WorkerLinkNode* Array)
{for(int i = 0;i < this->LinkHeader->worker_num;i++){if(i != this->LinkHeader->worker_num-1){Array[i].next = &Array[i+1];}else{this->EndPtr = &Array[i];Array[i].next = NULL;}}this->LinkHeader->next = &Array[0]; Array = NULL; 
}/********************************************************************************************/
//23.析构函数 
WorkerManger::~WorkerManger()
{WorkerLinkNode* W_temp = this->LinkHeader->next;while(W_temp != NULL) {delete W_temp->WorkerDataPtr;W_temp = W_temp->next;}delete this->LinkHeader;this->LinkHeader = NULL;
}

2.5  职工管理系统.cpp

#include <iostream>
#include <string>
#include "WorkerMangers.h"
#include "Worker.h"
#include "Employee.h"
#include "Manager.h"
#include "Boss.h"
#include "DataStructType.h"
using namespace std; //使用标准命名空间 //职工管理系统主调函数 
void WorkerManger_System()
{//1.启动程序,创建管理类对象 WorkerManger wm;//2.加载职工数据文件进入链表 wm.Init_WorkerLinkList(); //3.进入程序主流程 while(true){//3.1显示系统菜单 wm.Show_Menu();//3.2提示用户输入选择 int user_choice = 0;cout << "请输入您的选择:" << endl;cin >> user_choice;//3.3根据 user_choice 跳转相应成员方法进行操作 switch(user_choice){case 0://退出系统wm.Exit_System(); break; case 1://添加职工 wm.Add_worker();wm.Save_File(); break;case 2://显示职工 wm.Show_worker();break;case 3://删除职工 wm.Del_Worker(); wm.Save_File();break;case 4://修改职工 wm.MoD_Worker();wm.Save_File();break;case 5://查找职工 wm.FinD_Worker();break;case 6://排序职工wm.Sort_Worker();wm.Save_File();break;case 7://清空文件 wm.Clean_File();break;default:system("cls");break; }}system("pause");
}int main() 
{//调用函数 WorkerManger_System();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/687615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elcomsoft 取证工具包系列:Advanced Office Password Recovery

天津鸿萌科贸发展有限公司是 Elcomsoft 系列软件授权代理商。 Advanced Office Password Recovery 是 Elcomsoft 取证工具包中的密码破解软件之一。它可以恢复、删除或规避使用各种 Office 套件创建的文档的密码。可以对 WordPerfect&#xff0c;Lotus&#xff0c;OpenOffice&…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型等

专属领域论文订阅 VX关注{晓理紫}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 为了答谢各位网友的支持&#xff0c;从今日起免费为…

深入浅出 Python 函数:编写、使用与高级特性详解

引言 在 Python 编程的世界中,函数堪称构建复杂逻辑和模块化程序的基础砖石。它能够帮助程序员组织代码、避免重复,并通过封装逻辑提高代码的可读性和可维护性。本文旨在全方位解析 Python 函数的核心概念,包括基础定义、文档化、默认参数、可选参数、解包参数、关键字仅参…

普中51单片机学习(七)

LED闪烁 delay函数 延时函数 void delay(unsigned int i)//大约延时10us {while(i--); }实验代码 #include "reg52.h" typedef unsigned char u8; typedef unsigned int u16;void delay(u16 i) {while(i--); } sbit ledP2^0;void main(){while(1){led0;delay(10…

深入解析域名短链接生成原理及其在Python/Flask中的实现策略:一篇全面的指南与代码示例

为了构建一个高效且用户友好的域名短链服务&#xff0c;我们可以将项目精简为以下核心功能板块&#xff1a; 1. 用户管理 注册与登录&#xff1a;允许用户创建账户并登录系统。 这部分内容可以参考另一片文章实现&#xff1a; 快速实现用户认证&#xff1a;使用Python和Flask…

【c++设计模式03】创建型1:简单工厂模式(Simple Factory Pattern)

【c设计模式03】创建型1&#xff1a;简单工厂模式&#xff08;Simple Factory Pattern&#xff09; 一、工厂模式二、简单工厂模式三、UML类图四、demo五、使用多态的简单工厂模式1、UML类图——使用多态2、demo——使用多态 原创作者&#xff1a;郑同学的笔记 原创地址&#x…

GAN:“左右互搏”的卷积网络,不断优化性能中

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 在一个名为“卷王”的世界里&#xff0c;有一个传奇般的存在——生成对抗网络&#xff…

解释器设计模式

解释器设计模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种语言的文法&#xff0c;并建立一个解释器来解释该语言中的句子。这种模式通常用于需要解释或执行一种特定类型的语言的场景&#xff0c;例如编程语言的编译器或解释器、…

17. 【Linux教程】查看文件内容

前面小节介绍了文件和目录相关的操作&#xff0c;本小节介绍如何使用 file、cat、more、tail 命令在不同场景下去查看文件相关信息和内容。 1. file 查看文件类型 file 命令可以用来查看文件类型&#xff0c;还能查看文件的编码格式&#xff0c;下面列举一些 file 命令的参数&…

文件上传漏洞--Upload-labs--Pass04--.htaccess绕过

一、什么是 .htaccess 文件 1、官方解释&#xff1a; .htaccess文件主要用于控制Web服务器&#xff08;如Apache&#xff09;的配置&#xff0c;使得无需修改主服务器配置文件即可对特定目录进行访问控制和功能设置。 2、通俗解释&#xff1a; 现有一份 写有恶意代码的 .ph…

[力扣 Hot100]Day28 两数相加

题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都…

计算机网络-数据通信基础

目录 前言 一、数据通信基本概念 二、数据通信相关知识1 总结 前言 正在学习计算机网络体系&#xff0c;把每日所学的知识梳理出来&#xff0c;既能够当作读书笔记&#xff0c;又能分享出来和大家一同学习讨论。 一、数据通信基本概念 基本概念&#xff1a;信源、信道、信宿&…

【LeetCode: 589. N 叉树的前序遍历 + DFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

NBA2K24 精品蔡徐坤面补

NBA2K24 精品蔡徐坤面补 NBA2K23-NBA2K24通用 精品蔡徐坤面补 下载地址&#xff1a; https://www.changyouzuhao.cn/13072.html

精读《What‘s new in javascript》

1. 引言 本周精读的内容是&#xff1a;Google I/O 19。 2019 年 Google I/O 介绍了一些激动人心的 JS 新特性&#xff0c;这些特性有些已经被主流浏览器实现&#xff0c;并支持 polyfill&#xff0c;有些还在草案阶段。 我们可以看到 JS 语言正变得越来越严谨&#xff0c;不…

MySQL导入/导出数据

MySQL导入/导出数据 文章目录 MySQL导入/导出数据一、MySQL 导入数据1、mysql 命令导入2、source 命令导入3、使用 LOAD DATA 导入数据4、使用 mysqlimport 导入数据4.1、mysqlimport的常用选项介绍 二、MySQL 导出数据1、使用 SELECT ... INTO OUTFILE 语句导出数据2、mysqldu…

找座位 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 在一个大型体育场内举办了一场大型活动&#xff0c;由于疫情防控的需要&#xff0c;要求每位观众的必须间隔至少一个空位才允许落座。 现在给出一排观众座位分布…

Nginx 正向代理、反向代理

文章目录 前言1. 正向代理1.1 概念1.2 逻辑图1.3 使用场景 2. 反向代理2.1 概念2.2 逻辑图2.3 使用场景 前言 正向代理主要是用来解决访问限制问题&#xff1b;反向代理则是提供负载均衡、安全防护等作用 1. 正向代理 1.1 概念 正向代理是一个位于客户端和目标服务器之间的代理…

入门OpenCV:图像阈值处理

基本概念 图像阈值是一种简单、高效的图像分割方法&#xff0c;目的是将图像转换成二值图像。这个过程涉及比较像素值和阈值&#xff0c;根据比较结果来确定每个像素点的状态&#xff08;前景或背景&#xff09;。图像阈值在处理二维码、文本识别、物体跟踪等领域中非常有用。…

数据结构第十六天(二叉树层序遍历/广度优先搜索(BFS)/队列使用)

目录 前言 概述 接口 源码 测试函数 运行结果 往期精彩内容 前言 从前的日色变得慢&#xff0c;车&#xff0c;马&#xff0c;邮件都慢&#xff0c;一生,只够爱一个人。 概述 二叉树的层序遍历可以使用广度优先搜索&#xff08;BFS&#xff09;来实现。具体步骤如下&…