Home > OS >  How to write a function to update linked list and print updated list?
How to write a function to update linked list and print updated list?

Time:08-09

I have written a code to enter the name, age, department id, company name, and salary respectively, of employees from a text file into a linked list. I have made an insert function to insert employee details into a linked list and a display function to display the linked list. I need help in creating a function to add a new member to my list and print the new list. I'm having trouble understanding how to add a new node to the list and display the updated list (like what pointers to use..). I have already made a function for updatefile where Im asking for user input but I didnt call the function to the main yet. If someone can show me how to code it that will be a big help. Thanks!

Here are the details of the file, it is called employee.txt:

Peter 30 1001 Apple 8000
Joseph 50 1002 Oracle 4000
Mary 40 1003 Samsung 6000
Lilly 40 1203 Samsung 7000
Tony 50 1002 Oracle 3000
Jake 30 1005 Apple 3000
Sam 40 1007 Samsung 4000
Lisa 30 1300 Oracle 5000
Kate 50 1200 Apple 6000
Rick 50 1313 Apple 4000

My code : '''

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    struct personTag {
        char name[20];
        int age;
    };

    struct officialTag {
        int deptId;
        char cmpName[20];
        double salary;
    };

    struct employeeTag {
        struct personTag personalInfo;
        struct officialTag officialInfo;
        struct employeeTag *next;
    };

    typedef struct employeeTag EmpTag;
    typedef EmpTag *EmpTagPtr;

    typedef struct personTag person;
    typedef struct officialTag official;


    void insert(EmpTagPtr *s, char E_name[], int E_age, int E_deptid, char E_cmpname[], double 
    E_salary);
    void displayEmployees(EmpTagPtr s);
    void updateFile(char E_name[], int E_age, int E_deptid, char E_cmpname[], double 
    E_salary);


    int main() {
        EmpTagPtr start = NULL;

        char E_name[20];
        int E_age;
        int E_deptid;
        char E_cmpname[20];
        double E_salary;

        // reading employee.txt file
        FILE *fp;
        fp = fopen("employee.txt", "r");
        //fp = stdin;

        while (fscanf(fp, "s %d %d s %lf", E_name, &E_age, &E_deptid, E_cmpname, 
    &E_salary) == 5) 
        {
            insert(&start, E_name, E_age, E_deptid, E_cmpname, E_salary);
        }

        fclose(fp);



        displayEmployees(start);



        return 0;
    }

    void insert(EmpTagPtr *s, char E_name[], int E_age, int E_deptid, char E_cmpname[], double 
    E_salary) 
    {

        // create an empty node
        EmpTagPtr newNode = malloc(sizeof *newNode);

        // filling in the values
        strcpy(newNode->personalInfo.name, E_name);
        newNode->personalInfo.age = E_age;

        newNode->officialInfo.deptId = E_deptid;
        strcpy(newNode->officialInfo.cmpName, E_cmpname);
        newNode->officialInfo.salary = E_salary;

        while (*s && strcmp(newNode->personalInfo.name, (*s)->personalInfo.name) > 0) 
        {
            s = &(*s)->next;
        }

        // `s` now points at the `EmpTagPtr` pointer where the new node should be inserted:
        newNode->next = *s;
        *s = newNode;
    }

    void displayEmployees(EmpTagPtr s) 
    {
        EmpTagPtr current = s;

        while (current != NULL) {
            // printing the data part
            printf("Employee name:    %s\n", current->personalInfo.name);
            printf("Company name:     %s\n", current->officialInfo.cmpName);
            printf("Employee Age:     %d\n", current->personalInfo.age);
            printf("Department ID:    %d\n", current->officialInfo.deptId);
            printf("Employee Salary:  %.2lf\n", current->officialInfo.salary);
            printf("---------------------------------------------------------\n");
            current = current->next;  // move foward the current pointer
        }

        printf("NULL\n");
        fflush(stdout);
    }

    void updateFile(char E_name[], int E_age, int E_deptid, char E_cmpname[], double E_salary)
    {

        // writing to employee.txt file
        FILE *fp;
        fp = fopen("employee.txt", "w");
        //fp = stdin;

        printf("Enter Employee name :");
        scanf("%s",E_name);
        printf("\n");

        printf("Enter Company name  :");
        scanf("%s",E_cmpname);
        printf("\n");

        printf("Enter Employee Age  :");
        scanf("%d",&E_age);
        printf("\n");

        printf("Enter Department ID :");
        scanf("%d",E_deptid);
        printf("\n");

        printf("Enter Employee Salary :");
        scanf("%lf",E_salary);

        fclose(fp);
    }

'''

CodePudding user response:

As @Allan_Wind suggested, I edited the updateFile() function as follows:

void updateFile(EmpTagPtr *s) //Function declaration needs to be updated to.
{
    char E_name[20];
    int E_age;
    int E_deptid;
    char E_cmpname[20];
    double E_salary;

    // writing to employee.txt file
    FILE *fp;
    fp = fopen("employee.txt", "r ");
    // fp = stdin;

    printf("\n");
    printf("Enter Employee name :");
    scanf("%s", E_name);

    printf("Enter Company name  :");
    scanf("%s", E_cmpname);

    printf("Enter Employee Age  :");
    scanf("%d", &E_age);

    printf("Enter Department ID :");
    scanf("%d", &E_deptid);

    printf("Enter Employee Salary :");
    scanf("%lf", &E_salary);

    insert(s, E_name, E_age, E_deptid, E_cmpname, E_salary);
    fprintf(fp, "s %d %d s %lf", E_name, E_age, E_deptid, E_cmpname, E_salary);
    fclose(fp);
}

Since you didn't include freeing the allocated memory, I added the following function:

 void deallocateLinkedList(EmpTagPtr *listHead){
    while(*listHead != NULL){
        EmpTagPtr holder = *listHead;
        *listHead = (*listHead)->next;
        free(holder);
        holder = NULL;
    }
}
  • Related