Guest User

Untitled

a guest
May 25th, 2020
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <stack>
  3. #include <cstdlib>
  4. #include <ctime>
  5.  
  6. using namespace std;
  7.  
  8.  
  9. template<class T>
  10. class Link
  11. {
  12.       private:
  13.               T data;
  14.               Link<T> *next;
  15.               Link<T> *previous;
  16.       public:
  17.              Link(T data);
  18.              void displayLink();
  19.              T getData();
  20.              void setData(T data);
  21.              Link<T> *getNext();
  22.              void setNext(Link<T> *next);
  23.              Link<T> *getPrevious();
  24.              void setPrevious(Link<T> *previous);
  25.              template<class U> friend std::ostream& operator<< (std::ostream& print, Link<U>& obj);
  26.  
  27. };
  28.  
  29. template<class T>
  30. Link<T>::Link(T data)
  31. {
  32.      setData(data);
  33.      setNext(NULL);
  34.      setPrevious(NULL);
  35.  
  36. }
  37.  
  38. template<class T>
  39. void Link<T>::displayLink()
  40. {
  41.      std::cout<<getData()<<" ";
  42. }
  43.  
  44. template<class T>
  45. T Link<T>::getData()
  46. {
  47.      return data;
  48. }
  49.  
  50. template<class T>
  51. void Link<T>::setData(T data)
  52. {
  53.      this->data = data;
  54. }
  55.  
  56. template<class T>
  57. Link<T> *Link<T>::getNext()
  58. {
  59.       return next;
  60. }
  61.  
  62. template<class T>
  63. void Link<T>::setNext(Link<T> *next)
  64. {
  65.       this->next = next;
  66. }
  67.  
  68. template<class T>
  69. Link<T> *Link<T>::getPrevious()
  70. {
  71.       return previous;
  72. }
  73.  
  74. template<class T>
  75. void Link<T>::setPrevious(Link<T> *previous)
  76. {
  77.       this->previous = previous;
  78. }
  79.  
  80.  
  81. template <class U>
  82. std::ostream& operator<<(std::ostream& print, Link<U> & L)
  83. {
  84.         print << L.getData();
  85.         return print;
  86. }
  87.  
  88. template<class T>
  89. class DoublyLinkedList
  90. {
  91.       private:
  92.               Link<T> *first;
  93.               Link<T> *last;
  94.       public:
  95.              DoublyLinkedList();
  96.              ~DoublyLinkedList();
  97.              Link<T> *getFirst();
  98.              void setFirst(Link<T> *first);
  99.              Link<T> *getLast();
  100.              void setLast(Link<T> *first);
  101.              bool isEmpty();
  102.              Link<T> *find(T key);
  103.              void insertFirst(T dd);
  104.              void insertLast(T dd);
  105.              void deleteFirst();
  106.              void deleteLast();
  107.              bool insertAfter(T key,T dd);
  108.              void deleteKey(T key);
  109.              void displayForward();
  110.              void displayBackward();
  111.              void BSTinsert(Link<T> *&root,Link<T> *z);
  112.              void BSTtoDLL(Link<T> *root,DoublyLinkedList<T> &L);
  113.              void BSTSort();
  114. };
  115.  
  116. template<class T>
  117. DoublyLinkedList<T>::DoublyLinkedList()
  118. {
  119.     setFirst(NULL);
  120.     setLast(NULL);
  121. }
  122.  
  123. template<class T>
  124. DoublyLinkedList<T>::~DoublyLinkedList()
  125. {
  126.     while(!isEmpty())
  127.     {
  128.         deleteFirst();
  129.     }
  130. }
  131.  
  132. template<class T>
  133. Link<T> *DoublyLinkedList<T>::getFirst()
  134. {
  135.        return first;
  136. }
  137.  
  138. template<class T>
  139. void DoublyLinkedList<T>::setFirst(Link<T> *first)
  140. {
  141.      this->first = first;
  142. }
  143.  
  144. template<class T>
  145. Link<T> *DoublyLinkedList<T>::getLast()
  146. {
  147.        return last;
  148. }
  149.  
  150. template<class T>
  151. void DoublyLinkedList<T>::setLast(Link<T> *last)
  152. {
  153.      this->last = last;
  154. }
  155.  
  156. template<class T>
  157. bool DoublyLinkedList<T>::isEmpty()
  158. {
  159.      return getFirst()==NULL;
  160. }
  161.  
  162. template<class T>
  163.  Link<T> *DoublyLinkedList<T>::find(T key)
  164.  {
  165.          Link<T> *current = getFirst();
  166.          while(current != NULL && !(current->getData == key))
  167.                current = current->getNext();
  168.          return current;
  169.  }
  170.  
  171.  template<class T>
  172.  void DoublyLinkedList<T>::insertFirst(T dd)
  173.  {
  174.       Link<T> *newLink = new Link<T>(dd);
  175.       if(isEmpty())
  176.            setLast(newLink);
  177.       else
  178.           getFirst()->setPrevious(newLink);
  179.       newLink->setNext(getFirst());
  180.       setFirst(newLink);
  181.  }
  182.  
  183.  template<class T>
  184.  void DoublyLinkedList<T>::insertLast(T dd)
  185.  {
  186.       Link<T> *newLink = new Link<T>(dd);
  187.       if(isEmpty())
  188.       {
  189.           setFirst(newLink);
  190.       }
  191.       else
  192.       {
  193.           getLast()->setNext(newLink);
  194.           newLink->setPrevious(getLast());
  195.       }
  196.       setLast(newLink);
  197.  }
  198.  
  199.  template<class T>
  200.  void DoublyLinkedList<T>::deleteFirst()
  201.  {
  202.       if(isEmpty())
  203.            return;
  204.       Link<T> *temp = getFirst();
  205.       if(getFirst()->getNext() == NULL)
  206.             setLast(NULL);
  207.       else
  208.          getFirst()->getNext()->setPrevious(NULL);
  209.       setFirst(getFirst()->getNext());
  210.       delete temp;
  211.  }
  212.  
  213.  template<class T>
  214.  void DoublyLinkedList<T>::deleteLast()
  215.  {
  216.       if(isEmpty())
  217.          return;
  218.       Link<T> *temp = getLast();
  219.       if(getFirst()->getNext() == NULL)
  220.              setFirst(NULL);
  221.       else
  222.           getLast()->getPrevious()->setNext(NULL);
  223.       setLast(getLast()->getPrevious());
  224.       delete temp;
  225.  }
  226.  
  227.  template<class T>
  228.  bool DoublyLinkedList<T>::insertAfter(T key,T dd)
  229.  {
  230.       Link<T> *current = find(key);
  231.       if(current == NULL)
  232.              return false;
  233.       Link<T> *newLink = new Link<T>(dd);
  234.       if(current->getNext() == NULL)
  235.       {
  236.            newLink->setNext(NULL);
  237.            setLast(newLink);
  238.       }
  239.       else
  240.       {
  241.           newLink->setNext(current->getNext());
  242.           current->getNext()->setPrevious(newLink);
  243.       }
  244.       newLink->setPrevious(current);
  245.       current->setNext(newLink);
  246.       return true;
  247.  }
  248.  
  249.  template<class T>
  250.  void DoublyLinkedList<T>::deleteKey(T key)
  251.  {
  252.       Link<T> *current = find(key);
  253.       if(current==NULL)
  254.            return;
  255.       if(current->getPrevious() == NULL)
  256.              setFirst(current->getNext());
  257.       else
  258.              current->getPrevious()->setNext(current->getNext());
  259.       if(current->getNext() == NULL)
  260.              setLast(current->getPrevious());
  261.       else
  262.              current->getNext()->setPrevious(current->getPrevious());
  263.       delete current;
  264.  }
  265.  
  266.  template<class T>
  267.  void DoublyLinkedList<T>::displayForward()
  268.  {
  269.       std::cout<<"List (first-->last): ";
  270.       Link<T> *current = getFirst();
  271.       while(current != NULL)
  272.       {
  273.          current->displayLink();
  274.          current = current->getNext();
  275.       }
  276.       std::cout<<"\n";
  277.  }
  278.  
  279.  template<class T>
  280.  void DoublyLinkedList<T>::displayBackward()
  281.  {
  282.       std::cout<<"List (last-->first): ";
  283.       Link<T> *current = getLast();
  284.       while(current != NULL)
  285.       {
  286.          current->displayLink();
  287.          current = current->getPrevious();
  288.       }
  289.       std::cout<<"\n";
  290.  }
  291.  
  292. template<class T>
  293. void DoublyLinkedList<T>::BSTinsert(Link<T> *&root,Link<T> *x)
  294. {
  295.     Link<T> *temp;
  296.     if(root == NULL)
  297.     {
  298.         root = x;
  299.     }
  300.     else if(root->getData() == x->getData())
  301.     {
  302.         temp = root->getPrevious();
  303.         BSTinsert(temp,x);
  304.         root->setPrevious(temp);
  305.     }
  306.     else if(root->getData() < x->getData())
  307.     {
  308.         temp = root->getNext();
  309.         BSTinsert(temp,x);
  310.         root->setNext(temp);
  311.     }
  312.     else
  313.     {
  314.         temp = root->getPrevious();
  315.         BSTinsert(temp,x);
  316.         root->setPrevious(temp);
  317.     }
  318. }
  319.  
  320. template<class T>
  321. void DoublyLinkedList<T>::BSTtoDLL(Link<T> *root,DoublyLinkedList<T> &L)
  322. {
  323.     if(root != NULL)
  324.     {
  325.         BSTtoDLL(root->getPrevious(),L);
  326.         if(L.isEmpty())
  327.             L.setFirst(root);
  328.         else
  329.             L.getLast()->setNext(root);
  330.         root->setPrevious(L.getLast());
  331.         L.setLast(root);
  332.         BSTtoDLL(root->getNext(),L);
  333.     }
  334. }
  335.  
  336. template<class T>
  337. void DoublyLinkedList<T>::BSTSort()
  338. {
  339.     Link<T> *temp;
  340.     Link<T> *root = NULL;
  341.     while(!isEmpty())
  342.     {
  343.         temp = getFirst();
  344.         if(getFirst()->getNext() == NULL)
  345.             setLast(NULL);
  346.         else
  347.             getFirst()->getNext()->setPrevious(NULL);
  348.         setFirst(getFirst()->getNext());
  349.         temp->setPrevious(NULL);
  350.         temp->setNext(NULL);
  351.         BSTinsert(root,temp);
  352.     }
  353.     BSTtoDLL(root,*this);
  354. }
  355.  
  356. int main(int argc, char *argv[])
  357. {
  358.     DoublyLinkedList<int> A;
  359.     int k,n,m;
  360.     srand(time(NULL));
  361.     cin>>n>>m;
  362.     for(k = 0;k < n;k++)
  363.         A.insertLast(rand()%m);
  364.     A.displayForward();
  365.     A.displayBackward();
  366.     A.BSTSort();
  367.     A.displayForward();
  368.     A.displayBackward();
  369.         while(!A.isEmpty())
  370.             A.deleteFirst();
  371.     system("PAUSE");
  372.     return EXIT_SUCCESS;
  373. }
Advertisement
Add Comment
Please, Sign In to add comment