Implementation of linked list deletion operation:
Linked List:
A linear data structure where each element denotes a separate object is known as linked list.
- Each element of a list contains two items, the data and a pointer to next node.
- The last node would point to null.
- The “head” denotes point of entry into a linked list.
- If list is empty then the head is a null pointer.
- The structure of linked list is given below:
/*************************************************************
* This program demonstrates deletion of linked list *
* nodes corresponding to positions obtained from *
* two linked lists *
*************************************************************/
Explanation of Solution
Program:
//Include header files
#include<iostream>
using namespace std;
//Declare an array "la[]"
int la[100], i=0;
//Define a linked list node
struct lnode
{
//Define data of node
int ldata;
//Define pointer to next node
lnode *lnext;
}*start;
/*Function Prototypes */
lnode *lcreate_node(int lvalue);
void lsortedInsert(struct lnode** head_ref, struct lnode* lnew_node);
void ldisplay(struct lnode* head);
void ldeleteKey(struct lnode **head_ref, int lkey);
void merge(struct lnode *p, struct lnode **q);
struct lnode* lSortedMerge(struct lnode* la, struct lnode* lb);
void lFBS(struct lnode* lsource, struct lnode** frontRef, struct lnode** backRef);
/* Function "lcreate_node()" creates la new node, allocates the memory space and puts the data in it */
struct lnode *lcreate_node(int lnew_data)
{
//Allocate lnode
struct lnode* lnew_node = (struct lnode*) malloc(sizeof(struct lnode));
// Put in the ldata
lnew_node->ldata = lnew_data;
//Make the next of new node to NULL
lnew_node->lnext = NULL;
//Return the new node
return lnew_node;
}
//Define "merge()" that merges two linked lists
void merge(struct lnode *p, struct lnode **q)
{
//Declare nodes of type "lnode*"
struct lnode *lp_curr = p, *lq_curr = *q;
struct lnode *lp_next, *lq_next;
// Loop until positions are available
while (lp_curr != NULL && lq_curr != NULL)
{
// Save the next pointers
lp_next = lp_curr->lnext;
lq_next = lq_curr->lnext;
// Make lq_curr as next of lp_curr
lq_curr->lnext = lp_next;
lp_curr->lnext = lq_curr;
// Update the pointers
lp_curr = lp_next;
lq_curr = lq_next;
}
// Update second list's head pointer
*q = lq_curr;
}
//Define a function "MergeSort()" that sorts linked list by changing next pointers
void MergeSort(struct lnode** headRef)
{
//Declare nodes of type "lnode*"
struct lnode* head = *headRef;
struct lnode* la;
struct lnode* lb;
//If linked list is empty or has single element
if ((head == NULL) || (head->lnext == NULL))
{
return;
}
// Split head into sublists
lFBS(head, &la, &lb);
// Sort sublists
MergeSort(&la);
MergeSort(&lb);
// Merge lists that are sorted
*headRef = lSortedMerge(la, lb);
}
/*Define a function "lFBS()" that divides the list into two halves and returns refernce parameters of result*/
void lFBS(struct lnode* lsource, struct lnode** frontRef, struct lnode** backRef)
{
//Declare nodes "fast" and "slow" of type "lnode*"
struct lnode* fast;
struct lnode* slow;
//If list is empty or contains single element
if (lsource==NULL || lsource->lnext==NULL)
{
//If length < 2
*frontRef = lsource;
*backRef = NULL;
}
else
{
//If list contains more than one element
slow = lsource;
fast = lsource->lnext;
/* Traverse "fast" two nodes, and traverse "slow" one node */
while (fast != NULL)
{
//Traverse the "fast"
fast = fast->lnext;
/* Traverse the list until "fast" reaches null */
if (fast != NULL)
{
//Move to next element
slow = slow->lnext;
fast = fast->lnext;
}
}
/* "slow" is before list's midpoint, split it in two at that point. */
*frontRef = lsource;
*backRef = slow->lnext;
slow->lnext = NULL;
}
}
/* Define a function "lSortedMerge()" that merges the lists that are sorted, it takes header pointers of two lists as arguments */
struct lnode* lSortedMerge(struct lnode* la, struct lnode* lb)
{
//Declare node to store result
struct lnode* result = NULL;
//If either of list is empty
if (la == NULL)
return(lb);
else if (lb==NULL)
return(la);
//Chose either la or lb, and recur
if (la->ldata <= lb->ldata)
{
//Place "la" first
result = la;
//Continue with next element of "la" and "lb"
result->lnext = lSortedMerge(la->lnext, lb);
}
else
{
//place "lb" first
result = lb;
//Continue with next element of "lb" and "la"
result->lnext = lSortedMerge(la, lb->lnext);
}
//Return result
return(result);
}
//Define a main function
int main()
{
//Initialize variables
start = NULL;
//Make the head reference of new node to NULL
struct lnode* head = NULL;
//Insert first node into linked list
struct lnode *lnew_node = lcreate_node(5);
/*Call the function "lsortedInsert()" with "head" and "lnew_node" as arguments and inserts the node into it.*/
lsortedInsert(&head, lnew_node);
lnew_node = lcreate_node(10);
lsortedInsert(&head, lnew_node);
lnew_node = lcreate_node(20);
lsortedInsert(&head, lnew_node);
lnew_node = lcreate_node(30);
lsortedInsert(&head, lnew_node);
lnew_node = lcreate_node(40);
lsortedInsert(&head, lnew_node);
lnew_node = lcreate_node(50);
lsortedInsert(&head, lnew_node);
lnew_node = lcreate_node(60);
lsortedInsert(&head, lnew_node);
lnew_node = lcreate_node(70);
lsortedInsert(&head, lnew_node);
lnew_node = lcreate_node(80);
//Display the elements of list
cout<<"Elements of first list are: "<<endl;
//Call the function "ldisplay()" to display elements.
ldisplay(head);
//Make the head reference of new node to NULL
struct lnode* head1 = NULL;
//Insert the first node into linked list
struct lnode *new_node1 = lcreate_node(3);
lsortedInsert(&head1, new_node1);
/*Call the function "lsortedInsert()" with "head1" and "new_node1" as arguments and inserts the node into it.*/
new_node1 = lcreate_node(1);
lsortedInsert(&head1, new_node1);
new_node1 = lcreate_node(2);
lsortedInsert(&head1, new_node1);
//Display elements of linked list
cout<<"Elements of second list are: "<<endl;
ldisplay(head1);
//Make the head reference of new node to NULL
struct lnode* head2 = NULL;
//Insert the first node into linked list
struct lnode *new_node2 = lcreate_node(6);
lsortedInsert(&head2, new_node2);
/*Call the function "lsortedInsert()" with "head1" and "new_node1" as arguments and inserts the node into it.*/
new_node2 = lcreate_node(5);
lsortedInsert(&head2, new_node2);
new_node2 = lcreate_node(4);
lsortedInsert(&head2, new_node2);
//Display elements of linked list
cout<<"Elements of third list are: "<<endl;
ldisplay(head2);
//Call "merge()" to merge two linked lists
merge( head1, &head2);
printf("Linked List after merging second and third list: \n");
MergeSort(&head1);
ldisplay(head1);
//Store the values of second list into an array
while( head1!=NULL )
{
//Copy the data at the node into variable "c"
int c = head1->ldata;
//copy value in "c" into the array "la[]"
la[i] = c;
//Increment value of "i"
i++;
// Traverse each element
head1 = head1->lnext;
}
//Declare the variables
int lIndex = 0;
/*Search the element in first list with the position in second list */
for(int k=0;k<i;k++)
{
/*Declare la node "ltemp" and assign "head "into it */
struct lnode* ltemp = head;
//Declare the variables
lIndex=0;
/*Match the values in first array with index in second array */
while(lIndex !=la[k] && ltemp!=NULL)
{
//Traverse the list
ltemp = ltemp->lnext;
//Increment the index value
lIndex++;
}
/*Assign the value 0 to data that are at positions in second list */
ltemp->ldata = 0;
}
/*Call the function "ldeleteKey()" with "head" and value 0 as arguments */
ldeleteKey(&head,0);
//Display the result after deletion
cout<<"Elements of first list after deletion : "<<endl;
//Call "ldisplay()" to display list
ldisplay(head);
cout<<endl;
//Pause the console window
system("pause");
return 0;
}
/*Declare the function "lsortedInsert()" that takes head reference and new node as arguments and inserts the node into list in sorted order */
void lsortedInsert(struct lnode** head_ref, struct lnode* lnew_node)
{
//Declare la node "current"
struct lnode* current;
/*If list is empty or data of new node is less than or equal to present data of list */
if (*head_ref == NULL || (*head_ref)->ldata >= lnew_node->ldata)
{
//Make head reference to "lnew_node->lnext"
lnew_node->lnext = *head_ref;
//Assign new node to head reference
*head_ref = lnew_node;
}
else
{
//Locate node before insertion point
current = *head_ref;
//Place the node in sorted order
while (current->lnext!=NULL && current->lnext->
ldata < lnew_node->ldata)
{
//Traverse the list pointer
current = current->lnext;
}
//Make "current->lnext" to "lnew_node->lnext"
lnew_node->lnext = current->lnext;
//Assign new node to "current->lnext"
current->lnext = lnew_node;
}
}
/*The function "ldisplay()" takes the header pointer of list as arguments and elements of list are displayed */
void ldisplay(struct lnode* head)
{
//Declare a node "ltemp"
struct lnode *ltemp;
//If head is NULL
if (head == NULL)
{
//Display the message
cout<<"The List is Empty"<<endl;
return;
}
//Set "ltemp" as head node
ltemp = head;
/*Display the data in linked list until it reaches null */
while (ltemp != NULL)
{
//Display the data
cout<<ltemp->ldata<<"->";
//Move to next element
ltemp = ltemp->lnext;
}
//Display the end of list
cout<<"NULL"<<endl;
}
/*The function ldeletekey()" takes the header pointer and the deletion element as arguments and deletes the particular element from the list */
void ldeleteKey(struct lnode **head_ref, int lkey)
{
// Store head node
struct lnode* ltemp = *head_ref, *prev;
/*Check for all occurrences of the deletion element in the list */
while (ltemp != NULL && ltemp->ldata == lkey)
{
//Change header pointer
*head_ref = ltemp->lnext;
//Free old head
free(ltemp);
//change "ltemp"
ltemp = *head_ref;
}
//Delete all occurrences of element other than "head"
while (ltemp != NULL)
{
/*Search for key to be deleted, track previous node as 'prev->lnext' is to be changed*/
while (ltemp != NULL && ltemp->ldata != lkey)
{
prev = ltemp;
ltemp = ltemp->lnext;
}
//If key is not in list
if (ltemp == NULL) return;
//Unlink the node from list
prev->lnext = ltemp->lnext;
//Free memory
free(ltemp);
//Update "ltemp" for next loop iteration
ltemp = prev->lnext;
}
}
Explanation:
- The above program declares two linked list and deletes elements of first linked list at positions corresponding to elements in second linked list.
- The function “lcreate_node()” takes an integer value as parameter and creates a node of the linked list.
- The function “lsortedInsert()” takes header pointers of list and new node created as the parameters of the function and inserts the node in the list in sorted order.
- The function “ldisplay()” takes header pointers of linked list as arguments and displays the linked list contents.
- The function “ldeleteKey()” takes header reference pointer of linked list and element to delete as the function arguments and it deletes all element occurrences from list.
- The function “merge()” takes header reference pointer of two linked list as arguments and merges two lists.
- The function “lSortedMerge()”that merges the list that are sorted, it takes header pointers of two list as arguments.
- The function “lFBS()”that divides the list into two halves and returns reference parameters of result.
- In the main function three linked list are defined, elements of second list and third list are merged and then sorted which denotes deletion position index of first list.
- The data values in first list corresponding to positions in merged list are replaced with value 0.
- Delete function is called with header pointer of list and value 0 as function arguments so as to delete all occurrences of 0 from list.
- The final linked after the deletion process is displayed as result.
Output:
Elements of first list are:
5->10->20->30->40->50->60->70->NULL
Elements of second list are:
1->2->3->NULL
Elements of third list are:
4->5->6->NULL
Linked List after merging second and third list:
1->2->3->4->5->6->NULL
Elements of first list after deletion:
5->70->NULL
Press any key to continue . . .
Want to see more full solutions like this?
Chapter 3 Solutions
EBK DATA STRUCTURES AND ALGORITHMS IN C
- Beginning with a singly linked list composed of 5 nodes, draw step-by-step the process of removing index 3 from the list.arrow_forwardA singly linked list contains n - 1 strings that are binary representations of numbers from the set {0, 1,.…, n – 1} where n is an exact power of 2. However, the string corresponding to one of the numbers is missing. For example, if n = 4, the list will contain any three strings from 00, 01,10 and 11. Note that the strings in the list may not appear in any specific order. Also note that the length of each string is lgn, hence the time to compare two strings in O(lgn). Write an algorithm that generates the missing string in O(n).arrow_forwardLet L=(X1, X2Xn) be a list of n elements. Let us search for a key K in the list L. If the key is presented in the list L at index(or position); then partition the list Linto disjoint lists L1 and L2 such that L1=(x[i]: x[i]EL such that isj) and L2=(x[1]:x[i] EL such that i>j). If the key is not present in the list output is "no". Write an algorithm (using linked list) and subsequent C program for your algorithm to compute lists L1 and L2 for the given list L and key K. Note: Don't use any inbuilt functions in your program. Example1: If L=(16, 15, 1, 27, 19, 100, 200,3) and key k= 27 then L1=(16, 15,1,27) and L2=(19, 100,200, 3). Example 2: If L=(16, 15, 1, 27, 19, 100, 200,3) and key k= 127 then no. Input format Enter the list size n Enter the n numbers Enter the key valuearrow_forward
- Implement the complete code Delete that, when given an info value newElement, finds and deletes the first element with this value, if it exists. This involves also considering the four special cases listed for deleting a node from the beginning or the end of a linked list.arrow_forwardCreate a self-organizing list by establishing a single linked list of nodes and doing regular retrievals of data from the list at random. Demonstrate how the list restructures itself when the count, move to front, and transpose techniques are applied to the same collection of frequent retrievals.arrow_forwardGiven a circular linked list, implement an algorithm that returns the node at the beginning of the loop.DEFINITIONCircular linked list: A (corrupt) linked list in which a node's next pointer points to an earlier node, soas to make a loop in the linked list.EXAMPLEInput:Output:A -> B -> C -> D -> E -> C [the same C as earlier]Carrow_forward
- Write a program that inserts the following numbers into two (2) empty doubly linked list.L1 50 30 25 75 82 28 77L2 50 40 25 75 80 21 37 30Hint: Put the median at the first element of linked list for both linked list and after insertingmedian element at the first node, do not pass that element again. Median Formula: (n+1)/2a) Implement an insert function for both L1 and L2.b) Implement a function to delete 80 from L2.c) Implement a function to check L1 and L2 are really the same list of nodes or not.Note: You are not allowed to use any built-in Data Structure classes to implement abovescenario.arrow_forward: Implement an algorithm to delete a node in the middle (i.e., any node butthe first and last node, not necessarily the exact middle) of a singly linked list, given only access tothat node.EXAMPLElnput:the node c from the linked lista->b->c->d->e->fResult: nothing is returned, but the new linked list looks like a->b->d->e->farrow_forwardLook for a point where two (singly) linked lists intersect. Return the intersection node. Remember that the intersection is defined by reference rather than value. If the kth node of the first linked list is the exact same node (by reference) as the jth node of the second linked list, then they are intersecting.arrow_forward
- Execute a program that will split a circularly linked list P with n nodes intotwo circularly linked lists P1, P2 with the first n/2 and the last n – n/2 nodes ofthe list P in them.arrow_forwardIn a linked list, create an algorithm to eliminate any nodes that have the same key.arrow_forwardConsider a (singly) linked list. Describe an algorithm to remove every second elementfrom the list.(HINT: The algorithm is similar to the one that is used when we delete a single node. Here,we need to skip an element after every deletion, and then if we have not reached the end ofthe list repeat this procedure until the list is exhausted.).arrow_forward
- Database System ConceptsComputer ScienceISBN:9780078022159Author:Abraham Silberschatz Professor, Henry F. Korth, S. SudarshanPublisher:McGraw-Hill EducationStarting Out with Python (4th Edition)Computer ScienceISBN:9780134444321Author:Tony GaddisPublisher:PEARSONDigital Fundamentals (11th Edition)Computer ScienceISBN:9780132737968Author:Thomas L. FloydPublisher:PEARSON
- C How to Program (8th Edition)Computer ScienceISBN:9780133976892Author:Paul J. Deitel, Harvey DeitelPublisher:PEARSONDatabase Systems: Design, Implementation, & Manag...Computer ScienceISBN:9781337627900Author:Carlos Coronel, Steven MorrisPublisher:Cengage LearningProgrammable Logic ControllersComputer ScienceISBN:9780073373843Author:Frank D. PetruzellaPublisher:McGraw-Hill Education