📜  在C中使用双链表的员工管理系统

📅  最后修改于: 2021-05-25 21:02:16             🧑  作者: Mango

针对以下带有字段的员工数据DLL的操作,设计并实现一个用C语言编写的菜单驱动程序: SSN名称部门名称薪水电话号码

  • 通过末端插入来创建N个员工数据的DLL。
  • 显示DLL的状态并计算其中的节点数。
  • 在DLL末尾执行插入和删除操作。
  • 在DLL的前面执行插入和删除操作。
  • 演示如何将此DLL用作双端队列。

方法:

  • 为了存储雇员的数据,创建一个用户定义数据类型,该数据类型将存储有关雇员的信息。以下是数据类型的声明:
struct node {
    struct node* prev;
    int ssn;
    long int phno;
    float sal;
    char name[20], dept[10], desg[20];
    struct node* next;
}
  • 构建Employee表:构建雇员表的想法是使用上面的struct数据类型,该数据类型将用于存储有关雇员的信息,并且每个新雇员的详细信息都将添加为链接列表节点
  • 删除的记录:由于,一个双向链表来存储数据,因此删除任何索引的数据只是链接旁边下一个被删除的数据和链接中删除的下一个数据前一个节点先前数据的节点。
  • 在记录中搜索:要基于任何参数在记录中搜索,其想法是遍历数据,如果值参数在任何索引处与存储的记录匹配,则打印该员工的所有信息。

以下是C语言程序,用于使用双链表来说明雇主的详细信息:

C
// C-program to demonstrate employer
// details using a Doubly-linked list
#include 
#include 
#include 
#include 
  
// Global declaration
int count = 0;
  
// Structure declaration
struct node {
    struct node* prev;
    int ssn;
    long int phno;
    float sal;
    char name[20], dept[10], desg[20];
    struct node* next;
} * h, *temp, *temp1, *temp2, *temp4;
  
// Function to create node
void create()
{
    int ssn;
    long int phno;
    float sal;
    char name[20], dept[10], desg[20];
    temp = (struct node*)malloc(sizeof(struct node));
    temp->prev = NULL;
    temp->next = NULL;
    printf("\n enter ssn, name, depart"
           "ment, designation, salary "
           "and phno of employee:\n");
    scanf("%d %s %s %s %f %ld",
          &ssn, name, dept, desg,
          &sal, &phno);
    temp->ssn = ssn;
    strcpy(temp->name, name);
    strcpy(temp->dept, dept);
    strcpy(temp->desg, desg);
    temp->sal = sal;
    temp->phno = phno;
    count++;
}
  
// Function to insert at beginning
void insertbeg()
{
    // If DLL is empty
    if (h == NULL) {
        create();
        h = temp;
        temp1 = h;
    }
  
    // Else create a new node and
    // update the links
    else {
        create();
        temp->next = h;
        h->prev = temp;
        h = temp;
    }
}
  
// Function to insert at end
void insertend()
{
    // If DLL is empty
    if (h == NULL) {
        create();
        h = temp;
        temp1 = h;
    }
  
    // Else create a new node and
    // update the links
    else {
        create();
        temp1->next = temp;
        temp->prev = temp1;
        temp1 = temp;
    }
}
  
// Function to display from beginning
void displaybeg()
{
    temp2 = h;
    if (temp2 == NULL) {
        printf("\n list is empty\n");
        return;
    }
    printf("\n linked list elements "
           "from beginning:\n");
    while (temp2 != NULL) {
        printf("%d %s %s %s %f %ld\n",
               temp2->ssn, temp2->name,
               temp2->dept, temp2->desg,
               temp2->sal, temp2->phno);
        temp2 = temp2->next;
    }
  
    // Print the count
    printf("number of employees=%d", count);
}
  
