O_Egor

Односвязный список (4(4))(+)

Dec 8th, 2019 (edited)
361
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.88 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <string>
  6. #include <set>
  7. #include <map>
  8. #include <iomanip>
  9. using namespace std;
  10.  
  11. #define re return
  12. #define pb push_back
  13. #define eb emplace_back
  14. #define all(x) (x).begin(), (x).end()
  15. #define fi first
  16. #define se second
  17. #define sqrt(x) sqrt(abs(x))
  18. #define pi (3.14159265358979323846264338327950288419716939937510)
  19. #define unique(v) v.resize(unique(all(v)) - v.begin())
  20. #define bipbup ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
  21.  
  22. typedef vector<int> vi;
  23. typedef vector<vi> vvi;
  24. typedef pair<int, int> ii;
  25. typedef vector<ii> vii;
  26. typedef vector<string> vs;
  27. typedef double D;
  28. typedef long double ld;
  29. typedef long long ll;
  30. typedef pair<ll, ll> pll;
  31. typedef vector<ll> vll;
  32. typedef unsigned long long ull;
  33.  
  34. //Задача: на основе односвязного списка книг вывести все книги, в названии которых больше трёх слов, далее
  35. //вывести все книги определённого автора в порядке возрастания даты выхода книги
  36.  
  37. struct element
  38. {
  39.     string fio;
  40.     string title;
  41.     int date, cc = 1;
  42.     element* next;
  43. };
  44. element* beg, * help, * last;
  45. element* beg1, * last1, * help1;
  46.  
  47. int main()
  48. {
  49.     setlocale(LC_ALL, "Russian");
  50.  
  51.     cout << "Введите количество книг: ";
  52.     int n;
  53.     cin >> n;
  54.  
  55.     string trash;
  56.     getline(cin, trash);
  57.  
  58.     int mx_fio(0), mx_title(0);
  59.  
  60.     cout << "Введите автора, название и год выпуска книг (каждый пункт через enter):\n1)\n";
  61.     beg = new element;
  62.     getline(cin, beg->fio);
  63.     getline(cin, beg->title);
  64.     cin >> beg->date;
  65.  
  66.     bool f(0);
  67.     int sz = beg->title.size();
  68.     for (int j = 0; j < sz; ++j)
  69.         if (beg->title[j] == ' ')
  70.             beg->cc++;
  71.     if (beg->cc > 3)
  72.         f = 1;
  73.  
  74.     int szf(beg->fio.size()), szt(beg->title.size());
  75.     mx_fio = max(mx_fio, szf);
  76.     mx_title = max(mx_title, szt);
  77.  
  78.     last = beg;
  79.  
  80.  
  81.     for (int i = 1; i < n; ++i)
  82.     {
  83.         help = new element;
  84.         cout << i + 1 << ")\n";
  85.  
  86.         getline(cin, trash);
  87.         getline(cin, help->fio);
  88.         getline(cin, help->title);
  89.         cin >> help->date;
  90.  
  91.         int sz = help->title.size();
  92.         for (int j = 0; j < sz; ++j)
  93.             if (help->title[j] == ' ')
  94.                 help->cc++;
  95.         if (help->cc > 3)
  96.             f = 1;
  97.  
  98.         szf = help->fio.size();
  99.         szt = help->title.size();
  100.         mx_fio = max(mx_fio, szf);
  101.         mx_title = max(mx_title, szt);
  102.  
  103.         last->next = help;
  104.         last = help;
  105.     }
  106.     last->next = NULL;
  107.     cout << '\n';
  108.  
  109.     last = beg;
  110.     help = beg;
  111.     int k = 1;
  112.     while (help)
  113.     {
  114.         cout << k++ << ") " <<  setw(mx_fio) << help->fio << ' ';
  115.         cout << setw(mx_title) << help->title << ' ';
  116.         cout << help->date << '\n';
  117.         help = help->next;
  118.     }
  119.  
  120.     cout << "\n\n";
  121.  
  122.     if (f)
  123.     {
  124.         cout << "В этой(их) книге(ах) содержится более 3 слов:\n";
  125.         help = beg;
  126.         k = 1;
  127.         while (help)
  128.         {
  129.             if (help->cc > 3)
  130.             {
  131.                 cout << k++ << ") " << setw(mx_fio) << help->fio << ' ';
  132.                 cout << setw(mx_title) << help->title << '\n';
  133.             }
  134.             help = help->next;
  135.         }
  136.     }
  137.     else
  138.         cout << "Названия книг не содержат более 3 слов\n";
  139.  
  140.     cout << "Вы хотите вывести все книги определённого автора в порядке возрастания годов издания? (+/-): ";
  141.     char ans;
  142.     cin >> ans;
  143.     while (ans == '+')
  144.     {
  145.         string f;
  146.         cin >> f;
  147.         help = beg;
  148.         k = 0;
  149.  
  150.         while (help)
  151.         {
  152.             sz = help->fio.size();
  153.             if (help->fio.find(f) < sz)
  154.             {
  155.                 if (k == 0)
  156.                 {
  157.                     beg1 = new element;
  158.                     beg1->fio = help->fio;
  159.                     beg1->title = help->title;
  160.                     beg1->date = help->date;
  161.                     last1 = beg1;
  162.                 }
  163.  
  164.                 else
  165.                 {
  166.                     help1 = new element;
  167.                     help1->fio = help->fio;
  168.                     help1->title = help->title;
  169.                     help1->date = help->date;
  170.                     last1->next = help1;
  171.                     last1 = help1;
  172.                 }
  173.  
  174.                 k++;
  175.             }
  176.  
  177.             help = help->next;
  178.         }
  179.         if(k == 0)
  180.         {
  181.             cout << "Такого автора не существует в введёном Вами списке!\n";
  182.             goto ask;
  183.         }
  184.         if(k == 1)
  185.         {
  186.             cout << k++ << ") " << setw(mx_fio) << beg1->fio << ' ';
  187.             cout << setw(mx_title) << beg1->title << ' ';
  188.             cout << beg1->date << '\n';
  189.             goto ask;
  190.         }
  191.         help1->next = NULL;
  192.  
  193.         help1 = beg1;
  194.         for (int j = 0; j < k - 1; ++j)
  195.         {
  196.             int cnt = 0;
  197.             help1 = beg1;
  198.             for (int cnt = 0; cnt < k - j - 1; ++cnt)
  199.             {
  200.                 if (help1->date > help1->next->date)
  201.                 {
  202.                     swap(help1->date, help1->next->date);
  203.                     swap(help1->cc, help1->next->cc);
  204.                     swap(help1->title, help1->next->title);
  205.                 }
  206.                 help1 = help1->next;
  207.             }
  208.         }
  209.         k = 1;
  210.         help1 = beg1;
  211.         while (help1)
  212.         {
  213.             cout << k++ << ") " << setw(mx_fio) << help1->fio << ' ';
  214.             cout << setw(mx_title) << help1->title << ' ';
  215.             cout << help1->date << '\n';
  216.             help1 = help1->next;
  217.         }
  218.  
  219.         ask:
  220.         cout << "Вы хотите вывести все книги определённого автора в порядке возрастания годов издания ещё раз? (+/-): ";
  221.         cin >> ans;
  222.     }
  223.  
  224.     re 0;
  225. }
  226. /**
  227. 10
  228. Gogol N.V.
  229. Vechera na hytore bliz Dikanki
  230. 1832
  231. Tolstoi L.N.
  232. Voina i Mir
  233. 1805
  234. Griboedov A.S.
  235. Gore ot Yma
  236. 1822
  237. Gogol N.V.
  238. Revizor
  239. 1836
  240. Glykhovskii D.
  241. Metro 2033
  242. 2009
  243. Jules Verne
  244. 80 dnei vokryg sveta
  245. 1872
  246. Gogol N.V.
  247. Mertive Dyshi
  248. 1842
  249. Dostoevskii F.M.
  250. Prestyplenie i Nakazanie
  251. 1866
  252. Tyrgenev A.S.
  253. Otci i Deti
  254. 1861
  255. Gogol N.V.
  256. Peterburgskie povesti
  257. 1835
  258. +
  259. Gogol
  260. -
  261. **/
  262. /**
  263. 8
  264. Tolstoi L.N.
  265. Voina i Mir
  266. 1805
  267. Griboedov A.S.
  268. Gore ot Yma
  269. 1822
  270. Gogol N.V.
  271. Revizor
  272. 1836
  273. Glykhovskii D.
  274. Metro 2033
  275. 2009
  276. Gogol N.V.
  277. Mertive Dyshi
  278. 1842
  279. Dostoevskii F.M.
  280. Prestyplenie i Nakazanie
  281. 1866
  282. Tyrgenev A.S.
  283. Otci i Deti
  284. 1861
  285. Gogol N.V.
  286. Peterburgskie povesti
  287. 1835
  288. **/
Advertisement
Add Comment
Please, Sign In to add comment