Doubly Linked List - deletion

Deleting the First Node from a Doubly Linked List
Step 1: If the linked list is empthy (START == NULL)
Write "Sorry Buddy list is Empthy"
Step 2: If the linked list have only one node (START -> NEXT == NULL)
free(START)
START = NULL
Step 3: If the list have more than one node
PTR = START;
START = START -> NEXT;
START -> PREV = NULL;
free(PTR);
Step 4 : EXIT
Deleting the last node from a Doubly Linked List
Step 1: If the linked list is empthy (START == NULL)
Write "Sorry Buddy list is Empthy"
Step 2: If the linked list have only one node (START == START -> NEXT)
free(START)
START = NULL
Step 3: If the list have more than one node
PTR = START
while(PTR -> NEXT != NULL)
{
PTR = PTR -> NEXT
}
PTR -> PREV -> NEXT = NULL
free(PTR)
Step 4 : EXIT
Deleting a Specific Node from the Doubly linked list
Step 1: If linked list is empthy (START == NULL)
Write "Sorry Buddy there is no node "
Step 2: Enter the position (POS) of node u want to delete & count total no of node
totalnode = countnode()
if(POS > totalnode )
Write "Given node not found in the list!"
Step 3: Ensure that enter postion is in between first and last node
IF( POS > 1 && POS < totalnode)
Step 4: Store the starting address in PTR & move the PTR pointer upto specified position
PTR = START;
MOVE = 1;
while(MOVE < POS)
{
PTR = PTR->NEXT;
MOVE++;
}
PTR -> NEXT -> PREV = PTR -> PREV;
PTR -> PREV -> NEXT = PTR -> NEXT;
free(PTR);
Write "Node deleted successfuly..."
[END OF IF]
ELSE
Write "Position is invalid "
Step 5 : EXIT
C Program to Implement Doubly Linked List
# include <stdio.h>
# include <conio.h>
#include <malloc.h>
# include <stdlib.h>
struct Doubly_Linked_List
{
struct Doubly_Linked_List *prev;
int data;
struct Doubly_Linked_List *next;
};
typedef struct Doubly_Linked_List node;
node *start = NULL;
node* createnode()
{
node * newnode;
newnode = (node *) malloc(sizeof(node));
printf("\n Enter the data : ");
scanf("%d", &newnode -> data);
newnode -> next = NULL;
newnode -> prev = NULL;
return newnode;
}
void create_Doubly_Linked_List(int n)
{
int i;
node *newnode , *ptr;
for(i = 0; i < n; i++)
{
newnode = createnode();
if(start == NULL)
{
start = newnode;
}
else
{
ptr = start;
while(ptr -> next != NULL)
{
ptr = ptr -> next;
}
ptr -> next = newnode;
newnode -> prev = ptr ;
}
}
}
void insert_beg()
{
node *newnode ,*ptr;
newnode = createnode();
if(start == NULL)
{
start = newnode;
}
else
{
newnode -> next = start;
start -> prev = newnode;
start = newnode;
}
}
void insert_end()
{
node *newnode, *ptr;
newnode = createnode();
if(start == NULL)
{
start = newnode;
}
else
{
ptr = start;
while(ptr -> next != NULL)
{
ptr = ptr -> next;
}
ptr -> next = newnode;
newnode -> prev = ptr;
}
}
int countnode(node *ptr)
{
int num_of_node=0;
while(ptr != NULL)
{
num_of_node++;
ptr = ptr -> next;
}
return (num_of_node);
}
void insert_mid()
{
node *newnode, *ptr, *preptr;
int pos, totalnode, move = 1;
printf("\n Enter the position where u want to insert the node : ");
scanf("%d", &pos);
totalnode = countnode(start);
if(pos > 1 && pos < totalnode)
{
newnode = createnode();
ptr = start;
while(move < pos-1)
{
ptr = ptr -> next;
move++;
}
newnode -> next = ptr -> next ;
newnode -> prev = ptr ;
ptr -> next -> prev = newnode;
ptr -> next = newnode ;
}
else
printf("\n\t position %d is not a middle position", pos);
}
void delete_beg()
{
node *ptr;
if(start == NULL)
{
printf("\n Sorry Buddy there is no node... List is Empty");
return ;
}
else if(start->next == NULL)
{
free(start);
start=NULL;
printf("\n Node deleted successfuly... ");
}
else
{
ptr = start;
start = start -> next;
start -> prev = NULL ;
free(ptr);
printf("\n Node deleted successfuly... ");
}
}
void delete_last()
{
node *ptr, *temp;
if(start == NULL)
{
printf("\n Sorry Buddy there is no node ...List is Empty");
return ;
}
else if(start->next == NULL)
{
free(start);
start=NULL;
printf("\n Node deleted successfuly... ");
}
else
{
ptr = start;
while(ptr -> next != NULL)
{
ptr = ptr -> next;
}
ptr -> prev -> next = NULL;
free(ptr);
printf("\n Node deleted successfuly... ");
}
}
void delete_mid()
{
node *ptr;
int pos, totalnode, move = 1;
if(start == NULL)
{
printf("\n Sorry Buddy there is no node... List is Empty");
return ;
}
else
{
printf("\n Enter position of node u want to delete: ");
scanf("%d", &pos);
totalnode = countnode(start);
if(pos > totalnode)
{
printf("\n There is no such node found in the list!");
}
if(pos > 1 && pos < totalnode)
{
ptr = start;
while(move < pos)
{
ptr = ptr -> next;
move ++;
}
ptr -> next -> prev = ptr -> prev;
ptr -> prev -> next = ptr -> next;
free(ptr);
printf("\n Node deleted successfuly...");
}
else
{
printf("\n Position is invalid... ");
getch();
}
}
}
void display_List()
{
node *ptr;
ptr = start;
printf("\n The contents of Doubly_Linked_List : \n");
if(start == NULL)
{
printf("\n Sorry Buddy there is no node... List is Empty");
return;
}
else
{
while(ptr != NULL)
{
printf(" %d <-- -->", ptr -> data);
ptr = ptr -> next;
}
printf(" X ");
}
}
int menu()
{
int choice;
printf("\n --------Doubly Linked List -------\n");
printf("\n 1. Create a list ");
printf("\n 2. Display the list");
printf("\n----------------------------------");
printf("\n 3.Insert a new node at beginning ");
printf("\n 4.Insert a new node at end");
printf("\n 5.Insert a new node at middle");
printf("\n---------------------------------");
printf("\n 6.Delete a node from the beginning");
printf("\n 7.Delete a node from the Last");
printf("\n 8.Delete a node from the Middle");
printf("\n-----------------------------------");
printf("\n 9. Count total no of nodes ");
printf("\n 10. Exit ");
printf("\n\n Enter your choice : ");
scanf("%d",&choice);
return choice;
}
int main()
{
int choice, n;
while(1)
{
choice = menu();
switch(choice)
{
case 1: if(start == NULL)
{
printf("\n Enter number of nodes you want to create: ");
scanf("%d", &n);
create_Doubly_Linked_List(n);
printf("\n List created successfuly..");
}
else
printf("\n List is already created..");
break;
case 2: display_List(); break;
case 3: insert_beg(); break;
case 4: insert_end(); break;
case 5: insert_mid(); break;
case 6: delete_beg(); break;
case 7: delete_last(); break;
case 8: delete_mid(); break;
case 9: printf("\n Total number of nodes : %d ", countnode(start));
break;
case 10 : exit(0);
}
getch();
}
}
0 Comment to "Doubly Linked List - node deletion algorithm "
Post a Comment