// Function to delete at end
int deleteend()
{
    struct node* temp;
    temp = h;
    if (temp == NULL) {
        printf("list is empty\n");
        return 0;
    }
    if (temp->next == NULL) {
        printf("%d %s %s %s %f %ld\n",
               temp->ssn, temp->name,
               temp->dept, temp->desg,
               temp->sal, temp->phno);
        free(temp);
        h = NULL;
    }
    else {
        temp = temp1;
        temp2 = temp1->prev;
        temp2->next = NULL;
        printf("%d %s %s %s %f %ld\n",
               temp->ssn, temp->name,
               temp->dept, temp->desg,
               temp->sal, temp->phno);
        free(temp);
        temp1 = temp2;
    }
    count--;
    return 0;
}
  
// Function to delete from beginning
int deletebeg()
{
    struct node* temp;
    temp = h;
    if (temp == NULL) {
        printf("list is empty\n");
        return 0;
    }
    if (temp->next == NULL) {
        printf("%d %s %s %s %f %ld\n",
               temp->ssn, temp->name,
               temp->dept, temp->desg,
               temp->sal, temp->phno);
        free(temp);
        h = NULL;
    }
    else {
        h = h->next;
        h->prev = NULL;
        printf("%d %s %s %s %f %ld\n",
               temp->ssn, temp->name,
               temp->dept, temp->desg,
               temp->sal, temp->phno);
        free(temp);
    }
    count--;
    return 0;
}
  
// Function displaying menus
void employerDetails()
{
    int ch, n, i;
    h = NULL;
    temp = temp1 = NULL;
    printf("--------Menu------------\n");
    printf("\n 1.create a DLL of n emp");
    printf("\n 2.display from beginning");
    printf("\n 3.insert at end");
    printf("\n 4.delete at end");
    printf("\n 5.insert at beginning");
    printf("\n 6.delete at beginning");
    printf("\n 7.to show DLL as queue");
    printf("\n 8.exit\n");
    printf("----------------------\n");
    while (1) {
        printf("\n enter choice : ");
        scanf("%d", &ch);
  
        // Switch statements begins
        switch (ch) {
        case 1:
            printf("\n enter number of"
                   " employees:");
            scanf("%d", &n);
            for (i = 0; i < n; i++)
                insertend();
            break;
        case 2:
            displaybeg();
            break;
        case 3:
            insertend();
            break;
        case 4:
            deleteend();
            break;
        case 5:
            insertbeg();
            break;
        case 6:
            deletebeg();
            break;
        case 7:
            printf(
                "\n to show DLL as queue"
                " \n1.perform insert and"
                " deletion operation by "
                "calling insertbeg() and "
                "deleteend() respectvely\n "
                "\t OR \n 2.perform insert "
                "and delete operations by 
                "calling  insertend() and "
                "deletebeg() respectively\n");
            break;
        case 8:
            exit(0);
        default:
            printf("wrong choice\n");
        }
    }
}
  
// Driver Code
int main()
{
    // Function Call
    employerDetails();
  
    return 0;
}


输出:

解释:

  • create(): create()函数使用动态内存分配(即,使用malloc()函数)创建双向链表节点。数据插入到它,如姓名部门指定工资,PHNO。进入临时节点。
  • insertbeg():此函数用于将节点插入到双向链表的开头。在此函数,如果h == NULL表示列表完全为空,则需要创建一个新节点。否则,请创建一个节点并将其插入到开头。然后将此节点设为新的临时节点。
  • insertend():此函数用于在双链表的末尾插入节点。在此函数,如果h == NULL表示列表完全为空,则需要创建一个新节点。否则,将此温度插入到temp1节点之后,最后将temp分配为temp1以供将来使用。
  • displaybeg():此函数用于从头开始显示列表的元素。这也有助于了解员工人数。
  • deleteend():此函数对于从头删除节点很有用。由于内存是为节点动态分配的,因此需要显式编写函数以释放节点,这是通过使用free(temp)完成的
  • deletebeg():此函数对于从头开始删除节点很有用。由于已为节点动态分配内存,因此需要显式编写该函数以释放节点,这是通过使用free(temp)完成的
  • 主要的(): 这是驱动整个程序的主要函数。它使用switch语句来运行运行成功程序所需的所有功能。

如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。