数据结构之用单链表的应用实现

如何用单链表完成一个员工管理系统

前言

本人是一个不知名本科院校的学生,如有同校的学弟学妹看到了本篇文章(该项作业),可无偿奉献。若有新的想法思路可私聊交流,毕竟能力有限(此刻留下了没技术的泪水)。对了,本文章是我进入CSDN一年以来第一篇分享的作品,有不足之处欢迎指正。就先不低声吟唱了,进入正题吧!

首先看看基本要求是什么吧!

1.增加一个职工信息;
2.显示所有职工信息;
3.按部门名称分类显示该部门所有职工信息;
4.按部门显示各部门职工工资总额;
5.删除职工信息(可以删除符合条件的一批记录)
6.按职称调整工资;

一、单链表是什么?

在开始编程前,咱们得知道原理。不知道大家刚学单链表的时候是什么样的感受呢,反正我起先是被那个什么next指针的删除给整不会了。尤其在用rear进行尾插的时候,总是忘了rear=某某指针。这里咱就用最基础的尾插吧,不过不用rear,直接创建两个指针就行(后面代码会有所体现,这里不多赘述)
这里有一个可以参考的文章,不熟悉单链表的小伙伴可以点击看看呢
单链表基础知识详解——基本概念结构及函数实现(增删查改)

二、实现过程

先创建两个类:Stuff和LNode

typedef struct Stuff 
{
	string num;
	string name;
	string depa;
	string title;
	int wage;				//以上变量可按照需求删改
}Stuff;
 
typedef struct LNode 
{
	Stuff data;
	struct LNode *next;
	int size=0;
}LNode, *LinkList;

创建主函数 int main()

 int main()
{
	system("color f3");//这里可以根据自己的喜好更改运行界面的颜色(不改也不耽误跑代码)
	LinkList L;
	InitList(L);
	//这里提供菜单栏给各位(有了菜单栏,是不是心里美汁汁0.0)

		cout<<"                       ***************************欢迎使用阿震的员工管理系统**********************"<<endl; 
		cout<<"                       **                                                                       **"<<endl;
		cout<<"                       **                        1.创建员工信息列表                             **"<<endl; 
		cout<<"                       **                        2.插入员工信息                                 **"<<endl; 
		cout<<"                       **                        3.删除员工信息                                 **"<<endl;
		cout<<"                       **                        4.按部门输出该部门所有员工                     **"<<endl;
		cout<<"                       **                        5.按部门输出该部门工资总额                     **"<<endl;
		cout<<"                       **                        6.按部门职称调整员工工资                       **"<<endl;
		cout<<"                       **                        7.按员工序号升序排序                           **"<<endl;
		cout<<"                       **                        8.用文档保存员工信息                           **"<<endl;
		cout<<"                       **                        0.退出                                         **"<<endl; 
	    cout<<"                       **                                                                       **"<<endl; 	
	    cout<<"                       ***************************欢迎使用阿震的员工管理系统**********************"<<endl;
}
//可用while循环实现重复操作

三、函数调用

1.初始化链表

int InitList(LinkList &L) 
{
	L = new LNode;
	L->next = NULL;
	return 1;
}

2.插入数据

int ListInsert(LinkList &L, int location, Stuff &e) 
{	//本函数是插入链表的任意位置,其中的位置序号与要员工工号不等价
	LNode *p;
	int j = 0;
	p = L;
	
	while (p&&j < location - 1) 
	{
		p = p->next;
		j++;
	}
	if (!p || j > location - 1) 
	{
		return 0;
	}
	
	LNode *s;
	s = new LNode;
	s->data = e;              //数据要有
	s->next = p->next;
	p->next = s;
	L->size++;
	return 1;
}

3.删除员工信息

int ListDelete(LinkList &L, int location, Stuff &e) 
{	//这里是删除指定员工的信息,并不是删除一批连续的记录
	LNode *p;
	int j = 0,t=1;
	p = L;
	
	while (p->next&&j < location - 1) 
	{
		p = p->next;
		j++;
	}
	if (!(p->next) || j > location - 1) 
	{
		t=0;
	}
	LNode *q;
	q = p->next;
	p->next = q->next;
	e = q->data; 
	delete q;
	return t;
}

4.按部门输出员工信息

void getdep(LinkList &L)
{ 	//用数组进行辅助转化,但有一定的局限性,由于作业时间限制,不能完善,如有时间我会加以修改
	LNode *q;
	q=L->next;
	string m[100],n[100],aa[100],bb[100],cc[100],dd[100],s="78546424";//这里s是用来挑出部门的
	int ee[100];
	for(int i=0;i<L->size;i++)//将原部门全部复制给m数组 
	{
		m[i]=q->data.depa;
		cc[i]=m[i];
		aa[i]=q->data.num;
		bb[i]=q->data.name;
		dd[i]=q->data.title;
		ee[i]=q->data.wage;
		q=q->next;
	}
	//这里使用for循环进行部门筛选,相信已经有一大批的小伙伴已经能顺着我的思路往下走了,这里我就不给出具体代码了,下面给出了输出的代码。
	cout<<"按部门输出员工如下所示:"<<endl;
    cout<<"|       序号     |      姓名      |      部门      |      职称       |       工资      |"<<endl;
	cout<<"---------------------------------------------------------------------------------------------"<<endl; 
	for(int i=0;i<L->size;i++)
	{
		for(int j=0;j<L->size;j++)
		{
			if(n[i]==cc[j])
			{
				cout<<"\t"<<aa[j]<<"\t\t"<<bb[j]<<"\t\t"<<cc[j]<<"\t\t"<<dd[j]<<"\t\t"<<ee[j]<<endl;
			}
		}
	}
	cout<<"----------------------------------------------------------------------------------------------"<<endl;
	cout<<endl;
	
	cout<<"是否详细查看某部门的所有员工?"<<endl;
	cout<<"1=yes     0=no"<<endl;
	int o;
	cin>>o;
	cout<<endl;
	if(o)
	{		//这里的better函数可以自己试试看完成,其实不难的,嘿嘿。
		void better(LinkList &L,string aa[],string bb[],string cc[],string dd[],int ee[]);
		better(L,aa,bb,cc,dd,ee);	
	} 
}

上述代码中,链表的赋值调用好像只能进行一次,若在同一函数中使用两次大概率会出错(亲测有效!.!)。剩余的函数基本上也是这个思路,若有疑问,可私聊。

5.部分结果展示
总菜单
存入数据
插入数据
删除数据
按部门输出员工信息
查询某部门详细员工信息

总结

本文并不是提供代码的文章,只是提供思路,若有更好的算法可留言互相学习交流。对于剩余未实现的功能若有疑惑,也可留言(看见必回)。
参考文章链接:https://blog.csdn.net/m0_56808122/article/details/120822151

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是阿震li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值