Advertisement
Guest User

Untitled

a guest
Mar 20th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.73 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #include <clocale>
  6. #include <iostream>
  7. #include <fstream>
  8. #include <Windows.h>
  9.  
  10. using namespace std;
  11.  
  12. template<typename T>
  13. class List {
  14. public:
  15. List();
  16. ~List();
  17.  
  18. void PopFront();
  19. void PopFrontAll();
  20. void PushFront(T data);
  21. void PushMiddle(T data);
  22. void PushBack(T data);
  23. void Insert(T data, int index);
  24. void RemoveAt(int index);
  25. void FindIndexElement(List<T> &lst);
  26. void FindValueElement(List<T> &lst);
  27. void ShowListValue(List<T> &lst);
  28. void ShowListAdress(List<T> &lst);
  29. void Average(List<T> &lst);
  30. void Menu(List<T> &lst);
  31. int GetSize() { return size; }
  32.  
  33. T& operator[](const int index);
  34.  
  35. private:
  36.  
  37. template<typename T>
  38. class Node
  39. {
  40. public:
  41. Node * pNext;
  42. T data;
  43.  
  44. Node(T data = T(), Node *pNext = nullptr)
  45. {
  46. this->data = data;
  47. this->pNext = pNext;
  48. }
  49. };
  50. int size;
  51. Node<T> *head;
  52. };
  53.  
  54. template<typename T>
  55. List<T>::List()
  56. {
  57. size = 0;
  58. head = nullptr;
  59. }
  60.  
  61. template<typename T>
  62. List<T>::~List()
  63. {
  64. PopFrontAll();
  65. }
  66.  
  67. template<typename T>
  68. void List<T>::PopFront()
  69. {
  70. Node<T> *temp = head;
  71. head = head->pNext;
  72. delete temp;
  73. size--;
  74. }
  75.  
  76. template<typename T>
  77. void List<T>::PopFrontAll()
  78. {
  79. while (size)
  80. {
  81. PopFront();
  82. }
  83. }
  84.  
  85. template<typename T>
  86. void List<T>::PushFront(T data)
  87. {
  88. head = new Node<T>(data, head);
  89. size++;
  90. }
  91.  
  92. template<typename T>
  93. void List<T>::PushMiddle(T data)
  94. {
  95. Insert(data, ceil(double(GetSize() / 2.0)));
  96. }
  97.  
  98. template<typename T>
  99. void List<T>::PushBack(T data)
  100. {
  101. if (head == nullptr)
  102. {
  103. head = new Node<T>(data);
  104. }
  105. else
  106. {
  107. Node<T> *current = this->head;
  108. while (current->pNext != nullptr)
  109. {
  110. current = current->pNext;
  111. }
  112. current->pNext = new Node<T>(data);
  113. }
  114. size++;
  115. }
  116.  
  117. template<typename T>
  118. void List<T>::Insert(T data, int index)
  119. {
  120. if (index == 0)
  121. {
  122. PushFront(data);
  123. }
  124. else
  125. {
  126. Node<T> *previous = this->head;
  127. for (int i = 0; i < index - 1; i++)
  128. {
  129. previous = previous->pNext;
  130. }
  131. previous->pNext = new Node<T>(data, previous->pNext);
  132. size++;
  133. }
  134.  
  135. }
  136.  
  137. template<typename T>
  138. void List<T>::RemoveAt(int index)
  139. {
  140. if (index == 0)
  141. {
  142. PopFront();
  143. }
  144. else
  145. {
  146. Node<T> *previous = this->head;
  147. for (int i = 0; i < index - 1; i++)
  148. {
  149. previous = previous->pNext;
  150. }
  151. Node<T> *toDelete = previous->pNext;
  152. previous->pNext = toDelete->pNext;
  153. delete toDelete;
  154. size--;
  155. }
  156. }
  157.  
  158. template<typename T>
  159. void List<T>::FindIndexElement(List<T> &lst)
  160. {
  161. int indexLst;
  162. cin >> indexLst;
  163. for (int i = 0; i < lst.GetSize(); i++)
  164. {
  165. if (i == indexLst)
  166. {
  167. cout << lst[i] << endl;
  168. }
  169. }
  170. }
  171.  
  172. template<typename T>
  173. void List<T>::FindValueElement(List<T> &lst)
  174. {
  175. int valueLst;
  176. cin >> valueLst;
  177. for (int i = 0; i < lst.GetSize(); i++)
  178. {
  179. if (lst[i] == valueLst)
  180. {
  181. cout << i << endl;
  182. }
  183. }
  184.  
  185. }
  186.  
  187. template<typename T>
  188. void List<T>::ShowListValue(List<T> &lst)
  189. {
  190. for (int i = 0; i < lst.GetSize(); i++)
  191. {
  192. cout << lst[i] << " ";
  193. }
  194. cout << endl << "Всего элементов: " << size;
  195. cout << endl;
  196. }
  197.  
  198. template<typename T>
  199. void List<T>::ShowListAdress(List<T> &lst)
  200. {
  201. for (int i = 0; i < lst.GetSize(); i++)
  202. {
  203. cout << &lst[i] << endl;
  204. }
  205. cout << endl << "Всего элементов: " << size;
  206. cout << endl;
  207. }
  208.  
  209.  
  210. template<typename T>
  211. void List<T>::Average(List<T> &lst)
  212. {
  213. double sum = 0;
  214. for (int i = 0; i < lst.GetSize(); i++)
  215. {
  216. sum += lst[i];
  217. }
  218. sum /= lst.GetSize();
  219. cout << sum;
  220. cout << endl;
  221. }
  222.  
  223. template<typename T>
  224. T & List<T>::operator[](const int index)
  225. {
  226. int counter = 0;
  227. Node<T> *current = this->head;
  228. while (current != nullptr)
  229. {
  230. if (counter == index)
  231. {
  232. return current->data;
  233. }
  234. current = current->pNext;
  235. counter++;
  236. }
  237. }
  238.  
  239.  
  240. void Input()
  241. {
  242. List<int> lst;
  243. int sizeOfLst;
  244. cout << "Введите количество элементов списка: ";
  245. cin >> sizeOfLst;
  246. int valueOfLst;
  247. cout << "Заполните список: ";
  248. for (int i = 0; i < sizeOfLst; i++)
  249. {
  250. cin >> valueOfLst;
  251. lst.PushBack(valueOfLst);
  252. }
  253. lst.Menu(lst);
  254. }
  255.  
  256. void File()
  257. {
  258. List<int> lst;
  259. ifstream fin("E:\\numbers.txt");
  260. int numbers;
  261.  
  262. if (fin.is_open())
  263. {
  264. while (fin >> numbers)
  265. {
  266. lst.PushBack(numbers);
  267. }
  268. }
  269. fin.close();
  270. }
  271.  
  272.  
  273.  
  274.  
  275. void SubMenu()
  276. {
  277. cout << "Выберите программу: \n1:Список (заполняется с клавиатуры)\n2:Список (заполняется из файла)\n3:Графы\n";
  278. char choice = _getch();
  279. switch (choice)
  280. {
  281. case '1':
  282. {
  283. Input();
  284.  
  285. }
  286. case '2':
  287. {
  288. File();
  289. }
  290. case '3':
  291. {
  292.  
  293. }
  294. default:
  295. {
  296.  
  297. }
  298.  
  299. }
  300. }
  301.  
  302. template<typename T>
  303. void List<T>::Menu(List<T> &lst)
  304. {
  305. char choice = _getch();
  306. while (choice != 'x')
  307. {
  308. cout << "Выберите функцию: \n1.Добавить элемент (в начало)\n2.Добавить элемент (в середину)\n3.Удалить элемент\n4.Поиск элемена (по индексу)\n5.Поиск элемента (по значению)\n6.Вывести список\n";
  309. switch (choice)
  310. {
  311. case '1':
  312. {
  313. int number;
  314. cout << "Введите число: ";
  315. cin >> number;
  316. lst.PushFront(number);
  317. break;
  318. }
  319. case '2':
  320. {
  321. int number;
  322. cout << "Введите число: ";
  323. cin >> number;
  324. lst.PushMiddle(number);
  325. break;
  326. }
  327. case '3':
  328. {
  329. int index;
  330. cout << "Укажите индекс элемент";
  331. cin >> index;
  332. lst.RemoveAt(index);
  333. break;
  334. }
  335. case '4':
  336. {
  337. lst.FindIndexElement(lst);
  338. break;
  339. }
  340. default:
  341. break;
  342. }
  343. }
  344. }
  345.  
  346. int main()
  347. {
  348. setlocale(LC_ALL, "Russian");
  349. SubMenu();
  350. return 0;
  351. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement