1、场景: HR需要做⼀个员工管理,每当新员工入职,他需要新建该员工的资料,将其添加到员工管理数据库中,随后老板向HR了解该员工详细信息时, HR要能从系统中调出资料供老板查阅。此外,如果有员工离职, HR为其办理离职⼿续后要将他的资料从系统中删除。
2、员工资料包括:工号(不超过16个字符)、姓名、性别、年龄、岗位名称。
3、实现上述场景。并支持按照工号或姓名查找员工信息。
4、本次作业主要考察队列的使用,无需实现外部动态添加、删除、查找员工。各位同学可在代码中使用全局变量定义一组员工数据,然后实现添加、查找和删除。请使用printf将每一步结果打印出来。
5、使用C语言编程,并在linux下编译和运行。请使用gdb调试你的程序。
6、给定以下结构定义:
typedefstruct __node__ NODE;
struct__node__
{
NODE *next;
NODE *prev;
}
Typedefstruct
{
NODE head;
} DLIST;代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define POSITION_LEN (int)64
#define USER_NAME_LEN (int)32
#define WORK_NUMBER_LEN (int)32
#define SEX_LEN (int)32
typedef struct __node__ NODE;
struct __node__
{
NODE *next;
NODE *prev;
};
typedef struct
{
NODE head;
} DLIST;
/*定义员工信息数据结构*/
typedef struct member_info
{
NODE *addr;
char WorkNumber[WORK_NUMBER_LEN];
char Name[USER_NAME_LEN];
char Position[POSITION_LEN];
char Sex[SEX_LEN];
int Age;
}T_member_info;
/*待录入员工信息*/
T_member_info g_CompanyMember1 = {NULL,"z110","Zhang","SoftWare_Engineer","MAN",25 };
T_member_info g_CompanyMember2 = {NULL,"z112","Zhao","SoftWare_Engineer","WOMAN",28 };
T_member_info g_CompanyMember3 = {NULL,"s115","Song","SoftWare_Engineer","Man",22 };
T_member_info g_CompanyMember4 = {NULL,"w113","Wang","SoftWare_Engineer","WOMAN",21 };
T_member_info g_CompanyMember5 = {NULL,"l111","Liu","SoftWare_Engineer","WOMAN",25 };
T_member_info g_CompanyMember6 = {NULL,"l117","Li","SoftWare_Engineer","Man",24 };
T_member_info g_CompanyMember7 = {NULL,"g116","Guo","SoftWare_Engineer","WOMAN",26 };
T_member_info g_CompanyMember8 = {NULL,"y114","Yang","SoftWare_Engineer","Man",27 };
DLIST CompanyMemList;
void MemInfoPrintf(NODE *listPoint) /*员工信息打印*/
{
T_member_info *memInfo;
memInfo = (T_member_info*)(listPoint);
printf("%s ", memInfo->WorkNumber);
printf("%s ", memInfo->Name);
printf("%s ", memInfo->Position);
printf("%s ", memInfo->Sex);
printf("%d\n", memInfo->Age);
}
void MemListInit() /*员工信息表初始化*/
{
CompanyMemList.head.next = NULL;
CompanyMemList.head.prev = NULL;
}
T_member_info *nodeCreat(T_member_info *memAddr) /*创建链表节点*/
{
T_member_info *p;
p = (T_member_info *)malloc(sizeof(T_member_info));
//p->addr = memAddr->addr;
p->Age = memAddr->Age;
strncpy(p->Name,memAddr->Name,(strlen(memAddr->Name)+1));
strncpy(p->WorkNumber,memAddr->WorkNumber,(strlen(memAddr->WorkNumber) + 1));
strncpy(p->Position, memAddr->Position, (strlen(memAddr->Position) + 1));
strncpy(p->Sex, memAddr->Sex, (strlen(memAddr->Sex) + 1));
return p;
}
void MemInfoAdd(T_member_info *memAddr) /*添加员工信息*/
{
NODE *p=NULL;
p = CompanyMemList.head.next;
/*链表为空则在表头添加成员*/
if (NULL==p)
{
CompanyMemList.head.next =(NODE*)memAddr;
p = CompanyMemList.head.next;
p->next = NULL;
}
else
{
while (NULL!=p->next)
{
p = p->next;
}
p->next = (NODE*)memAddr;
p = p->next;
p->next = NULL;
}
}
void memInfoQuery(char*name, char*workNum) /*根据工号或姓名查询员工信息*/
{
NODE *p = NULL;
p = CompanyMemList.head.next;
T_member_info *memInfo;
int findFlag;
findFlag = 0;
while((NULL != p) && (0 == findFlag))
{
memInfo = (T_member_info*)(p);
if (NULL != name) /* 姓名不为空则以名字进行查询*/
{
if ((0 != strcmp(memInfo->Name, name)))
{
p = p->next;
}
else
{
printf("The Found MemInfo:");
printf("%s ", memInfo->Name);
printf("%s ", memInfo->WorkNumber);
printf("%s ", memInfo->Position);
printf("%d\n", memInfo->Age);
findFlag = 1;
return;
}
}
else if (NULL != workNum) /*姓名为空,工号不为空,则以工号进行查询*/
{
if ((0 != strcmp(memInfo->WorkNumber, workNum)))
{
p = p->next;
}
else
{
printf("--------------------------------------------\n");
printf("The Found MemInfo:\n");
printf("%s ", memInfo->Name);
printf("%s ", memInfo->WorkNumber);
printf("%s ", memInfo->Position);
printf("%s ", memInfo->Sex);
printf("%d\n", memInfo->Age);
findFlag = 1;
return;
}
}
}
if ((NULL==p) &&(0==findFlag)) /*未查询到员工信息*/
{
printf("Not Find the Member!!\n");
}
}
void MemInfoDel(char*name, char*workNum) /*根据输入的工号或姓名删除员工信息*/
{
NODE *p,*q;
p = NULL;
q = NULL;
int delFlag=0;
p = CompanyMemList.head.next;
T_member_info *memInfo,*nextMeminfo;
while ((NULL != p) && (0 == delFlag))
{
q = p->next;
memInfo = (T_member_info*)(p);
nextMeminfo = (T_member_info*)(q);
if (NULL!=q) /*链表中有一个以上成员*/
{
if (NULL != name) /* 姓名不为空则以名字进行查询*/
{
if ((0 == strcmp(memInfo->Name, name))) /*删除的成员为链表表头成员*/
{
CompanyMemList.head.next=p->next;
free(p); /*删除的成员*/
p = CompanyMemList.head.next;
delFlag = 1; /*将删除标志位置一*/
printf("--------------------------------------------\n");
printf("Have already delete the:%s\n",memInfo->Name);
return;
}
else if ((0 != strcmp(memInfo->Name, name)) && (0 == strcmp(nextMeminfo->Name, name)))
{
p->next = q->next;
free(nextMeminfo);
delFlag = 1;
printf("--------------------------------------------\n");
printf("Have already delete the:%s\n",nextMeminfo->Name);
return;
}
else
{
p = p->next;
}
}
else if (NULL != workNum) /*姓名为空,工号不为空,则以工号进行查询*/
{
if ((0 == strcmp(memInfo->WorkNumber, workNum)))
{
CompanyMemList.head.next = p->next;
free(p);
p = CompanyMemList.head.next;
}
else if ((0 != strcmp(memInfo->WorkNumber, workNum)) && (0 == strcmp(nextMeminfo->WorkNumber, workNum)))
{
p->next = q->next;
free(nextMeminfo);
delFlag =1;
printf("--------------------------------------------\n");
printf("Have already delete the:%s\n",nextMeminfo->Name);
return;
}
else
{
p = p->next;
}
}
}
else if ((NULL ==q) && (0 == delFlag)) /*链表中只有一个成员*/
{
if ((0 == strcmp(memInfo->Name, name))) /*删除的成员为链表表头成员*/
{
CompanyMemList.head.next=p->next;
free(p); /*删除的成员*/
p = CompanyMemList.head.next;
delFlag = 1; /*将删除标志位置1*/
printf("--------------------------------------------\n");
printf("Have already delete the:%s\n",memInfo->Name);
return;
}
else
{
printf("Have No This Member!!\n");
return;
}
}
}
}
void main()
{
MemListInit();
T_member_info *memNode=NULL;
/*添加成员信息*/
memNode = nodeCreat(&g_CompanyMember1);
MemInfoAdd(memNode);
memNode = nodeCreat(&g_CompanyMember2);
MemInfoAdd(memNode);
memNode = nodeCreat(&g_CompanyMember6);
MemInfoAdd(memNode);
memNode = nodeCreat(&g_CompanyMember7);
MemInfoAdd(memNode);
NODE *p = NULL;
p = CompanyMemList.head.next;
/*打印当前员工信息列表*/
printf("--------------------------------------------\n");
printf("Current Member List:\n");
while (NULL != p)
{
MemInfoPrintf(p);
p = p->next;
}
memInfoQuery(NULL,"l117");/*用工号查询成员*/
/*删除成员Zhang*/
MemInfoDel("Zhang", NULL);
/*打印删除操作后员工信息列表*/
printf("-------------------------------------------\n");
printf("The Member List after Deleting Operation:\n");
p = CompanyMemList.head.next;
while (NULL != p)
{
MemInfoPrintf(p);
p = p->next;
}
printf("--------------------------------------------\n");
}