Guest User

Untitled

a guest
Oct 26th, 2019
387
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.84 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. if((*root) == NULL)
  296. (*root) = x;
  297. else if((*root)->getData() == x->getData())
  298. BSTinsert(&((*root)->getPrevious()),x);
  299. else if((*root)->getData() < x->getData())
  300. BSTinsert(&((*root)->getNext()),x);
  301. else
  302. BSTinsert(&((*root)->getPrevious()),x);
  303.  
  304. }
  305.  
  306. template<class T>
  307. void DoublyLinkedList<T>::BSTtoDLL(Link<T> *root,DoublyLinkedList<T> &L)
  308. {
  309. if(root != NULL)
  310. {
  311. BSTtoDLL(root->getPrevious(),L);
  312. if(L.isEmpty())
  313. L.setFirst(root);
  314. else
  315. L.getLast()->setNext(root);
  316. root->setPrevious(L.getLast());
  317. L.setLast(root);
  318. BSTtoDLL(root->getNext(),L);
  319. }
  320. }
  321.  
  322. template<class T>
  323. void DoublyLinkedList<T>::BSTSort()
  324. {
  325. Link<T> *temp;
  326. Link<T> *root = NULL;
  327. while(!isEmpty())
  328. {
  329. temp = getFirst();
  330. if(getFirst()->getNext() == NULL)
  331. setLast(NULL);
  332. else
  333. getFirst()->getNext()->setPrevious(NULL);
  334. setFirst(getFirst()->getNext());
  335. temp->setPrevious(NULL);
  336. temp->setNext(NULL);
  337. BSTinsert(&root,temp);
  338. }
  339. BSTtoDLL(root,*this);
  340. }
  341.  
  342. int main(int argc, char *argv[])
  343. {
  344. DoublyLinkedList<int> A;
  345. int k,n,m;
  346. srand(time(NULL));
  347. cin>>n>>m;
  348. for(k = 0;k < n;k++)
  349. A.insertLast(rand()%m);
  350. A.displayForward();
  351. A.displayBackward();
  352. A.BSTSort();
  353. A.displayForward();
  354. A.displayBackward();
  355. while(!A.isEmpty())
  356. A.deleteFirst();
  357. return EXIT_SUCCESS;
  358. }
Advertisement
Add Comment
Please, Sign In to add comment