Advertisement
Guest User

Untitled

a guest
May 16th, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.53 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<conio.h>
  4. #include <iostream>
  5.  
  6. //#include "stdafx.h"
  7.  
  8. using namespace std;
  9.  
  10. struct mylist//структура-звено списка
  11. {
  12. int x;//значение передается в список
  13. mylist *prev, *next;//указатели на адреса предыдущ и следующего
  14. };
  15. class List//создаем тип данных Список
  16. {
  17. mylist *Head, *Tail;//указатель на первый и последний элемент списка
  18. int size;//переменная,отв за размер
  19. public:
  20. List() :Head(NULL), Tail(NULL) {};//инициализируем адреса как пустые (положили ноль)
  21. ~List();//ссылка на деструктор
  22. void Show();
  23. void Add(int x);
  24. void push_front(int);
  25. int pop_front();
  26. void push_back(int data);
  27. int pop_back();
  28. int Size();
  29. void split(List &, int choise);
  30. void merge(List, List, List &);
  31. void Clear();
  32. int Resize(int choise);
  33.  
  34. };
  35. List::~List()
  36. {
  37. while (Head!=NULL)
  38. {
  39. Tail = Head->next;//резервная копия следующего элемента списка
  40. delete Head;//очистка первого элемента
  41. Head = Tail;//смена адреса начала на адрес след элемента
  42. }
  43. }
  44. void List::Add(int x)
  45. {
  46. mylist *temp = new mylist;//выделение памяти под повый элемент сттуктуры
  47. temp->next = NULL;//изначально адрес след элемента 0
  48. temp->x = x;
  49. size++;
  50. if (Head != NULL)
  51. {
  52. temp->prev = Tail;
  53. Tail->next = temp;
  54. Tail = temp;
  55. }
  56. else
  57. {
  58. temp->prev = NULL;
  59. Head = Tail = temp;
  60. }
  61.  
  62. }
  63.  
  64. void List::Show()//выводим эхлементы с конца
  65. {
  66. mylist *temp1 = Head;//на новой белой карточке пишем хвост
  67. while (temp1 != NULL)
  68. {
  69. cout << temp1->x << endl;
  70. temp1 = temp1->next;
  71. }
  72. }
  73.  
  74. int List::Size()
  75. {
  76. int y;//счетчик карточек
  77. mylist* temp2 = Head;//наложим наш шаблон на первую карточку
  78. while (temp2 != NULL)//пока наш шаблон не наткнется на ноль
  79. {
  80. ++y;
  81. temp2 = temp2->next;//передвигаем шаблон
  82. }
  83. return y;
  84. }
  85.  
  86. int List::Resize(int choise)//choise кол-во элементов,которое мы хотим выкинуть
  87. {
  88. mylist* temp3 = Head;
  89. for (int i=0; i<choise; i++)//до тех пор пока ... выкидываем
  90. {
  91. temp3 = Head->next;//резервная копия следующего элемента списка
  92. delete Head;//очистка первого элемента
  93. Head = temp3;//смена адреса начала на адрес след элемента
  94. }
  95.  
  96. }
  97.  
  98. //очистить список (скопированна прога конструктор)
  99.  
  100. void List::Clear()
  101. {
  102.  
  103. while (Head!=NULL)
  104. {
  105. Tail = Head->next;//резервная копия следующего элемента списка
  106. delete Head;//очистка первого элемента
  107. Head = Tail;//смена адреса начала на адрес след элемента
  108. }
  109. }
  110.  
  111. // перед head кладем еще одну карточку
  112.  
  113. void List::push_front(int data)// data то ,что кладем в x
  114. {
  115. size++;//размер списка увеличили на одну позицию
  116. mylist* temp = new mylist; //берем новый шаблон
  117. temp->x = data;
  118. if (Head != NULL)
  119. {
  120. temp->next = Head;
  121. Head->prev = temp;
  122. Head = temp;
  123. }
  124. else//если наша карточка первая
  125. {
  126. temp->prev = NULL;
  127. temp->next = NULL;
  128. Head = Tail = temp;
  129. }
  130. }
  131. // Удаляет карточку, находящийся в начале списка и он выдает на экран что он удалил
  132. int List::pop_front()
  133. {
  134. if (Head != NULL)
  135. {
  136. int t = Head->x;//берем х из головы и приравниваем к т
  137. mylist* temp = Head;// скопировали информацию о голове в новую карточку
  138. Head = temp->next;//переместили голову на одну позицию вперед
  139. delete[] temp;// удалили бывшую первую карточку
  140. size--;
  141. return t;//вывели значение бывшего первого элемента
  142.  
  143. }
  144. }
  145. // Вставляет объект как нижний элемент дека
  146. void List::push_back(int data)
  147. {
  148. size++;
  149. mylist* temp = new mylist;
  150. if (Head != NULL)
  151. {
  152. mylist* Tail = new mylist;
  153. for (mylist*i = Head; i != NULL; i = i->next){
  154. if (i->next == NULL)
  155. Tail = i;
  156. }
  157. Tail->next = temp;
  158. temp->prev = Tail;
  159. Tail = temp;
  160. }
  161. else
  162. {
  163. temp->prev = NULL;
  164. temp->next = NULL;
  165. Head = Tail = temp;
  166. }
  167. }
  168. // Удаляет и возвращает объект, находящийся в конце дека
  169. int List::pop_back()
  170. {
  171. if (Head)
  172. {
  173. mylist* Tail = new mylist;
  174. for (mylist*i = Head; i != NULL; i = i->next){
  175. if (i->next == NULL)
  176. Tail = i;
  177. }
  178. int t = Tail->x;
  179. mylist* temp = Tail;
  180. Tail = temp->prev;
  181. Tail->next = NULL;
  182. delete[] temp;
  183. size--;
  184. return t;
  185. }
  186. }
  187. //функция кторая объединяет два списка
  188. void List::merge(List l1, List l2,List& l3)
  189. {
  190. mylist *temp1, *temp2;//mylist-тип шаблона,названия шаблонов
  191. temp1 = l1.Head;//temp 1= голова первого списка
  192. temp2 = l2.Head;//temp 2= голова второго списка
  193.  
  194. int dat;//переменная для хранения инф о карточке
  195. if (temp1==NULL && temp2 == NULL) cout<<"NULL"<<endl;
  196. while(temp1!=NULL)//пока шаблоны не утыкаются в пустоту
  197. {
  198.  
  199. dat = temp1->x;
  200. l3.Add(dat);//в список 3 добавили x из первго шаблона
  201. temp1 = temp1->next;//прогнали все карточки 1 списка
  202.  
  203. }
  204. while (temp2!=NULL)
  205. {
  206. dat = temp2->x;
  207. l3.Add(dat);
  208. temp2 = temp2->next;
  209. }
  210.  
  211.  
  212. }
  213. //функция разделения на два списка
  214.  
  215. void List::split(List& l2, int choice)//choice-сколько элементов будет в одном из списков
  216. {
  217. mylist *temp1 = new mylist;//первую пустую карточку наполняем данными из Head
  218. mylist *temp2 = new mylist;
  219. if (Head == NULL)
  220. {
  221. cout<<"No data for splitting" <<endl;
  222. return;//выбросит из функции
  223. }
  224. int dat;
  225. for (int i = 0; i < choice; i++)
  226. {
  227. dat = Head->x;
  228. l2.Add(dat);
  229. Head = Head->next;
  230. }
  231. }
  232.  
  233.  
  234. int main()
  235. {
  236. //system("CLS");
  237. List d;
  238. d.Add(100);
  239. d.Add(1000);
  240. d.Add(200);
  241. d.Add(400);
  242. List l;
  243. d.split(l, 1);
  244. List k;
  245. List m;
  246. //k.Add(1);
  247. //k.Add(2);
  248. //k.Add(3);
  249. //k.Add(4);
  250. /*k.push_back(3);
  251. k.push_back(4);
  252. k.push_front(5);
  253. k.push_front(6);*/
  254. //m.merge(d, k,m);
  255. d.Show();
  256. l.Show();
  257. k.~List();
  258. m.~List();
  259. d.~List();
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement