For this micro assignment, you must implement two Linked List functions. We will use the following example Linked List: 2 0 -1 5 7 getElementAt(index) This function should return the element (i.e. value) of the Nth item inside the linked list. For example, on the Linked List above, getElementAt(0) should return 2; getElementAt(3) should return 5. addElementAt(value, location) This function should insert a new value at the given location. Note that the location supplied must be within bounds of the LinkedList. For example, we cannot call addElementAt(4, 11) on the above Linked List because 11 is beyond the size of the Linked List. Here are some examples. If we call addElementAt(0, 1), the above Linked List would now look like: 1 2 0 -1 5 7 If we again call addElementAt(2, 123), we would get: 1 2 123 0 -1 5 7 Grading Your submission will be graded based on the following: 1. [7] Your solution does not cause any runtime issues and your file passes all test cases 2. [3] Your code contains good style. For example, You provide meaningful variable names You provide sufficient and meaningful comments Your code is well structured @@@@@@@@@@@@@@@@@@@@@@@@ #ifndef LINKED_LIST_H #define LINKED_LIST_H #include #include #include "LinkedListNode.h" #include using namespace std; template class LinkedList { private: //points to the front of the linked list LinkedListNode *_front = nullptr; //keeping track of size in a variable eliminates need to continually //count LL boxes. int _size = 0; protected: //creates a new LinkedListNode for us virtual LinkedListNode *createNode(T value) { return new LinkedListNode < T > { value }; } public: //default constructor LinkedList() { _front = nullptr; } //copy constructor LinkedList(const LinkedList &other) { for (int i = 0; i < other.getSize(); i++) { addElement(other.getElementAt(i)); } } //move constructor LinkedList(LinkedList &&other) { //take other's data _front = other._front; _size = other._size; //reset other's pointers other._front = nullptr; } //initializer list constructor LinkedList(initializer_list values) { for (auto item : values) { addElement(item); } } //Always remember to clean up pointers in destructor! virtual ~LinkedList() { LinkedListNode *current = _front; while (current != nullptr) { LinkedListNode *temp = current->getNext(); delete current; current = temp; } } //will return true if the LL is empty. virtual bool isEmpty() const { return _size == 0; } //returns the size of the LL. virtual int getSize() const { return _size; } .