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 Inputstring 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

Popular posts from this blog

Ticket Booking System

Student Database