Search code examples
clinked-listdoubly-linked-list

How to add & delete node in Double Linked List with C Language?


I have 3 struct Node :

struct Student{
    char id[255];
    char name[255];
    float gpa;
};
struct Elemen{
    struct Student *mhs;
    struct Elemen *next;
};
struct List{
    struct Elemen *first;
};

If I add data to the student node, the data that has been added can't be more with the code as below :

int main() 
{ 
    head = (struct List*)malloc(sizeof(struct List));   
    after = (struct List*)malloc(sizeof(struct List));  
    last = (struct List*)malloc(sizeof(struct List));
    
    after->first = (struct Elemen*)malloc(sizeof(struct Elemen));
    head->first = (struct Elemen*)malloc(sizeof(struct Elemen));
    last->first = (struct Elemen*)malloc(sizeof(struct Elemen));
  
    after->first->next = (struct Elemen*)malloc(sizeof(struct Elemen));
    head->first->next = (struct Elemen*)malloc(sizeof(struct Elemen));
    last->first->next = (struct Elemen*)malloc(sizeof(struct Elemen));
  
    after->first->mhs = (struct Student*)malloc(sizeof(struct Student));
    head->first->mhs = (struct Student*)malloc(sizeof(struct Student));
    last->first->mhs = (struct Student*)malloc(sizeof(struct Student));
    
    strcpy(head->first->mhs->id, "1"); 
    strcpy(head->first->mhs->name, "Student 1"); 
    head->first->mhs->gpa = 4;
    head->first->next = after->first;
    
    strcpy(after->first->mhs->id, "2"); 
    strcpy(after->first->mhs->name, "Student 2");
    after->first->mhs->gpa = 5;
    after->first->next = last->first;
    
    strcpy(last->first->mhs->id, "3"); 
    strcpy(last->first->mhs->name, "Student 3");
    last->first->mhs->gpa = 6;
    last->first->next = NULL;
    
    printAllElemen(head);
    return 0; 
}

void printAllElemen(struct List *e){
    printf("ID\t|Name\t|GPA\n");
    while(e->first != NULL)
    {
        printf("%s\t|%s\t|%.2f\n", e->first->mhs->id, e->first->mhs->name, e->first->mhs->gpa);
        e->first = e->first->next;
    }
}

examples of procedures like this :

void addFirst(char id[], char name[], float gpa, struct List *e);
void addAfter(struct Elemen *prev, char id[], char name[], float gpa, struct List *e);
void addLast(char id[], char name[], float gpa, struct List *e);
void deleteFirst(struct List *e);
void deleteAfter(struct Elemen *prev, struct List *e);
void deleteLast(struct List *e);

My problem is how to add data nodes functionally and the data can be more than 1 in the node list?

Thanks


Solution

  • Rewrite code here.

        void addFirst(const char *id, const char *name, float gpa, struct List *e);
            void addAfter(struct Elemen *prev, const char *id, const char *name, float gpa, struct List *e);
            void addLast(const char *id, const char *name, float gpa, struct List *e);
            void deleteFirst(struct List *e);
            void deleteAfter(struct Elemen *prev, struct List *e);
            void deleteLast(struct List *e);
            
            
            void addFirst(const char *id, const char *name, float gpa, struct List *e){
                struct Elemen*newE = (struct Elemen*)malloc(sizeof(struct Elemen));
                newE->mhs = (struct Student*)malloc(sizeof(struct Student));
                strcpy(newE->mhs->id, id);
                strcpy(newE->mhs->name,name);
                newE->mhs->gpa = gpa;
                newE->next = e->first->next;
                e->first = newE;
            }
            void addAfter(struct Elemen *prev, const char *id, const char *name, float gpa, struct List *e){
                struct Elemen*newE = (struct Elemen*)malloc(sizeof(struct Elemen));
                newE->mhs = (struct Student*)malloc(sizeof(struct Student));
                strcpy(newE->mhs->id, id);
                strcpy(newE->mhs->name,name);
                newE->mhs->gpa = gpa;
                newE->next = 0;
                struct Elemen*ptr = e->first;
                if(ptr == 0){ // emptry list
                    e->first = newE;
                    return;
                }
                while(ptr != prev) ptr = ptr->next;
                newE->next = ptr->next;
                ptr->next = newE;
            }
            
            void addLast(const char *id, const char *name, float gpa, struct List *e){
                struct Elemen*newE = (struct Elemen*)malloc(sizeof(struct Elemen));
                newE->mhs = (struct Student*)malloc(sizeof(struct Student));
                strcpy(newE->mhs->id, id);
                strcpy(newE->mhs->name,name);
                newE->mhs->gpa = gpa;
                newE->next = 0;
                // insert new node
                struct Elemen *ptr = e->first;
                if(ptr == 0){ // there are no nodes in list.
                    e->first = newE;
                }else{
                    while(ptr->next != 0) ptr = ptr->next; // find last node
                    ptr->next = newE;
                }
            }
            void deleteFirst(struct List *e){
                if(e->first == 0) return; // empty list
                struct Elemen*firptr = e->first;
                e->first = e->first->next;
                free(firptr);
            }
            void deleteAfter(struct Elemen *prev, struct List *e){
                struct Elemen*ptr = e->first;
                if(ptr == 0){ // emptry list
                    return;
                }
                while((ptr != prev) && ptr->next != 0) ptr = ptr->next;
                
                Elemen*ptr1 = ptr->next;
                ptr->next = ptr->next->next;
                free(ptr1);
            }
            void deleteLast(struct List *e){
                struct Elemen*ptr = e->first;
                struct Elemen*prev = ptr;
                if(ptr == 0){ // emptry list
                    return;
                }
                if(ptr->next == 0) {
    free(e->first);e->first = 0;return;
    } // only first node exists.
                while((ptr->next != 0) { prev = ptr;ptr = ptr->next;}
                free(ptr);
                prev->next = 0;
                
            }
            
            void printAllElemen(struct List *e){
                printf("ID\t|Name\t|GPA\n");
                struct Elemen*ptr = e->first;
                while(ptr != 0)
                {
                    printf("%s\t|%s\t|%.2f\n", ptr->mhs->id, ptr->mhs->name, ptr->mhs->gpa);
                   ptr = ptr->next;
                }
            }
            
            
            
            
            int main(){
            struct List*mList = (struct List*)malloc(sizeof(struct List));
            mList->first = 0;
            addFirst("1", "stud1", 4, mList);
            addLast("2", "std2", 5, mList);
            addLast("3", "std3", 6, mList);
            printAllElemen(head);
            return 0; 
            }