Advertisement
meta1211

List

May 9th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. #pragma once
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. template <typename T>
  6. struct Node
  7. {
  8. T key;
  9. Node *next;
  10. Node(T Data = 0, Node* NextData = nullptr)
  11. {
  12. key = Data;
  13. next = NextData;
  14. }
  15. };
  16.  
  17. /*формирование списка(из файла, случайный, из массива и т.д.),
  18. !ввод!, !вывод!, поиск(!по ключу!, !по номеру! !по порядку!),
  19. добавить(!в голову!, !по индексу!, !после ключа!),
  20. удалить(!голова!, !индекс!, !ключ!), скопировать, !уничтожить список!*/
  21. template <typename T>
  22. struct List {
  23. private:
  24. Node<T> *head;
  25. unsigned int size;
  26.  
  27. Node<T>* find_Key(int key, const char* mode);
  28.  
  29. void add(Node<T> *newNode)
  30. {
  31. newNode->next = head;
  32. head = newNode;
  33. }
  34.  
  35. void del(Node<T> *previous)
  36. {
  37. Node<T> *p = previous->next;
  38. previous->next = p->next;
  39. delete p;
  40. size--;
  41. }
  42.  
  43. public:
  44.  
  45. List()
  46. {
  47. head = new Node<T>;
  48. head->key = 0;
  49. head->next = 0;
  50. size = 0;
  51. }
  52.  
  53. ~List()
  54. {
  55. Node<T> *toDel;
  56. for (Node<T> *p = head; p != nullptr; )
  57. {
  58. toDel = p;
  59. p = p->next;
  60. delete toDel;
  61. }
  62. }
  63.  
  64. Node<T>* find_Index(int index);
  65.  
  66. Node<T>* find_Key(int key);
  67.  
  68.  
  69. Node<T>* find_Order(int order);
  70.  
  71. bool push_Front(T Data)
  72. {
  73. add(new Node<T>(Data));
  74. size++;
  75. return true;
  76. };
  77.  
  78. bool push_Index(int index, T Data)
  79. {
  80. if (index >= size)
  81. return false;
  82. Node<T>* usel = find_Index(index);
  83. add(usel, new Node<T>(Data));
  84. size++;
  85. return true;
  86. }
  87.  
  88. bool push_afterKey(int key, T Data)
  89. {
  90. Node<T>* usel = find_Key(key);
  91. if (usel->key == key)
  92. {
  93. add(usel, new Node<T>(Data));
  94. size++;
  95. return true;
  96. }
  97. else
  98. {
  99. return false;
  100. }
  101. }
  102.  
  103. void del_Front()
  104. {
  105. Node<T> *oldHead = head;
  106. head = head->next;
  107. delete oldHead;
  108. size--;
  109. }
  110.  
  111. void del_Index(int index)
  112. {
  113. Node<T>* next = find_Index(index + 1);
  114. if (next == head)
  115. {
  116. del_Front();
  117. }
  118. else
  119. {
  120. del(next);
  121. }
  122. }
  123.  
  124. void del_Key(T key)
  125. {
  126. Node<T>* prevoius = find_Key(key, "RETURN PREVIOUS");
  127. if(prevoius == nullptr)
  128. {
  129. del_Front();
  130. }
  131. else
  132. {
  133. del(prevoius);
  134. }
  135. }
  136.  
  137. void print()
  138. {
  139. for (Node<T> *p = head; p->next != nullptr; p = p->next)
  140. cout << p->key << " ";
  141. cout << endl;
  142. }
  143.  
  144. bool empty()
  145. {
  146. return head->next;
  147. }
  148.  
  149. };
  150.  
  151. template <typename T>
  152. Node<T>* List<T>::find_Index(int index)
  153. {
  154. Node<T>* next = head;
  155. for (int i = 0; size - i - 1 != index && next != nullptr; i++)
  156. {
  157. next = next->next;
  158. }
  159. return next;
  160. }
  161.  
  162. template <typename T>
  163. Node<T>* List<T>::find_Key(int key)
  164. {
  165. Node<T>* next = head;
  166. for (; next != nullptr && next->key != key; next = next->next);
  167. return next;
  168. }
  169.  
  170. template <typename T>
  171. Node<T>* List<T>::find_Key(int key, const char* mode)
  172. {
  173. Node<T>* prevoius = nullptr;
  174. Node<T>* next = head;
  175. for (; next != nullptr && next->key != key; prevoius = next, next = next->next);
  176. return prevoius;
  177. }
  178.  
  179. template <typename T>
  180. Node<T>* List<T>::find_Order(int order)
  181. {
  182. if (order > size)
  183. return nullptr;
  184. Node<T>* curent = head;
  185. for (int i = 0; i != order; i++)
  186. {
  187. curent = curent->next;
  188. }
  189. return curent;
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement