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

1.头文件.h 部分:

1.1  Worker.h

/*

	这是一个抽象的职工父类,以下类都继承自该类:
	1.Employee类 
	2.Manager类 
	3.Boss类 

*/

#pragma once  
#include  
#include
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  //包含标准输入输出流 
#include
#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  //包含标准输入输出流 
#include
#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  //包含标准输入输出流 
#include
#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  //包含标准输入输出流 
#include
#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 
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 
#include 
#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;
}

你可能感兴趣的:(C++基于多态的职工管理系统,c++,开发语言)