Advertisement
Guest User

Untitled

a guest
Dec 18th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.18 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <stdlib.h>
  4. using namespace std;
  5. struct Node
  6. {
  7. int data;
  8. Node* next;
  9. Node* prev;
  10.  
  11. Node(int _data)
  12. {
  13. data = _data;
  14. next = NULL;
  15. prev = NULL;
  16. }
  17.  
  18. Node(Node* _node)
  19. {
  20. data = _node->data;
  21. next = _node->next;
  22. prev = _node->prev;
  23. }
  24. };
  25.  
  26. struct DLlist
  27. {
  28. Node* head;
  29.  
  30. DLlist()
  31. {
  32. head = NULL;
  33. };
  34.  
  35.  
  36. DLlist(int _data)
  37. {
  38. head = new Node(_data);
  39. head->next = NULL;
  40. head->prev = NULL;
  41. }
  42.  
  43. DLlist(DLlist* _list)
  44. {
  45. Node* current = _list->head;
  46. while (current != NULL)
  47. {
  48. push_back(current->data);
  49. current = current->next;
  50. }
  51. }
  52.  
  53. void DeleteList()
  54. {
  55. Node* tmp = head;
  56. while (head != NULL)
  57. {
  58. tmp = head->next;
  59. delete head;
  60. head = tmp;
  61. }
  62. }
  63.  
  64. void Print()
  65. {
  66. Node* current = head;
  67. while (current != NULL)
  68. {
  69. cout << current->data << " ";
  70. current = current->next;
  71. }
  72. cout << endl;
  73. }
  74.  
  75. void push_back(int _data)
  76. {
  77. Node* current;
  78. Node* new_node = new Node(_data);
  79. if (head == NULL)
  80. {
  81. head = new_node;
  82. head->next = NULL;
  83. return;
  84. }
  85. current = head;
  86. while (current->next != NULL)
  87. current = current->next;
  88. current->next = new_node;
  89. new_node->prev = current;
  90. new_node->next = NULL;
  91. }
  92.  
  93. void merge(DLlist& list)
  94. {
  95. int main; // Переключатель очереди, определяет какой лист сейчас будет добавлять.
  96. int size_this;
  97. int size_list;
  98. bool HeadChanged = false;
  99. Node* current_this; // Итератор первого листа
  100. Node* current_list; // Итератор второго листа
  101.  
  102. current_this = head;
  103. current_list = list.head;
  104. main = 0;
  105. size_this = 1;
  106. size_list = 1;
  107. while ((current_this != NULL)||(current_list != NULL)) // Пока хотя бы в одном листе есть данные
  108. {
  109. if (main % 2 == 0) // Если остаток от деления на 2 == 0, тогда
  110. {
  111. if (current_this != NULL)
  112. {
  113. Node* buffer = current_this->next;
  114. size_this = size_this++;
  115. if (current_list != NULL)//Если в другом еще есть данные, тогда
  116. {
  117. current_this->next = current_list; //Присоединяем данные из другого листа в этот
  118. current_list->prev = current_this; //Обновляем prev
  119. current_this = buffer; //Идем дальше
  120. if (current_list->prev == head)
  121. {
  122. if (HeadChanged == false)
  123. {
  124. list.head = head;
  125. HeadChanged = true;
  126. }
  127. }
  128. }
  129. else //Иначе, раз в другом данных нет, значит, этот лист имеет "лишние" члены. АХАХАХАХ ЧЛЕНЫ АХАХАХХА.
  130. {
  131. cout << "Extra member:" << current_this->data << endl;
  132. current_this = current_this->next;
  133. }
  134. //if (current_this->next != NULL) // Если есть следующий элемент, то переключаемся на него
  135. // current_this = current_this->next;
  136. //else
  137. // current_this = NULL;
  138.  
  139. }
  140. main = main++;
  141. }
  142. else // Иначе, если == 1, тогда
  143. {
  144. if (current_list != NULL)
  145. {
  146. Node* buffer = current_list->next;
  147. size_list = size_list++;
  148. if (current_this != NULL)
  149. {
  150. current_list->next = current_this;
  151. current_this->prev = current_list;
  152. current_list = buffer;
  153. }
  154. else
  155. {
  156. cout << "Extra member:" << current_list->data << endl;
  157. current_list = current_list->next;
  158. }
  159. //if (current_list->next != NULL) // Если есть следующий элемент, то переключаемся на него
  160. // current_list = current_list->next;
  161. //else
  162. // current_list = NULL;
  163. }
  164. main = main++;
  165. }
  166. }
  167. cout << "Total = " << abs(size_list - size_this) << endl;
  168. }
  169. };
  170.  
  171. void main()
  172. {
  173. DLlist A;
  174. DLlist B;
  175. for (int i = 1; i < 4; i++)
  176. {
  177. A.push_back(i);
  178. }
  179. A.Print();
  180.  
  181. for (int i = 1; i < 5; i++)
  182. {
  183. B.push_back(i*10);
  184. }
  185. B.Print();
  186. A.merge(B);
  187. A.Print();
  188. B.Print();
  189.  
  190. A.DeleteList();
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement