In C++ Write a recursive function to determine whether or not a Linked List is in sorted order (smallest value to largest value). Add the following function prototypes to your List class under the section for access functions, then implement the functions below the class definition: public: /**Access Functions*/ bool isSorted(); //Wrapper function that calls the isSorted helper function to determine whether //a list is sorted in ascending order. //We will consider that a list is trivially sorted if it is empty. //Therefore, no precondition is needed for this function private: bool isSorted(Nodeptr node); //Helper function for the public isSorted() function. //Recursively determines whether a list is sorted in ascending order. #include //for NULL #include #include using namespace std; template //list stores generic list data, not any specific C++ type class List { private: struct Node { listdata data; Node* next; Node* previous; Node(listdata data): data(data), next(NULL), previous(NULL){} }; typedef struct Node* Nodeptr; Nodeptr first; Nodeptr last; Nodeptr iterator; int size; public: /**Constructors and Destructors*/ List(); //Default constructor; initializes and empty list //Postcondition: numeric values equated to zero, or strings should be empty. List(const List &list); ~List(); //Destructor. Frees memory allocated to the list //Postcondition: position NodePtr at next Node /**Accessors*/ listdata getFirst(); //Returns the first element in the list //Precondition:NodePtr points to the first node on list listdata getLast(); //Returns the last element in the list //Precondition: make new node first on the list listdata getIterator(); bool isEmpty(); //Determines whether a list is empty. int getSize(); //Returns the size of the list /**Manipulation Procedures*/ void startIterator(); void advanceIterator(); void removeLast(); //Removes the value of the last element in the list //Precondition: list is not empty, not the first element. //Postcondition: one remaining node void removeIterator(); void removeFirst(); //Removes the value of the first element in the list //Precondition: list is not empty //Postcondition: no nodes left void insertLast(listdata data); //Inserts a new element at the end of the list //If the list is empty, the new element becomes both first and last //Postcondition: next equal to null void insertFirst(listdata data); //Inserts a new element at the start of the list //If the list is empty, the new element becomes both first and last //Postcondition:point nodePtr next node on list /**Additional List Operations*/ bool offEnd(); void printList(); //Prints to the console the value of each element in the list sequentially //and separated by a blank space //Prints nothing if the list is empty void insertIterator(listdata data); bool operator==(const List &list); }; // constructor definition template List::List(): first(NULL), last(NULL), iterator(NULL), size(0) {} template List::List(const List &list): size(list.size) { if(list..