1. 程式人生 > >連結串列儲存員工資訊

連結串列儲存員工資訊

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