Implement a priority queue using a doublyLinked.cpp where the node with the highest priority (key) is the right-most node. The remove (de-queue) operation returns the node with the highest priority (key). If displayForward() displays List (first-->last) : 10 30 40 55 remove() would return the node with key 55. please only code in c++ not anything else. keep it simple and thank you!! Demonstrate by inserting keys at random, displayForward(), call remove then displayForward() again. int main() { DoublyLinkedList pqList; pqList.priorityInsert(50); pqList.priorityInsert(40); pqList.priorityInsert(30); pqList.priorityInsert(20); pqList.priorityInsert(10); cout<<"-------------- PriorityQueue -------------"<<endl; pqList.displayForward(); cout<<"calling priorityRemove()"<<endl; double key = pqList.priorityRemove(); cout<<"Removed node with key "<<key<<endl; pqList.displayForward(); key = pqList.priorityRemove(); cout<<"Removed node with key "<<key<<endl; pqList.displayForward(); return 0; } Sample output" -------------- PriorityQueue ------------- List (first-->last): 10 20 30 40 50 calling priorityRemove() Removed node with key 50 List (first-->last): 10 20 30 40 Removed node with key 40 List (first-->last): 10 20 30 I may change numbers when grading. doublyLinked.cpp //doublyLinked.cpp //demonstrates doubly-linked list #include <iostream> using namespace std; //////////////////////////////////////////////////////////////// class Link { public: double dData; //data item Link * pNext; //next link in list Link * pPrevious; //previous link in list public: //------------------------------------------------------------- Link(double dd): //constructor dData(dd), pNext(NULL), pPrevious(NULL) {} //------------------------------------------------------------- void displayLink() //display this link { cout << dData << " "; } //------------------------------------------------------------- }; //end class Link //////////////////////////////////////////////////////////////// class DoublyLinkedList { private: Link * pFirst; //pointer to first item Link * pLast; //pointer to last item public: //------------------------------------------------------------- DoublyLinkedList(): //constructor pFirst(NULL), pLast(NULL) {} //------------------------------------------------------------- ~DoublyLinkedList() //destructor (deletes links) { Link * pCurrent = pFirst; //start at beginning of list while (pCurrent != NULL) //until end of list, { Link * pOldCur = pCurrent; //save current link pCurrent = pCurrent -> pNext; //move to next link delete pOldCur; //delete old current } } //------------------------------------------------------------- bool isEmpty() //true if no links { return pFirst == NULL; } //------------------------------------------------------------- void insertFirst(double dd) //insert at front of list { Link * pNewLink = new Link(dd); //make new link if (isEmpty()) //if empty list, pLast = pNewLink; //newLink <-- last else pFirst -> pPrevious = pNewLink; //newLi.