#include // https://www.softwaretestinghelp.com/circular-linked-list/ using namespace std; struct Node { int data; struct Node* next; }; //insert a new node in an empty list struct Node* insertInEmpty(struct Node* last, int new_data) { // if last is not null then list is not empty, so return if (last != NULL) { return last; } // allocate memory for node struct Node* temp = new Node; // Assign the data. temp -> data = new_data; last = temp; // Create the link. last->next = last; return last; } //insert new node at the beginning of the list struct Node* insertAtBegin(struct Node* last, int new_data) { //if list is empty then add the node by calling insertInEmpty if (last == NULL) { return insertInEmpty(last, new_data); } //else create a new node struct Node* temp = new Node; //set new data to node temp -> data = new_data; temp -> next = last -> next; last -> next = temp; return last; } //insert new node at the end of the list struct Node* insertAtEnd(struct Node* last, int new_data) { //if list is empty then add the node by calling insertInEmpty if (last == NULL) { return insertInEmpty(last, new_data); } //else create a new node struct Node* temp = new Node; //assign data to new node temp -> data = new_data; temp -> next = last -> next; last -> next = temp; last = temp; return last; } //insert a new node in between the nodes struct Node* insertAfter(struct Node* last, int new_data, int after_item) { //return null if list is empty if (last == NULL) { return NULL; } struct Node* temp, *p; p = last -> next; do { if (p ->data == after_item) { temp = new Node; temp -> data = new_data; temp -> next = p -> next; p -> next = temp; if (p == last) { last = temp; } return last; } p = p -> next; } while (p != last -> next); cout << "The node with data " << after_item << " is not present in the list." << endl; return last; } //traverse the circular linked list void traverseList(struct Node* last) { struct Node* p; // If list is empty, return. if (last == NULL) { cout << "Circular linked List is empty." << endl; return; } p = last -> next; // Point to the first Node in the list. // Traverse the list starting from first node until first node is visited again do { cout << p -> data << "==>"; p = p -> next; } while (p != last->next); if (p == last->next) { cout << p->data; } cout << "\n\n"; } //delete the node from the list void deleteNode(Node** head, int key) { // If linked list is empty retun if (*head == NULL) return; // If the list contains only a single node,delete that node; list is empty if ((*head)->data == key && (*head)->next == *head) { free(*head); *head = NULL; } Node* last = *head, *d; // If key is the head if ((*head)->data == key) { while (last->next != *head) { // Find the last node of the list last = last->next; } // point last node to next of head or second node of the list last->next = (*head)->next; free(*head); *head = last->next; } // end of list is reached or node to be deleted not there in the list while (last->next != *head&&last->next->data != key) { last = last->next; } // node to be deleted is found, so free the memory and display the list if (last->next->data == key) { d = last->next; last->next = d->next; cout << "The node with data " << key << " deleted from the list" << endl; free(d); cout << endl; cout << "Circular linked list after deleting " << key << " is as follows:" << endl; traverseList(last); } else { cout << "The node with data " << key << " not found in the list" << endl; } } // main Program int main() { struct Node* last = NULL; last = insertInEmpty(last, 30); last = insertAtBegin(last, 20); last = insertAtBegin(last, 10); last = insertAtEnd(last, 40); last = insertAtEnd(last, 60); last = insertAfter(last, 50,40 ); cout << "The circular linked list created is as follows:" << endl; traverseList(last); deleteNode(&last,10); return 0; }