C Program to implement Doubly Linked list

Simple C Program to implement Doubly Linked list with following operations:

  • Insertion at end
  • Insertion at front
  • Insert after a value
  • Insert before a value
  • Delete at end
  • Delete at front
  • Delete after a value
  • Delete before a value
  • Delete element itself
  • Delete the whole list
  • Display


Code:


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
 
struct node{
 int data;
 struct node *next;
 struct node *prev;
 };
struct node *head,*tail;
 
void insertend(){
 int val;
 printf("\nEnter the value to be Entered: ");
 scanf("%d",&val);
 struct node *head2;
 head2=head;
 struct node *temp;
 temp=(struct node*)malloc(sizeof(struct node));
 temp->data=val;
 temp->next=NULL;
 temp->prev=NULL;
 
 if(head==NULL){
 head=temp;
 temp->next=head;
 temp->prev=head;
 }
 else{
 while(head2->next!=head){
 head2=head2->next;
 }
 temp->prev=head2;
 temp->next=head;
 head2->next=temp;
 tail=temp;
 head->prev=tail;
 
 }
}
 
void insertf(){
 int val;
 printf("Enter a value to be entered ");
 scanf("%d",&val);
 struct node *temp;
 temp=(struct node*) malloc(sizeof(struct node));
 temp->data=val;
 temp->next=NULL;
 temp->prev=NULL;
 if(head==NULL){
 head=temp;
 }
 else{
 temp->next=head;
 head->prev=temp;
 head=temp;
 head->prev=tail;
 tail->next=head;
 }
}
 
void insertafter(){
 int val,target;
 printf("\nEnter the number after insert: ");
 scanf("%d",&target);
 printf("Enter the value to be inserted: ");
 scanf("%d",&val);
 struct node *head2;
 head2=head;
 struct node *temp;
 temp=(struct node*)malloc(sizeof(struct node));
 temp->data=val;
 temp->next=NULL;
 temp->prev=NULL;
 
 if(head==NULL){
 
 head=temp;
 }
 else{
 
 while(head2->data!=target && head2->next!=head){
 head2=head2->next;
 }
 if(head2->next==head){insertend();}
 else{if(head2->data==target){
 
 temp->prev=head2;
 temp->next=head2->next;
 head2->next->prev=temp;
 head2->next=temp;
 }
 else{printf("\nElement not found!");}
 }
 }
}
 
 
 
void insertbefore(){
 int val,target;
 printf("\nEnter the number before insert: ");
 scanf("%d",&target);
 printf("Enter the value to be inserted: ");
 scanf("%d",&val);
 struct node *head2;
 head2=head;
 struct node *temp;
 temp=(struct node*)malloc(sizeof(struct node));
 temp->data=val;
 temp->next=NULL;
 temp->prev=NULL;
 
 if(head==NULL){
 
 head=temp;
 }
 else if(head->next==head || head->data==target){insertf();}
 else{
 while(head2->next->data!=target && head2->next->next!=head){
 head2=head2->next;
 }
 if(head2->next->data==target){
 temp->prev=head2;
 temp->next=head2->next;
 head2->next->prev=temp;
 head2->next=temp;
 }
 else{printf("Element not found");}
}
}
 
void deleteend(){
 struct node *head2;
 head2=head;
 if(head2->next==head){
 printf("Deletion not possible");
 }
 else{
 while(head2->next->next!=head){
 head2=head2->next;
 }
 struct node *temp;
 temp=head2->next;
 head2->next=head;
 free (temp);
 tail=head2;
 head->prev=tail;
 }
}
 
void deletefront(){
 if(head->next==head){
 printf("Deletion not possible");
 }
 else{
 struct node *temp;
 temp=head;
 head=head->next;
 head->prev=tail;
 free(temp);
 tail->next=head;
 }
}
 
