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

📅  最后修改于: 2021-09-02 06:32:22             🧑  作者: Mango

设计并实现了在C语言的菜单驱动程序下面的员工数据的使用领域的DLL操作: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;
}
  • 构建员工表:构建员工表的想法是使用上述结构数据类型,该数据类型将用于存储有关员工的信息,并且每个新员工的详细信息都将作为链表节点添加。
  • 删除的记录:由于,一个双向链表来存储数据,因此删除任何索引的数据只是链接旁边下一个被删除的数据和链接中删除的下一个数据前一个节点节点到其先前的数据
  • 在记录中搜索:对于基于任何参数在记录中搜索,其思想是遍历数据,如果在任何索引处的值参数与存储的记录匹配,则打印该员工的所有信息。

以下是使用双向链表展示雇主详细信息的 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表示列表完全为空,因此需要创建一个新节点。否则,将这个 temp 插入到 temp1 节点之后,最后将 temp 指定为 temp1 以备将来使用。
  • displaybeg():该函数用于从头开始显示列表的元素。它还有助于了解员工人数。
  • deleteend():这个函数对于从末尾删除节点很有用。由于内存是为节点动态分配的,因此需要显式编写函数来释放节点,这是通过使用free(temp) 完成的
  • deletebeg():这个函数对于从头开始删除节点很有用 由于内存是为节点动态分配的,所以需要显式编写函数来释放节点,这是通过使用free(temp) 完成的
  • 主要的(): 这是驱动整个程序的主要函数。它使用 switch 语句来操作运行成功程序所需的所有功能。

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live