Write a program to implement double link list.
Implement
- Add node at the beginning of the linked list
- Add node at the end of the linked list
- Add node at the middle(sort it) of the linked list
- Delete the Node at given position
- Delete the Node from beginning
- Delete the Node at from end
- Delete all nodes
- Print Nodes
- Print Nodes in reverse
- Count nodes of the linked list
Structure, header file and main function used is
#include<stdio.h> #include<stdlib.h> #define PR printf("1] Add 2] Print 3] Count 4] RPrint 5] Delete all 6] Delete_node 0] Exit\n"); typedef struct DoubleLinkList { struct DoubleLinkList *prev; int num; struct DoubleLinkList *next; }DLL; int main() { DLL *hp = 0; int op,n; PR scanf("%d",&op); while(op != 0) { switch(op) { case 1: printf("Enter Number = "); scanf("%d",&n); //add_begin(n,&hp); add_middle(n,&hp); //add_end(n,&hp); break; case 2: print(hp); break; case 3: printf("Count = %d\n",count(hp)); break; case 4: reverse_print(hp); break; case 5: delete_all(&hp); break; case 6: printf("Enter Number = "); scanf("%d",&n); //delete_begin(&hp); //delete_end(&hp); delete_node(n,&hp); break; default: printf("Invalid Option\n"); } PR scanf("%d",&op); } return 0; }
Function definitions are given below.
//Add node at the beginning of the linked list void add_begin(int n,DLL** p) { DLL *p1; p1 = (DLL*)malloc(sizeof(DLL)); p1->num = n; p1->prev = 0; p1->next = 0; if(*p == 0) { *p = p1; } else { p1->next = (*p); (*p)->prev = p1; *p = p1; } } //Add node at the middle(sort it) of the linked list void add_middle(int n,DLL**p) { DLL *p1,*p2; p1 = (DLL*)malloc(sizeof(DLL)); p1->num = n; p1->prev = 0; p1->next = 0; if(*p == 0) { *p = p1; } else if(p1->num < (*p)-> num) { p1->next = *p; (*p)->prev = p1; *p = p1; } else { p2 = *p; while(p2) { if(p2->next == 0) { p1->prev = p2; p2->next = p1; break; } else if(p1->num < p2->next->num) { p1->next = p2->next; p1->prev = p2; //p2->next->prev = p1; p2->next = p1; break; } p2 = p2->next; } } } //Add node at the end of the linked list void add_end(int n,DLL **p) { DLL *p1,*p2; p1 = (DLL*)malloc(sizeof(DLL)); p1->num = n; p1->prev = 0; p1->next = 0; if(*p == 0) { *p = p1; } else { p2 = *p; while(p2->next) p2 = p2->next; p2->next = p1; p1->prev = p2; } } //Delete the Node at given position void delete_node(int n,DLL**p) { DLL *p1,*p2; p1 = *p; int i; if(n < 1 || n > count(*p)) { printf("Invalid POsition\n"); return; } else if(*p == 0) { printf("Empty list\n\n"); return; } if(n == 1) { p1 = *p; *p = (*p)->next; (*p)->prev = p1; free(p1); return; } p1 = p2 = *p; for(i = 1;i < n;i++) { p2 = p1; p1 = p1->next; } p2->next = p1->next; p1->next->prev = p2; free(p1); } //Delete the Node from beginning void delete_begin(DLL**p) { if(*p == 0) { printf("Empty list\n"); return; } else if((*p)->next == 0) { free(*p); *p = 0; return; } DLL *p1; p1 = *p; *p = p1->next; (*p)->prev = NULL; free(p1); } //Delete the Node at from end void delete_end(DLL**p) { if(*p == 0) { printf("Empty List\n"); return; } else if((*p)->next == 0) { free(*p); *p = 0; return; } DLL *p1,*p2; p1 = *p; p2 = *p; while(p1->next) { p2 = p1; p1 = p1->next; } p2->next = 0; free(p1); } //Delete all nodes void delete_all(DLL **p) { DLL *p1; p1 = *p; while(p1) { *p = p1->next; free(p1); p1 = *p; } } //Print Nodes void print(DLL*p) { while(p) { printf("%d ",p->num); p = p->next; } printf("\n"); } //Print Nodes in reverse void reverse_print(DLL*p) { while(p->next) p = p->next; while(p) { printf("%d ",p->num); p = p->prev; } printf("\n"); } //Count nodes of the linked list int count(DLL*p) { unsigned int c = 0; while(p) { c++; p = p->next; } return c; }