链表存储员工信息

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










  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值