In computer science, a doubly-linked list is a linked data structure that consists of a set of sequentially linked records called nodes. Each node contains two fields, called links, that are references to the previous and to the next node in the sequence of nodes. The beginning and ending nodes’ previous and next links, respectively, point to some kind of terminator, typically a sentinel node or null, to facilitate traversal of the list. If there is only one sentinel node, then the list is circularly linked via the sentinel node. It can be conceptualized as two singly linked lists formed from the same data items, but in opposite sequential orders.
The two node links allow traversal of the list in either direction. While adding or removing a node in a doubly-linked list requires changing more links than the same operations on a singly linked list, the operations are simpler and potentially more efficient (for nodes other than first nodes) because there is no need to keep track of the previous node during traversal or no need to traverse the list to find the previous node, so that its link can be modified.
#include<stdio.h> #include<conio.h> #include<stdlib.h> struct node { struct node *previous; int data; struct node *next; }*head, *last; void insert_begning(int value) { struct node *var,*temp; var=(struct node *)malloc(sizeof(struct node)); var->data=value; if(head==NULL) { head=var; head->previous=NULL; head->next=NULL; last=head; } else { temp=var; temp->previous=NULL; temp->next=head; head->previous=temp; head=temp; } } void insert_end(int value) { struct node *var,*temp; var=(struct node *)malloc(sizeof(struct node)); var->data=value; if(head==NULL) { head=var; head->previous=NULL; head->next=NULL; last=head; } else { last=head; while(last!=NULL) { temp=last; last=last->next; } last=var; temp->next=last; last->previous=temp; last->next=NULL; } } int insert_after(int value, int loc) { struct node *temp,*var,*temp1; var=(struct node *)malloc(sizeof(struct node)); var->data=value; if(head==NULL) { head=var; head->previous=NULL; head->next=NULL; } else { temp=head; while(temp!=NULL && temp->data!=loc) { temp=temp->next; } if(temp==NULL) { printf("n%d is not present in list ",loc); } else { temp1=temp->next; temp->next=var; var->previous=temp; var->next=temp1; temp1->previous=var; } } last=head; while(last->next!=NULL) { last=last->next; } } int delete_from_end() { struct node *temp; temp=last; if(temp->previous==NULL) { free(temp); head=NULL; last=NULL; return 0; } printf("nData deleted from list is %d n",last->data); last=temp->previous; last->next=NULL; free(temp); return 0; } int delete_from_middle(int value) { struct node *temp,*var,*t, *temp1; temp=head; while(temp!=NULL) { if(temp->data == value) { if(temp->previous==NULL) { free(temp); head=NULL; last=NULL; return 0; } else { var->next=temp1; temp1->previous=var; free(temp); return 0; } } else { var=temp; temp=temp->next; temp1=temp->next; } } printf("data deleted from list is %d",value); } void display() { struct node *temp; temp=head; if(temp==NULL) { printf("List is Empty"); } while(temp!=NULL) { printf("-> %d ",temp->data); temp=temp->next; } } int main() { int value, i, loc; head=NULL; printf("Select the choice of operation on link list"); printf("n1.) insert at begningn2.) insert at atn3.) insert at middle"); printf("n4.) delete from endn5.) reverse the link listn6.) display listn7.)exit"); while(1) { printf("nnenter the choice of operation you want to do "); scanf("%d",&i); switch(i) { case 1: { printf("enter the value you want to insert in node "); scanf("%d",&value); insert_begning(value); display(); break; } case 2: { printf("enter the value you want to insert in node at last "); scanf("%d",&value); insert_end(value); display(); break; } case 3: { printf("after which data you want to insert data "); scanf("%d",&loc); printf("enter the data you want to insert in list "); scanf("%d",&value); insert_after(value,loc); display(); break; } case 4: { delete_from_end(); display(); break; } case 5: { printf("enter the value you want to delete"); scanf("%d",value); delete_from_middle(value); display(); break; } case 6 : { display(); break; } case 7 : { exit(0); break; } } } printf("nn%d",last->data); display(); getch(); }