如何用单链表完成一个员工管理系统
前言
本人是一个不知名本科院校的学生,如有同校的学弟学妹看到了本篇文章(该项作业),可无偿奉献。若有新的想法思路可私聊交流,毕竟能力有限(此刻留下了没技术的泪水)。对了,本文章是我进入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