C - Swap node values of a Circular Doubly Linked List
There are many instances where it is required to swap value of two nodes while working with a list. This can be achieved by traversing to the interested nodes and swap their values if the nodes are valid. For example - if the given list is 10->20->30->40->50. After swapping values of first and fourth nodes, the list will become 40->20->30->10->50.
The function swapNodeValues is created for this purpose which is a 4-step process.
void swapNodeValues(struct Node* head_ref, int node1, int node2) { //1. count the number of nodes in the list struct Node* temp = head_ref; int N = 0; if(temp != NULL) { N++; temp = temp->next; } while (temp != head_ref) { N++; temp = temp->next; } //2. check if the swap positions are valid entries if(node1 < 1 || node1 > N || node2 < 1 || node2 > N) return; //3. traverse to the nodes where values to be swapped struct Node* pos1 = head_ref; struct Node* pos2 = head_ref; for(int i = 1; i < node1; i++) { pos1 = pos1->next; } for(int i = 1; i < node2; i++) { pos2 = pos2->next; } //4. swap the values of two nodes int val = pos1->data; pos1->data = pos2->data; pos2->data = val; }
The below is a complete program that uses above discussed concept to swap values of two given nodes of a circular doubly linked list.
#include <stdio.h> #include <stdlib.h> //node structure struct Node { int data; struct Node* next; struct Node* prev; }; //Add new element at the end of the list void push_back(struct Node** head_ref, int newElement) { struct Node *newNode, *temp; newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = newElement; newNode->next = NULL; newNode->prev = NULL; if(*head_ref == NULL) { *head_ref = newNode; newNode->next = *head_ref; newNode->prev = *head_ref; } else { temp = *head_ref; while(temp->next != *head_ref) { temp = temp->next; } temp->next = newNode; newNode->next = *head_ref; newNode->prev = temp; (*head_ref)->prev = newNode; } } //swap node values void swapNodeValues(struct Node* head_ref, int node1, int node2) { struct Node* temp = head_ref; int N = 0; if(temp != NULL) { N++; temp = temp->next; } while (temp != head_ref) { N++; temp = temp->next; } if(node1 < 1 || node1 > N || node2 < 1 || node2 > N) return; struct Node* pos1 = head_ref; struct Node* pos2 = head_ref; for(int i = 1; i < node1; i++) { pos1 = pos1->next; } for(int i = 1; i < node2; i++) { pos2 = pos2->next; } int val = pos1->data; pos1->data = pos2->data; pos2->data = val; } //display the content of the list void PrintList(struct Node* head_ref) { struct Node* temp = head_ref; if(head_ref != NULL) { printf("The list contains: "); while (1) { printf("%i ",temp->data); temp = temp->next; if(temp == head_ref) break; } printf("\n"); } else { printf("The list is empty.\n"); } } // test the code int main() { struct Node* MyList = NULL; //Add five elements in the list. push_back(&MyList, 10); push_back(&MyList, 20); push_back(&MyList, 30); push_back(&MyList, 40); push_back(&MyList, 50); //Display the content of the list. PrintList(MyList); //swap values of node=1 and node=4 swapNodeValues(MyList, 1, 4); //Display the content of the list. PrintList(MyList); return 0; }
The above code will give the following output:
The list contains: 10 20 30 40 50 The list contains: 40 20 30 10 50