void deleteafter(){
 struct node *head2;
 head2=head;
 int a;
 printf("\nEnter the number after which the number is to be deleed: ");
 scanf("%d",&a);
 if(head==NULL || head->next==head){printf("\nDeletion not possible");}
 else{
 while(head2->data!=a && head2->next!=head){
 head2=head2->next;
 }
 if(head2->data==a){
 if(head2->next==head){deletefront();}
 else{
 struct node *temp;
 temp=head2->next;
 head2->next=temp->next;
 temp->next->prev=head2;
 free(temp);
 }
 }
 else{printf("Element not found");}
}
 }
 
 
 
void deletebefore(){
 struct node *head2;
 head2=head;
 int a;
 printf("\nEnter the number bedore which the number is to be deleed: ");
 scanf("%d",&a);
 if(head2->next==NULL || head==NULL){
 printf("\nDeletion not possible");
 }
 else if(head->data==a){deleteend();}
 else {
 while(head2->next->next->data!=a && head2->next->next->next!=head){
 head2=head2->next;
 }
 if(head2->next->next->data==a){
 
 struct node *temp;
 temp=head2->next;
 head2->next=temp->next;
 temp->next->prev=head2;
 free(temp);
 }
 
 else{printf("Element not found");}
}
}
 
 
void deleteitself(){
 struct node *head2;
 head2=head;
 int a;
 printf("\nEnter the number to be deleted: ");
 scanf("%d",&a);
 if(head2->next==head || head==NULL){
 printf("\nDeletion not possible");
 }
 else if(head->data==a){deletefront();}
 else{
 while(head2->next->data!=a && head2->next->next!=head){
 head2=head2->next;
 }
 if(head2->next->data==a){
 if(head2->next->next==head){deleteend();}
 else{
 struct node *temp;
 temp=head2->next;
 head2->next=temp->next;
 temp->next->prev=head2;
 free(temp);
 }
 }
 else{printf("Element not found");}
 }
}
void deletelist(){
struct node *head2=head;
struct node *temp;
if(head==NULL){printf("Deletion is not possible");}
else{
 while (head2!=head){
 temp=head2;
 head2=head2->next;
 free(temp);
 }
}
head=NULL;
temp=NULL;
}
 
 
void display(){
 if(head==NULL){
 printf("List is empty!");
 }
 else{
 struct node *head2=head;
 printf("\n");
 printf("\t%d",head2->data);
 head2=head2->next;
 while(head2!=head){
 printf("\t%d",head2->data);
 head2=head2->next;
 }
 }
}
 
void displayback(){
 if(head==NULL || tail==NULL){printf("list is empty!");}
 else{
 printf("\t%d",tail->data);
 struct node * tail2;
 tail2=tail;
 tail2=tail2->prev;
 while(tail2!=tail){
 printf("\t%d",tail2->data);
 tail2=tail2->prev;
 }
 }
}
 
 
 
main(){
head=NULL;
 
int opt;
do{
printf("\n1. Insert a number");
printf("\t2. Insert at front");
printf("\t3. Insert after");
printf("\t4. Insert before");
printf("\t5. Delete at end");
printf("\t6. Delete from front");
printf("\t7. Delete after");
printf("\t8. Delete before");
printf("\t9. Delete itself");
printf("\t10. Delete the list");
printf("\t11. Display from front ");
printf("\t12. Display from back");
printf("\t13. Exit");
printf("\nEnter your choice: ");
scanf("%d",&opt);
 
 switch(opt){
 case 1:
 insertend();
 display();
 break;
 case 2:
 insertf();
 display();
 break;
 case 3:
 insertafter();
 display();
 break;
 case 4:
 insertbefore();
 display();
 break;
 case 5:
 deleteend();
 display();
 break;
 case 6:
 deletefront();
 display();
 break;
 case 7:
 deleteafter();
 display();
 break;
 case 8:
 deletebefore();
 display();
 break;
 case 9:
 deleteitself();
 display();
 case 10:
 deletelist();
 display();
 break;
 case 11:
 display();
 break;
 case 12:
 displayback();
 break;
 default:
 break;
 }
}while(opt!=13);
printf("\nEnd");
getch();
}

Comments

Popular posts from this blog

C program to evaluate Prefix Expression using Stack data structure

Java Program to Implement sorting algorithm using TCP on Server application

C++ program to perform data transformation Min-max and Z score Normalization