⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emp_mng.h

📁 用链表实现职工管理的软件
💻 H
字号:
#include <iostream.h>
#include <iomanip.h>


////////////////////////
//   职工信息         //
////////////////////////
struct emp_info
{   
	int id;		//编号
	int age;	//年龄
	int sex;	//性别,0为女,1为男
};


////////////////////////
//   链表的一个结点   //
////////////////////////
struct emp_node
{
	emp_info data;
	emp_node *next;
};


//////////////////////////////////////////////////////////////////////////////////////////////////
//函数:show_all
//功能:输出全部职工信息
//参数:h:链表头结点指针
//////////////////////////////////////////////////////////////////////////////////////////////////
void show_all(emp_node *h)
{
	const int L=10;
	if(!h)
	{
		cout<<"目前没有职工\n\n";
		return;
	}

	cout << setw(L) << "编号" << setw(L) << "年龄" << setw(L) << "性别" << endl;
	for(;h;h=h->next)
	{
		cout << setw(L) << h->data.id << setw(L) << h->data.age ;
		if(h->data.sex==0)
			cout << setw(L) << "女";
		else
			cout << setw(L) << "男";
		cout<<endl;
	}
	cout<<endl;
}


//////////////////////////////////////////////////////////////////////////////////////////////////
//函数:sum_by_sex
//功能:统计出男女职工人数
//参数:h:链表头结点指针
//		male_num:男职工人数
//		female_num:女职工人数
//////////////////////////////////////////////////////////////////////////////////////////////////
void sum_by_sex(emp_node *h, int &male_num, int &female_num)
{
	male_num=0;
	female_num=0;

	if(!h) return;

	for(;h;h=h->next)
	{
		if(h->data.sex)
			male_num++;
		else
			female_num++;
	}
}


//////////////////////////////////////////////////////////////////////////////////////////////////
//函数:insert
//功能:在尾部插入新职工结点
//参数:h:链表头结点指针
//		eid:新职工的编号
//		eage:新职工的年龄
//		esex:新职工的性别
//返回值:链表头结点指针
//////////////////////////////////////////////////////////////////////////////////////////////////
void insert(emp_node *&h,const int eid,const int eage,const int esex)
{
	emp_node *p=h;//把头结点地址保存到p,用p逐个检查链表中的结点
	emp_node *s=new(emp_node);//生成新结点
	s->data.id=eid;   //给新结点数据成员赋值
	s->data.age=eage;
	s->data.sex=esex;
	s->next=NULL;

	if(!p)
	{ //p=h=\0,说明刚开始建立连表的头结点
		h=s;//将刚建立的连表的头结点的地址赋给头结点指针
		return;
	}

	for(; p->next; p=p->next);//当p->next=\0 时,指针p为尾结点的成员
	p->next=s;//将新生成的结点加入到连表尾
}


//////////////////////////////////////////////////////////////////////////////////////////////////
//函数:del_by_id
//功能:删除指定编号的职工
//参数:h:链表头结点指针
//		eid:被删职工的编号
//返回值:操作是否成功
//////////////////////////////////////////////////////////////////////////////////////////////////
int del_by_id(emp_node *&h,int eid)
{
	emp_node *p=h;//从头开始查找

	if(!p) return 0;//没有职工,删除不成功,返回0
	
	if(p->data.id==eid)//找到要删除的职工结点为头结点
	{
		h=p->next;//把被删除结点的下一个结点作为头结点
		delete p;//删除结点

		return 1;//删除成功,返回1
	}

	for(;p->next;p=p->next)	//注意开始p为表头,头结点不是被删除结点,
		//且存在至少两个结点,继续检查下一个结点
		if(p->next->data.id==eid)//下一个结点是要删除的结点,
			//最快第2个结点是要删除结点
		{
			emp_node *tp=p->next;//保存被删除结点地址
			p->next=p->next->next;//把被删除结点的前一个结点的
			//指针成员指向被删除结点的下一个结点
			p=p->next;//保存当前用于查找的指针p的位置
			delete tp;	//删除结点					
			return 1;
		}

	return 0;//没有符合条件职工
}


//////////////////////////////////////////////////////////////////////////////////////////////////
//函数:retire
//功能:删除年龄在60岁以上的男性职工或55岁以上的女性职工,把被删除结点保存在另一个链表中
//参数:h:链表头结点指针
//		retire_list:保存退休职工的链表
//////////////////////////////////////////////////////////////////////////////////////////////////
void retire(emp_node *&h, emp_node *&retire_list)
{
	emp_node *p=h,*pr=retire_list,*q=NULL;

	if(pr)//已被删除结点链表非空
		for(;pr->next;pr=pr->next);//找到已被删除的结点组成的链表的尾部

	while(p)
	{//女55岁退休,男60岁退休
		if( p->data.sex==0 && p->data.age>=55 || p->data.sex==1 && p->data.age>=60 )
		{
			if(p==h)//最快头结点退休
				h=h->next;//继续查下一个是否退休
			else
				q->next=p->next;//头结点不退休,查下一结点

			if(!pr)//
				pr=retire_list=p;
			else
				pr=pr->next=p;
			p=pr->next;
			continue;
		}
		q=p;p=p->next;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -