Create a class Node with
a. attributes data, next pointer
b. accessors and mutators
c. constructor and destructor
d. a function called display.
1. Write functions to perform the following operations
a. create a circular singly linked list to perform
i. insertion,
ii. deletion
iii. traversing
b. create a sub menu for merge operations of two circular linked list L1, L2
i. Press 1 to append L1 to L2.
ii. Press 2 to append L2 to L1.
iii. Press 3 to merge L1 and L2 in sorted order.
c. print odd nodes of a circular linked list to divide the circular linked list into two parts into odd and even list?
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
class Node{
public:
int data;
Node *next;
Node();
Node(int);
int getData(){
return data;
}
void setData(int data){
this->data = data;
}
Node* getNext(){
return this->next;
}
void setNext(Node *node){
this->next = node;
}
void display(){
cout<<this->data;
}
~Node(){}
};
Node::Node(){
next = NULL;
}
Node::Node(int data){
this->data = data;
next = NULL;
}
class CircularLinkedList{
Node *head, *tail;
int size;
public:
CircularLinkedList();
//insert at head
void insert(int);
//delete at a specified index
void remove(int);
//prints the list
void traverse();
CircularLinkedList merge(CircularLinkedList, CircularLinkedList);
CircularLinkedList connect(CircularLinkedList, CircularLinkedList);
void sort();
int length(){return size;}
};
CircularLinkedList::CircularLinkedList(){
head = NULL;
tail = NULL;
size = 0;
}
void CircularLinkedList::insert(int data){
if(head == NULL){
head = new Node(data);
head->next = tail;
tail = head;
size++;
}
else{
tail->next = new Node(data);
tail = tail->next;
tail->next = head;
size++;
}
}
void CircularLinkedList::traverse(){
Node* curr = head;
if(curr == NULL) return;
do{
curr->display();
cout<<" ";
curr = curr->next;
}while(curr != head);
cout<<endl;
}
void CircularLinkedList::remove(int pos){
if(head != NULL){
int i = 0;
Node *temp = head;
Node *prev = NULL;
while(temp != NULL && i < pos){
prev = temp;
temp = temp->next;
i++;
}
if(pos > size - 1) return;
if(pos == 0){
head = head->next;
size--;
delete temp;
return;
}
if(pos == size - 1){
tail = prev;
tail->next = head;
size--;
delete temp;
return;
}
prev->next = temp->next;
size--;
delete temp;
}
}
CircularLinkedList CircularLinkedList:: merge(CircularLinkedList L1, CircularLinkedList L2){
cout<<"Press 1 to append L1 to L2.\n";
cout<<"Press 2 to append L2 to L1.\n";
cout<<"Press 3 to merge L1 and L2 in sorted order.\n";
int choice;
cin>>choice;
CircularLinkedList res;
switch(choice){
case 1: res = connect(L1, L2); break;
case 2: res = connect(L2, L1); break;
case 3: res = connect(L1, L2); res.sort(); break;
}
return res;
}
CircularLinkedList CircularLinkedList:: connect(CircularLinkedList L1, CircularLinkedList L2){
CircularLinkedList res;
Node *curr = L1.head;
do{
res.insert(curr->data);
curr = curr->next;
}while(curr != L1.head);
curr = L2.head;
do{
res.insert(curr->data);
curr = curr->next;
}while(curr != L2.head);
return res;
}
void CircularLinkedList::sort(){
Node *curr = head;
do{
Node *temp = curr->next;
while(temp != head){
if(temp->data < curr->data){
int temp_data = temp->data;
temp->data = curr->data;
curr->data = temp_data;
}
temp = temp->next;
}
curr = curr->next;
}while(curr != head);
}
int main(){
CircularLinkedList list, list2;
for(int i = 0, j = -10; i < 10; i++, j++){
list.insert(i);
list2.insert(j);
}
cout<<"List 1 = ";
list.traverse();
cout<<"List 2 = ";
list2.traverse();
CircularLinkedList merged = list.merge(list, list2);
merged.traverse();
return 0;
}
Comments
Leave a comment