Система управления сотрудниками с использованием двусвязного списка на C

Опубликовано: 21 Января, 2022

Разработка и реализация программы управляемый с помощью меню в C для операций ниже по DLL данных сотрудников с полями: ПКР, имя, отдел, назначение, зарплата, номер телефона:

  • Создайте DLL данных N сотрудников, используя вставку конца.
  • Отобразите состояние DLL и подсчитайте количество узлов в ней.
  • Выполните вставку и удаление в конце DLL.
  • Выполняйте вставку и удаление перед DLL.
  • Продемонстрируйте, как эту DLL можно использовать в качестве двусторонней очереди.

Подход:

  • Для хранения данных сотрудника создайте тип данных, определяемый пользователем, в котором будет храниться информация о сотруднике. Ниже приведено объявление типа данных:
 struct node {
    struct node * prev;
    int ssn;
    длинный int phno;
    float sal;
    имя символа [20], отдел [10], дизайн [20];
    struct node * next;
}
  • Создание таблицы сотрудника: для создания таблицы сотрудников идея состоит в том, чтобы использовать приведенный выше тип данных структуры, который будет использоваться для хранения информации о сотруднике, и данные каждого нового сотрудника будут добавлены в виде узла связанного списка .
  • Удаление в записи: поскольку для хранения данных используется двусвязный список, поэтому для удаления данных по любому индексу просто свяжите следующий за следующим из удаленных данных и свяжите предыдущий узел следующих данных удаленных узел к его предыдущим данным .
  • Поиск в записи: для поиска в записи на основе любого параметра идея состоит в том, чтобы просмотреть данные и, если по любому индексу параметры значения совпадают с сохраненной записью, распечатать всю информацию об этом сотруднике.

Below is the C-program to demonstrate employers details using a Doubly Linked List:

C

// C-program to demonstrate employer
// details using a Doubly-linked list
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
  
// 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(" enter ssn, name, depart"
           "ment, designation, salary "
           "and phno of employee: ");
    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(" list is empty ");
        return;
    }
    printf(" linked list elements "
           "from beginning: ");
    while (temp2 != NULL) {
        printf("%d %s %s %s %f %ld ",
               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 ");
        return 0;
    }
    if (temp->next == NULL) {
        printf("%d %s %s %s %f %ld ",
               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 ",
               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 ");
        return 0;
    }
    if (temp->next == NULL) {
        printf("%d %s %s %s %f %ld ",
               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 ",
               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------------ ");
    printf(" 1.create a DLL of n emp");
    printf(" 2.display from beginning");
    printf(" 3.insert at end");
    printf(" 4.delete at end");
    printf(" 5.insert at beginning");
    printf(" 6.delete at beginning");
    printf(" 7.to show DLL as queue");
    printf(" 8.exit ");
    printf("---------------------- ");
    while (1) {
        printf(" enter choice : ");
        scanf("%d", &ch);
  
        // Switch statements begins
        switch (ch) {
        case 1:
            printf(" 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(
                " to show DLL as queue"
                " 1.perform insert and"
                " deletion operation by "
                "calling insertbeg() and "
                "deleteend() respectvely "
                " OR 2.perform insert "
                "and delete operations by 
                "calling  insertend() and "
                "deletebeg() respectively ");
            break;
        case 8:
            exit(0);
        default:
            printf("wrong choice ");
        }
    }
}
  
// Driver Code
int main()
{
    // Function Call
    employerDetails();
  
    return 0;
}

Выход:

Объяснение:

  • create (): функция create () создает узел двусвязного списка с использованием динамического распределения памяти, то есть с помощью функции malloc (). Данные вставляются в него , такие как имя, отдел, назначение, зарплата, Phno. во временный узел.
  • insertbeg (): эта функция используется для вставки узла в начало двусвязного списка. В этой функции, если h == NULL означает, что список полностью пуст, поэтому необходимо создать новый узел. В противном случае создайте узел и вставьте его в начало. Затем сделайте этот узел новым временным узлом.
  • inserttend (): эта функция используется для вставки узла в конец двусвязного списка. В этой функции, если h == NULL означает, что список полностью пуст, поэтому необходимо создать новый узел. В противном случае, вставьте этот temp после узла temp1, наконец, назначьте temp как temp1 для будущего использования.
  • displaybeg (): эта функция используется для отображения элементов списка с самого начала. Это также помогает узнать количество сотрудников.
  • deleteend (): эта функция полезна для удаления узла с конца. Поскольку память для узла выделяется динамически, необходимо явно написать функцию для освобождения узла, что выполняется с помощью free (temp) .
  • deletebeg (): эта функция полезна для удаления узла с самого начала. Поскольку память выделяется для узла динамически, необходимо явно написать функцию для освобождения узла, которая выполняется с помощью free (temp) .
  • главный(): Это основная функция, управляющая всей программой. Он использует операторы switch для управления всеми функциями, необходимыми для успешного выполнения программы.

Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .

Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.