C++与数据结构实现简单人事管理系统

这篇博客介绍了如何使用链表结构实现员工信息的管理,包括录入、修改、删除、查询和显示所有员工信息的功能。通过创建一个结构体定义员工的数据字段,并使用前插法插入数据,动态分配内存。此外,还提供了保存员工信息到文件和释放链表资源的函数。博客展示了链表在数据处理中的灵活性。
摘要由CSDN通过智能技术生成

一、问题描述

二、解题思路与源码

在这里我们要处理多个数据,如果使用数组就一定要对其大小进行定义,这在数据处理过程中显得极为不方便,所以我们使用链表。单链表是一种链式存取的数据结构,每个结点既存取数据元素本身的信息(数据域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;
}

三、结果展示 

录入单个员工信息

修改单个员工信息及显示所有员工信息

删除单个员工信息

查询单个员工信息

  • 8
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值