Generalised Linked List
#include <iostream>
using namespace std;
class Node
{
public:
bool Tag;
Node *Next;
union
{
char Data;
Node *SubList;
};
};
class GeneralisedLinkedList : public Node
{
public:
Node *Front, *Tail;
GeneralisedLinkedList(); // Default Constructer
bool empty();
void push_back();
void push_front();
void pop_back();
void pop_front();
void traverse(Node *);
};
template <typename T>
T checkInput(T Input, string content)
{
while (!cin.good())
{
cout << "\nWrong Input, Please Enter it Correctly!!\n";
cin.clear(); // Clears The Previous Input
cin.ignore(100, '\n'); // Ignores The Incorrect Input Upto 100 Characters
cout << content;
cin >> Input;
}
while (Input < 0)
{
cout << "\nThis Input Cannot Be Negative!!\n";
cin.clear();
cin.ignore(100, '\n');
cout << content;
cin >> Input;
}
return Input;
}
GeneralisedLinkedList::GeneralisedLinkedList()
{
Front = NULL;
Tail = NULL;
Next = NULL;
SubList = NULL;
}
bool GeneralisedLinkedList::empty()
{
return Front == NULL;
}
void GeneralisedLinkedList::push_back()
{
Node *temp = new (nothrow) Node();
if (!temp)
throw bad_alloc();
string content1("\n1. Press 0 For Data\n2. Press 1 For Sublist\nEnter The Tag : ");
cout << content1;
cin >> temp->Tag;
temp->Tag = checkInput(temp->Tag, content1);
if (temp->Tag == 0)
{
if (empty())
{
cout << "\nEnter The Data : ";
cin >> temp->Data;
Front = temp;
Tail = temp;
temp->Next = NULL;
}
else
{
cout << "\nEnter The Data : ";
cin >> temp->Data;
Tail->Next = temp;
Tail = temp;
Tail->Next = NULL;
}
}
else if (temp->Tag == 1)
{
int num;
string content("\nEnter The Number of Elements You Want to Add\n");
cout << content;
cin >> num;
num = checkInput(num, content);
GeneralisedLinkedList GLL;
Tail->Next = temp;
Tail = temp;
for (int i = 0; i < num; i++)
{
GLL.push_back();
}
temp->SubList = GLL.Front;
Tail->Next = NULL;
}
}
void GeneralisedLinkedList::push_front()
{
Node *temp = new (nothrow) Node();
if (!temp)
throw bad_alloc();
string content1("\n1. Press 0 For Data\n2. Press 1 For Sublist\nEnter The Tag : ");
cout << content1;
cin >> temp->Tag;
temp->Tag = checkInput(temp->Tag, content1);
if (temp->Tag == 0)
{
if (empty())
{
cout << "\nEnter The Data : ";
cin >> temp->Data;
Front = temp;
Tail = temp;
temp->Next = NULL;
}
else
{
cout << "\nEnter The Data : ";
cin >> temp->Data;
temp->Next = Front;
Front = temp;
}
}
else if (temp->Tag == 1)
{
int num;
string content("\nEnter The Number of Elements You Want to Add\n");
cout << content;
cin >> num;
num = checkInput(num, content);
GeneralisedLinkedList GLL;
temp->Next = Front;
Front = temp;
for (int i = 0; i < num; i++)
{
GLL.push_back();
}
temp->SubList = GLL.Front;
}
}
void GeneralisedLinkedList::pop_back()
{
if (empty())
{
cout << "\nList is Empty\n";
return;
}
if (Front == Tail)
{
Node *temp = Front;
Front = Tail = NULL;
delete temp;
}
else
{
Node *ptr = Front;
while (ptr->Next != Tail)
ptr = ptr->Next;
Tail = ptr;
ptr = ptr->Next;
Tail->Next = NULL;
delete ptr;
}
}
void GeneralisedLinkedList::pop_front()
{
if (empty())
{
cout << "\nList is Empty\n";
return;
}
if (Front == Tail)
{
Node *temp = Front;
Front = Tail = NULL;
delete temp;
}
else
{
Node *ptr = Front;
Front = ptr->Next;
delete ptr;
}
}
void GeneralisedLinkedList::traverse(Node *front)
{
if (empty())
{
cout << "List is Empty";
return;
}
cout << "{";
Node *temp = front;
while (temp != NULL)
{
if (temp->Tag == 0)
{
if (temp->Next == NULL)
cout << temp->Data;
else
cout << temp->Data << ",";
}
else
{
traverse(temp->SubList);
if (temp->Next == NULL){}
// Do Nothing
else
cout << ",";
}
temp = temp->Next;
}
cout << "}";
}
int main()
{
GeneralisedLinkedList *GLL = new (nothrow) GeneralisedLinkedList();
if (!GLL)
throw bad_alloc();
while (true)
{
int userInput;
string content("\n1. Press 1 To Push Back\n2. Press 2 To Push Front\n
3. Press 3 To Pop Back\n4. Press 4 To Pop Front\n
5. Press 5 To Traverse\n6. Press 6 To Exit\n>>>> ");
cout << content;
cin >> userInput;
userInput = checkInput(userInput, content);
switch (userInput)
{
case 1:GLL->push_back();break;
case 2:GLL->push_front();break;
case 3:GLL->pop_back();break;
case 4:GLL->pop_front();break;
case 5:cout << "\n";GLL->traverse(GLL->Front);cout << "\n";break;
case 6:exit(0);
default:
cout << "\nPlease Enter Correct Input!!\n";
break;
}
}
return 0;
}
// Output
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 1
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : A
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 5
// {A}
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> w
// Wrong Input, Please Enter it Correctly!!
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 8
// Please Enter Correct Input!!
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 1
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : B
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 5
// {A,B}
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 2
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : C
// Wrong Input, Please Enter it Correctly!!
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 2
// Wrong Input, Please Enter it Correctly!!
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : C
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 2
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : D
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 5
// {D,C,A,B}
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 3
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 4
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 5
// {C,A}
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 1
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 1
// Enter The Number of Elements You Want to Add
// 2
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : C
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : D
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 5
// {C,A,{C,D}}
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 2
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 1
// Enter The Number of Elements You Want to Add
// 2
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : E
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : F
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 5
// {{E,F},C,A,{C,D}}
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 3
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 5
// {{E,F},C,A}
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 4
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 5
// {C,A}
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 3
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 4
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 5
// List is Empty
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 3
// List is Empty
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 4
// List is Empty
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 1
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : a
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 0
// Please Enter Correct Input!!
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> b
// Wrong Input, Please Enter it Correctly!!
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 1
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : b
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 5
// {a,b}
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 1
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 1
// Enter The Number of Elements You Want to Add
// 4
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : c
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : d
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : e
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 1
// Enter The Number of Elements You Want to Add
// 2
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : f
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : g
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 5
// {a,b,{c,d,e,{f,g}}}
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 1
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : h
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 1
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : i
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 5
// {a,b,{c,d,e,{f,g}},h,i}
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 1
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 1
// Enter The Number of Elements You Want to Add
// 2
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : j
// 1. Press 0 For Data
// 2. Press 1 For Sublist
// Enter The Tag : 0
// Enter The Data : k
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 5
// {a,b,{c,d,e,{f,g}},h,i,{j,k}}
// 1. Press 1 To Push Back
// 2. Press 2 To Push Front
// 3. Press 3 To Pop Back
// 4. Press 4 To Pop Front
// 5. Press 5 To Traverse
// 6. Press 6 To Exit
// >>>> 6
Comments
Post a Comment