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"); }