Savelyev_Vyacheslav

Си все про списки v2

Jan 1st, 2021
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.41 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3. class Node
  4. {
  5. int field;
  6. int field2;
  7. class Node *ptr;
  8. friend class List;
  9. };
  10.  
  11. class List
  12. {
  13. Node *head;
  14. int count = 0;
  15. Node* Prev(Node *); // Переход к предыдущему узлу (не интерфейсный метод)
  16. public:
  17. List() { head = NULL; } // Инициализация списка
  18. int getCount() { return count; } // Получение количества узлов списка
  19. bool isEmpty() { return head == NULL; } // Проверка, пуст ли список
  20. int getValue(Node* p) { return p->field; } // Получение значения узла списка
  21. int getValue2(Node* p) { return p->field2; } // Получение значения 2го узла списка
  22. void setValue(Node *p, int val) { p->field = val; } // Установка значения узла списка
  23. Node* getFirst() { return head; } // Получение корневого узла списка
  24. Node* getLast(); // Получение последнего узла списка
  25. void Clear(); // Очистка списка
  26. Node* Next(Node *); // Переход к следующему узлу
  27. Node* Add(int, int, Node*); // Добавление узла списка
  28. Node* Delete(Node*); // Удаление узла списка
  29. void Print(); // Вывод значений узлов списка
  30. void Swap(Node*, Node*); // Взаимообмен двух узлов
  31.  
  32. Node* Nomer_s_kontsa_del(); // удален середина по номеру
  33. Node* Zamena(); // замена
  34. Node* Zamena_ptr(); // замена по указателю
  35. Node* HeadToEnd(); // замена местами по указателю первый назад последний вперед
  36. Node* FILO(); // первый назад
  37. Node* LIFO(); // последний вперед
  38.  
  39. Node* Dobav_n_last(int); // добавить в конец
  40. Node* Dobav_pre_last(); // добавить перед конец
  41. Node* Dobav_head(); // добавить перед конец
  42. Node* Dobav_head_next(); // добавить перед конец
  43.  
  44. Node* head_del(); // udalit golovu
  45. Node* head_next_del(); // udalit 2 s golovu
  46. Node* Delete_end(); // удаляет конец
  47. Node* Delete_prev_end(); // удален предпоследний
  48.  
  49. Node* By_value_del(); // udalit po znacheniu
  50. };
  51.  
  52. Node* List::Add(int num, int num2, Node* node = NULL)
  53. {
  54. Node *elem = new Node();
  55. elem->field = num;
  56. elem->field2 = num2;
  57. count++;
  58. if (node == NULL) // Добавление нового корня
  59. {
  60. if (head == NULL) {
  61. elem->ptr = NULL;
  62. head = elem;
  63. }
  64. else {
  65. elem->ptr = head;
  66. head = elem;
  67. }
  68. return elem;
  69. }
  70. elem->ptr = node->ptr; // Добавление узла после текущего
  71. node->ptr = elem;
  72. return elem;
  73. }
  74.  
  75. Node* List::Delete(Node* node)
  76. {
  77. if (node == NULL) { return NULL; } // В списке нет узлов
  78. count--;
  79. if (node == head) // Удаление корневого узла
  80. {
  81. head = node->ptr;
  82. delete node;
  83. return head;
  84. }
  85. Node* prev = Prev(node); // Удаление промежуточного узла
  86. prev->ptr = node->ptr;
  87. delete node;
  88. return prev;
  89. }
  90. ////////////////
  91. Node* List::Delete_end()
  92. {
  93. Node *temp = NULL;
  94. Node *head2 = head;
  95. if (head2 == NULL) { return NULL; } // В списке нет узлов
  96. count--;
  97. while (head2->ptr != NULL) { // перемотка на последние указатели
  98. temp = head2;
  99. head2 = head2->ptr;
  100. }
  101. if (temp) {
  102. //<udalenie poslednego>
  103. temp->ptr = NULL;
  104. delete head2;
  105. //< /udalenie poslednego>
  106. }
  107. cout << temp->field <<" - " << temp << " - " << temp->ptr << endl;
  108. }
  109. ////////////////
  110. ////////////////
  111. Node* List::Dobav_head()
  112. {
  113. Node *temp = NULL;
  114. Node *head2 = head;
  115. //<opation>
  116. Node *elem2 = new Node();
  117. elem2->field = 88;
  118. elem2->ptr = head2;
  119. head = elem2;
  120. //</opation>
  121. if (head2 == NULL) { return NULL; } // В списке нет узлов
  122. count++;
  123. }
  124. ////////////////
  125. ////////////////
  126. Node* List::Dobav_head_next()
  127. {
  128. Node *t1 = NULL;
  129. Node *t2 = head;
  130. t1 = head;
  131. t2 = t2->ptr;
  132. //<operation>
  133. Node *elem2 = new Node();
  134. elem2->field = 88;
  135. t1->ptr = elem2;
  136. elem2->ptr = t2;
  137. //<operation>
  138. if (t2 == NULL) { return NULL; } // В списке нет узлов
  139. count++;
  140. }
  141. ////////////////
  142. ////////////////
  143. Node* List::Dobav_n_last(int value = 88)
  144. {
  145. Node *temp = NULL;
  146. Node *head2 = head;
  147. if (head2 == NULL) { return NULL; } // В списке нет узлов
  148. count++;
  149. while (head2->ptr != NULL) {
  150. temp = head2;
  151. head2 = head2->ptr;
  152. }
  153. // <operation>
  154. Node *elem2 = new Node();
  155. elem2->field = value;
  156. elem2->ptr = NULL;
  157. head2->ptr = elem2;
  158. // </operation>
  159. cout << head2->field << " test " << head2 << " test " << endl;
  160. cout << head2->ptr->field << " test " << head2->ptr << " test " << endl;
  161. }
  162. ////////////////
  163. /////////////////
  164. Node* List::Dobav_pre_last()
  165. {
  166. Node *temp = NULL;
  167. Node *t = head;
  168. Node *head2 = head;
  169. if (head2 == NULL) { return NULL; } // В списке нет узлов
  170. count--;
  171. while (head2->ptr != NULL) {
  172. head2 = head2->ptr;
  173. t = t->ptr;
  174. if (t->ptr->ptr == NULL) {
  175. temp = t->ptr;
  176. cout << t->field << " test2 " << t << " test2 " << endl;
  177. cout << temp->field << " test2 " << temp->ptr << " test2 " << endl;
  178. //<operation>
  179. Node *elem2 = new Node();
  180. elem2->field = 88;
  181. t->ptr = elem2;
  182. elem2->ptr = temp;
  183. //</operation>
  184. return NULL;
  185. }
  186. }
  187. }
  188. ////////////////
  189. ////////////////
  190. Node* List::Delete_prev_end()
  191. {
  192. count++;
  193. Node *temp = NULL;
  194. Node *head2 = head;
  195. Node *t = head;
  196. Node *t2 = head;
  197. Node *t3 = head;
  198. if (head2 == NULL) { return NULL; } // В списке нет узлов
  199. if (head2->ptr == NULL) { return NULL; } // В списке нет узлов по условию
  200. if (head2->ptr->ptr == NULL) { return NULL; } // В списке нет узлов
  201. count--;
  202. int j = 0;
  203. cout << head2->field << " - " << head2 << " - " << endl;
  204. while (head2->ptr != NULL) {j++;
  205. head2 = head2->ptr;
  206. temp = head2;
  207. t = temp->ptr;
  208. t3 = t->ptr;
  209. cout << temp->field << " - " << temp << " - " << endl;
  210. cout << t->field << " - " << t << " - " << endl;
  211. cout << t3->field << " - " << t3 << " - " << endl;
  212.  
  213. if (head2->ptr->ptr->ptr == NULL) {
  214. //// <operation>
  215. temp->ptr = t3; delete t;
  216. //// </operation>
  217. cout << temp->field << " Проверка " << temp << " - " << endl;
  218. cout << temp->ptr->field << " Проверка " << temp->ptr << " - " << endl;
  219. cout << "temp->ptr->ptr->field" << " Проверка " << temp->ptr->ptr << " - " << endl;
  220. cout << "t3->ptr->field" << " - " << t3->ptr << " - " << endl;
  221. return NULL;
  222. }
  223. }
  224. }
  225. ///////////////////
  226. ////////////////
  227. Node* List::Nomer_s_kontsa_del()
  228. {
  229. count++;
  230. Node *temp = NULL;
  231. Node *head2 = head;
  232. Node *t = head;
  233. Node *t2 = head;
  234. Node *t3 = head;
  235. Node *t4 = head;
  236. int nomer_s_kontsa = 4;
  237. if (head2 == NULL) { return NULL; } // В списке нет узлов
  238. count--;
  239. int i = 0;
  240. int vsego;
  241. while (t2->ptr != NULL) {
  242. t2 = t2->ptr;
  243. i++;
  244. vsego = i;
  245. }
  246. // proverka na sootvetstvie spisku
  247. if ((vsego+1) <= nomer_s_kontsa) { cout << " Nomer ne sootvetstvuet spisku|" << nomer_s_kontsa << "- этого номера нет " << endl; return NULL; }
  248.  
  249. cout << " vsego " << (vsego+1) << " - " << endl;
  250. int j = 0;
  251.  
  252. while (head2->ptr != NULL) {
  253. if (j == (vsego - nomer_s_kontsa)) {
  254. temp = head2;
  255. t = temp ->ptr;
  256. t3 = t->ptr;
  257. //// <perenos ukazatelya udalenie>
  258. temp->ptr = t3; delete t;
  259. //// </ perenos ukazatelya udalenie>
  260. cout << j << " Проверка " << temp << " - " << endl;
  261. head2 = head2->ptr;
  262. }
  263. else {
  264. head2 = head2->ptr;
  265. }
  266. j++;
  267. }
  268. }
  269. ///////////////////
  270. ////////////////
  271. Node* List::By_value_del()
  272. {
  273. Node *temp = NULL;
  274. Node *head2 = head;
  275. Node *t = head;
  276. Node *t2 = head;
  277. Node *t3 = head;
  278. Node *t4 = head;
  279. int value_del = 31;
  280. if (head2 == NULL) { return NULL; } // В списке нет узлов
  281. count--;
  282. int j = 0;
  283. while (head2->ptr != NULL) {
  284. temp = head2;
  285. head2 = head2->ptr;
  286. if (head2->field == value_del) {
  287. t = temp->ptr;
  288. t3 = t->ptr;
  289. //// <operation>
  290. temp->ptr = t3; delete t;
  291. //// </operation>
  292. cout << j << " Проверка " << temp << " - " << endl;
  293. break;
  294. }
  295. else {
  296. }
  297. j++;
  298. }
  299. }
  300. ///////////////////
  301. ////////////////
  302. Node* List::head_next_del()
  303. {
  304. Node *t1 = NULL;
  305. Node *head2 = head;
  306. Node *t2 = head;
  307. Node *t3 = head;
  308. t1 = head;
  309. t2 = t1->ptr;
  310. t3 = t2->ptr;
  311. if (head2 == NULL) { return NULL; } // В списке нет узлов
  312. // <ukazateli dlya operatsii>
  313. cout << t1->field << " - " << t1 << " - " << endl;
  314. cout << t2->field << " - " << t2 << " - " << endl;
  315. cout << t3->field << " - " << t3 << " - " << endl;
  316. // </ukazateli dlya operatsii>
  317. // <operation>
  318. t1->ptr = t3;
  319. t2->ptr = NULL;
  320. delete t2;
  321. // </operation>
  322. // <proverka>
  323. cout << head2->field << " - " << head2 << " - " << endl;
  324. cout << head2->ptr->field << " - " << head2->ptr << " - " << endl;
  325. cout << head2->ptr->ptr->field << " - " << head2->ptr->ptr << " - " << endl;
  326. // </proverka>
  327. }
  328. ////////////////
  329. ////////////////
  330. Node* List::head_del()
  331. {
  332. Node *temp = NULL;
  333. Node *head2 = head;
  334. Node *t = head;
  335. if (head2 == NULL) { return NULL; } // В списке нет узлов
  336. //<operation>
  337. head = head2->ptr;
  338. t = NULL;
  339. delete t;
  340. //</operation>
  341. int i = 0;
  342. while (head2->ptr != NULL) {
  343. temp = head2;
  344. head2 = head2->ptr;
  345. cout << i << " - " << t << " - " << endl;
  346. cout << i << " - " << temp << " - " << endl;
  347. cout << i << " - " << head2->ptr << " - " << endl;
  348. i++;
  349. }
  350. }
  351. ////////////////
  352. ////////////////
  353. Node* List::Zamena_ptr()
  354. {
  355. Node *temp = NULL;
  356. Node *head2 = head;
  357. Node *t = head;
  358. Node *t2 = head;
  359. Node *t3 = head;
  360. Node *t4 = head;
  361. if (head2 == NULL) { return NULL; } // В списке нет узлов
  362. int i = 0;
  363. int n_zameny=5;
  364. while (head2->ptr != NULL) {
  365. t2 = head2;
  366. head2 = head2->ptr;
  367. if (i == (n_zameny-2)) {
  368. temp = head2;
  369. cout << " Замена " << n_zameny << endl;
  370. head2 = head2->ptr;
  371. t3 = temp->ptr;
  372. // <vivod nuzhnih peremennih>
  373. cout << t->field << " - " << t << " - " << endl;
  374. cout << t2->field << " - " << t2 << " - " << endl;
  375. cout << temp->field << " - " << temp << " - " << endl;
  376. cout << t3->field << " - " << t3 << " - " << endl;
  377. // </vivod nuzhnih peremennih>
  378. // </ podstanovka>
  379. t4 = t4->ptr;
  380. t2->ptr = t; t->ptr = t3;
  381. head = temp;
  382. temp->ptr = t4;
  383. // < podstanovka>
  384. // < proverka>
  385. cout << head->field << " 1 " << head << " - " << endl;
  386. cout << t2->field << " n " << t2 << " - " << endl;
  387. cout << t2->ptr->field << " n+1 " << t2->ptr << " - " << endl;
  388. cout << t3->field << " n+2 " << t3 << " - " << endl;
  389. // < proverka>
  390. }
  391. i++;
  392. }
  393. }
  394. ///////////////////
  395. ////////////////
  396. Node* List::HeadToEnd()
  397. {
  398. Node *temp = NULL;
  399. Node *head2 = head;
  400. Node *t = head;
  401. Node *t2 = head;
  402. Node *t3 = head;
  403. Node *t4 = head;
  404. if (head2 == NULL) { return NULL; } // В списке нет узлов
  405. int i = 0;
  406. int n_zameny = 10;
  407. while (head2->ptr != NULL) {
  408. head2 = head2->ptr;
  409. t2 = head2;
  410. if (t2->ptr->ptr->ptr == NULL) {
  411. t2 = head2;
  412. temp = t2->ptr;
  413. cout << " Замена " << n_zameny << endl;
  414. //head2 = head2->ptr;
  415. t3 = temp->ptr;
  416. // <vivod nuzhnih peremennih>
  417. cout << t->field << " - " << t << " - " << endl;
  418. cout << t2->field << " - " << t2 << " - " << endl;
  419. cout << temp->field << " - " << temp << " - " << endl;
  420. cout << t3->field << " - " << t3 << " - " << endl;
  421. // </vivod nuzhnih peremennih>
  422. // </ podstanovka>
  423. t4 = t4->ptr;
  424. head = t3;
  425. t3->ptr = t4;
  426. temp->ptr = t; t->ptr = NULL;
  427. // < podstanovka>
  428. return NULL;
  429. }
  430. i++;
  431. }
  432. }
  433. ///////////////////
  434. ////////////////
  435. Node* List::LIFO()
  436. {
  437. Node *temp = NULL;
  438. Node *head2 = head;
  439. Node *t = head;
  440. Node *tt = head;
  441. Node *t2 = head;
  442. Node *t3 = head;
  443. Node *t4 = head;
  444. if (head2 == NULL) { return NULL; } // В списке нет узлов
  445. int i = 0;
  446. int n_zameny = 10;
  447. while (head2->ptr != NULL) {
  448. head2 = head2->ptr;
  449. t2 = head2;
  450. if (t2->ptr->ptr->ptr == NULL) {
  451. t2 = head2;
  452. temp = t2->ptr;
  453. cout << " Замена " << n_zameny << endl;
  454. //head2 = head2->ptr;
  455. t3 = temp->ptr;
  456. // <vivod nuzhnih peremennih>
  457. cout << t->field << " -- " << t << " - " << endl;
  458. cout << t2->field << " -- " << t2 << " - " << endl;
  459. cout << temp->field << " -- " << temp << " - " << endl;
  460. cout << t3->field << " -- " << t3->ptr << " - " << endl;
  461. // </vivod nuzhnih peremennih>
  462. // </ podstanovka>
  463. head = t3;
  464. t3->ptr = t;
  465. temp->ptr = NULL;
  466. // < podstanovka>
  467. return NULL;
  468. }
  469. i++;
  470. }
  471.  
  472. }
  473. ///////////////////
  474. ////////////////
  475. Node* List::FILO()
  476. {
  477. Node *temp = NULL;
  478. Node *head2 = head;
  479. Node *t = head;
  480. Node *tt = head;
  481. Node *t2 = head;
  482. Node *t3 = head;
  483. Node *t4 = head;
  484. if (head2 == NULL) { return NULL; } // В списке нет узлов
  485. int i = 0;
  486. int n_zameny = 10;
  487. while (head2->ptr != NULL) {
  488. head2 = head2->ptr;
  489. t2 = head2;
  490. if (t2->ptr->ptr->ptr == NULL) {
  491. t2 = head2;
  492. temp = t2->ptr;
  493. cout << " Замена " << n_zameny << endl;
  494. //head2 = head2->ptr;
  495. t3 = temp->ptr;
  496. // <vivod nuzhnih peremennih>
  497. cout << t->field << " -- " << t << " - " << endl;
  498. cout << t2->field << " -- " << t2 << " - " << endl;
  499. cout << temp->field << " -- " << temp << " - " << endl;
  500. cout << t3->field << " -- " << t3->ptr << " - " << endl;
  501. // </vivod nuzhnih peremennih>
  502. // </ podstanovka>
  503. t4 = t4->ptr;
  504. head = t4;
  505. t3->ptr = t;
  506. t->ptr = NULL;
  507. // < podstanovka>
  508. return NULL;
  509. }
  510. i++;
  511. }
  512.  
  513. }
  514. ///////////////////
  515. ////////////////
  516. Node* List::Zamena()
  517. {
  518. Node *temp = NULL;
  519. Node *head2 = head;
  520. Node *t = head;
  521. if (head2 == NULL) { return NULL; } // В списке нет узлов
  522. int i = 0;
  523. int n_zameny;
  524. cout << " Введи номер замены " << endl;
  525. cin >> n_zameny;
  526.  
  527. while (head2->ptr != NULL) {
  528. if (i == (n_zameny-1)) {
  529. temp = head2;
  530. cout << " Замена " << n_zameny << endl;
  531. }
  532. head2 = head2->ptr;
  533. cout << i << " - " << t << " - " << endl;
  534. cout << i << " - " << temp << " - " << endl;
  535. cout << i << " - " << head2->ptr << " - " << endl;
  536. i++;
  537. }
  538. if (temp) {
  539. int zamen1;
  540. zamen1 = temp->field;
  541. temp->field = t->field; // вставляем значение первого в выбранный
  542. t->field = zamen1; // вставляем в первый значение выбранного
  543. }
  544. }
  545. ///////////////////
  546. void List::Print()
  547. {
  548. if (isEmpty()) { cout << "Список пуст" << endl; return; }
  549. Node *p = head;
  550. do {
  551. cout << "(" <<getValue(p)<< " "
  552. //<< getValue2(p)
  553. << ")";
  554. p = Next(p);
  555. } while (p != NULL);
  556. cout << endl;
  557. }
  558.  
  559. void List::Clear()
  560. {
  561. class Node *p = head;
  562. if (p == NULL) return;
  563. do {
  564. Node *d = p;
  565. p = Next(p);
  566. delete d;
  567. } while (p != NULL);
  568. count = 0;
  569. head = NULL;
  570. }
  571.  
  572. Node* List::getLast()
  573. {
  574. Node* p = head;
  575. while (Next(p) != NULL)
  576. p = Next(p);
  577. return p;
  578. }
  579.  
  580. Node* List::Next(Node* node)
  581. {
  582. if (isEmpty()) return NULL;
  583. return node->ptr;
  584. }
  585.  
  586. Node* List::Prev(Node* node)
  587. {
  588. if (isEmpty()) return NULL;
  589. if (node == head) return NULL;
  590. Node *p = head;
  591. while (p->ptr != node)
  592. p = p->ptr;
  593. return p;
  594. }
  595.  
  596. void List::Swap(Node* node1, Node* node2)
  597. {
  598. if (node1 == NULL || node2 == NULL) return;
  599. if (node1 == node2) return;
  600. if (node2->ptr == node1)
  601. {
  602. Node *p = node1;
  603. node1 = node2;
  604. node2 = p;
  605. }
  606. Node *prev1 = Prev(node1);
  607. Node *prev2 = Prev(node2);
  608. Node *next1 = Next(node1);
  609. Node *next2 = Next(node2);
  610. if (next1 == node2)
  611. {
  612. if (prev1 != NULL)
  613. prev1->ptr = node2;
  614. else
  615. head = node2;
  616. node2->ptr = node1;
  617. node1->ptr = next2;
  618. return;
  619. }
  620. if (prev1 != NULL)
  621. prev1->ptr = node2;
  622. else
  623. head = node2;
  624. if (prev2 != NULL)
  625. prev2->ptr = node1;
  626. else
  627. head = node1;
  628. node2->ptr = next1;
  629. node1->ptr = next2;
  630. }
  631.  
  632.  
  633.  
  634. int main()
  635. {
  636. system("chcp 1251");
  637. system("cls");
  638. List list;
  639. list.Print();
  640. Node *s = list.getLast();
  641. for (int i = 0; i < 5; i++) {
  642. int z;
  643. int z2=0;
  644. cout << ">> field1- ";
  645. cin >> z;
  646. //cout << ">> field2- ";
  647. //cin >> z2;
  648. s = list.Add(z, z2, s);
  649. }
  650. //list.Delete_end();
  651. //list.Nomer_s_kontsa_del();
  652. //list.By_value_del();
  653. //list.Delete_prev_end();
  654. //list.head_del();
  655. //list.Zamena();
  656. //list.Zamena_ptr();
  657. //list.head_next_del();
  658. //list.Dobav_n_last();
  659. //list.Dobav_pre_last();
  660. //list.Dobav_head();
  661. //list.Dobav_head_next();
  662. //list.HeadToEnd();
  663. //list.FILO();
  664. list.LIFO();
  665. cout << "***********************" << endl;
  666. list.Print();
  667. cout << "Последний элемент: " << list.getValue(list.getLast()) << endl;
  668. // Удаляем элементы, равные 0
  669. Node *p = list.getFirst();
  670. do {
  671. if (list.getValue(p) == 0)
  672. p = list.Delete(p);
  673. else
  674. p = list.Next(p);
  675. } while (p != NULL);
  676. list.Print();
  677. cout << "В списке " << list.getCount() << " элементов" << endl;
  678. //list.Swap(list.getFirst(), list.getLast());
  679. list.Print();
  680. list.Clear();
  681. list.Print();
  682. cout << "В списке " << list.getCount() << " элементов" << endl;
  683. cin.get(); cin.get();
  684.  
  685. return 0;
  686. }
  687.  
  688.  
Advertisement
Add Comment
Please, Sign In to add comment