Advertisement
Guest User

DoublyLinkedList

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