Tucancitto

Lab2 - Pb7

Mar 18th, 2021 (edited)
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.48 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. struct NOD
  4. {
  5.     int info;
  6.     NOD* next;
  7. };
  8.  
  9. struct LISTA
  10. {
  11.     NOD* FIRST = NULL, * LAST = NULL;
  12.     int NR_ELEM = 0;
  13.  
  14.     void ADD_FIRST(int key)
  15.     {
  16.         NOD* x = new NOD;
  17.         x->info = key;
  18.         x->next = NULL;
  19.         FIRST = x;
  20.         LAST = x;
  21.     }
  22.  
  23.     void PUSH_FRONT(int key)
  24.     {
  25.         if (EMPTY())
  26.             ADD_FIRST(key);
  27.         else
  28.         {
  29.             NOD* newFRONT = new NOD;
  30.             newFRONT->info = key;
  31.             newFRONT->next = FIRST;
  32.             FIRST = newFRONT;
  33.         }
  34.         NR_ELEM++;
  35.     }
  36.  
  37.     void PUSH_BACK(int key)
  38.     {
  39.         if (EMPTY())
  40.             ADD_FIRST(key);
  41.         else
  42.         {
  43.             NOD* newLAST = new NOD;
  44.             newLAST->info = key;
  45.             newLAST->next = NULL;
  46.             LAST->next = newLAST;
  47.             LAST = newLAST;
  48.         }
  49.         NR_ELEM++;
  50.     }
  51.  
  52.     NOD* SEARCH(int key)
  53.     {
  54.         NOD* x = new NOD;
  55.         x = FIRST;
  56.         while (x != NULL && x->info != key)
  57.             x = x->next;
  58.         return x;
  59.     }
  60.  
  61.     void ERASE(NOD* node)
  62.     {
  63.         if (node == FIRST)
  64.             FIRST = FIRST->next;
  65.         else
  66.         {
  67.             NOD* prevNode = new NOD;
  68.             prevNode = FIRST;
  69.  
  70.             while (prevNode->next != node)
  71.                 prevNode = prevNode->next;
  72.             prevNode->next = node->next;
  73.         }
  74.         delete node;
  75.     }
  76.  
  77.     void ERASE(int key)
  78.     {
  79.         if (FIRST->info == key)
  80.             FIRST = FIRST->next, NR_ELEM--;
  81.         else
  82.         {
  83.             NOD* x = new NOD;
  84.             x = SEARCH(key);
  85.             if (x != NULL)
  86.             {
  87.                 ERASE(x);
  88.                 NR_ELEM--;
  89.             }
  90.         }
  91.     }
  92.  
  93.     bool EMPTY()
  94.     {
  95.         if (NR_ELEM == 0)
  96.             return 1;
  97.         return 0;
  98.     }
  99.  
  100.     void ERASE_DOUBLES()
  101.     {
  102.         NOD* i = new NOD;
  103.         NOD* copyDel = new NOD;
  104.         i = FIRST;
  105.  
  106.         while (i->next != NULL)
  107.         {
  108.             if (i->info == i->next->info)
  109.             {
  110.                 copyDel = i->next;
  111.                 ERASE(i->info);
  112.                 i = copyDel;
  113.             }
  114.             else
  115.                 i = i->next;
  116.         }
  117.     }
  118.  
  119.     void ERASE(LISTA L)
  120.     {
  121.         for (NOD* i = L.FIRST; i != NULL; i = i->next)
  122.             if (SEARCH(i->info) != NULL)
  123.                 ERASE(i->info);
  124.     }
  125.  
  126.     void CLEAR()
  127.     {
  128.         NOD* del = new NOD;
  129.         del = FIRST;
  130.  
  131.         while (del->next != NULL)
  132.         {
  133.             NOD* copyDel = new NOD;
  134.             copyDel = del->next;
  135.             ERASE(del);
  136.             del = copyDel;
  137.         }
  138.         if (!EMPTY())
  139.             ERASE(del);
  140.  
  141.         NR_ELEM = 0;
  142.     }
  143.  
  144.     void PRINT()
  145.     {
  146.         NOD* x = new NOD;
  147.         x = FIRST;
  148.  
  149.         while (x != NULL)
  150.         {
  151.             std::cout << x->info << ' ';
  152.             x = x->next;
  153.         }
  154.         std::cout << "\n";
  155.     }
  156.  
  157.     // Inseram o noua cheie dupa un element node. Daca lista este goala sau elementul node nu se gaseste, atunci nu inseram elementul
  158.     void INSERT(int key, NOD* node)
  159.     {
  160.         NOD* insert = new NOD;
  161.         insert->info = key;
  162.         insert->next = NULL;
  163.  
  164.         if (FIRST == node)
  165.         {
  166.             insert->next = FIRST;
  167.             FIRST = insert;
  168.         }
  169.         else
  170.         {
  171.             insert->next = node->next;
  172.             node->next = insert;
  173.         }
  174.         NR_ELEM++;
  175.     }
  176.  
  177.     void SORT()
  178.     {
  179.         for (NOD* i = FIRST; i->next != NULL; i = i->next)
  180.             for (NOD* j = i->next; j != NULL; j = j->next)
  181.                 if (i->info > j->info)
  182.                     std::swap(i->info, j->info);
  183.     }
  184. };
  185.  
  186. int main()
  187. {
  188.     LISTA ListaPrincipala;
  189.  
  190.     std::cout << "-----Comenzi-----\n";
  191.     std::cout << "1 pentru adaugare la inceputul listei\n";
  192.     std::cout << "2 pentru adaugare la sfarsitul listei\n";
  193.     std::cout << "3 pentru afisarea elementelor listei\n";
  194.     std::cout << "4 pentru stergerea unui element\n";
  195.     std::cout << "5 pentru a goli lista\n";
  196.     std::cout << "6 pentru a insera o valoare dupa un element dat\n";
  197.     std::cout << "7 pentru a elimina dublurile\n";
  198.     std::cout << "8 pentru a elimina din lista elementele comune cu cele dintr-o alta lista\n";
  199.     std::cout << "0 pentru a iesi din meniu\n\n";
  200.  
  201.     int comandaPrincipala = 0, key;
  202.     do
  203.     {
  204.         std::cout << "Introduceti numarul comenzii: ";
  205.         std::cin >> comandaPrincipala;
  206.  
  207.         if (ListaPrincipala.EMPTY() && comandaPrincipala >= 3)
  208.         {
  209.             if (comandaPrincipala == 5)
  210.                 std::cout << "  Lista era deja goala. \n";
  211.             else
  212.                 if (comandaPrincipala >= 3 && comandaPrincipala <= 8)
  213.                     std::cout << "  Lista este goala. \n";
  214.         }
  215.         else
  216.             switch (comandaPrincipala)
  217.             {
  218.             case 1:
  219.             {
  220.                 std::cout << "  Introduceti valoarea: ";
  221.                 std::cin >> key;
  222.                 ListaPrincipala.PUSH_FRONT(key);
  223.                 std::cout << "  Am adaugat valoarea " << key << " la inceputul listei. \n";
  224.                 break;
  225.             }
  226.             case 2:
  227.             {
  228.                 std::cout << "  Introduceti valoarea: ";
  229.                 std::cin >> key;
  230.                 ListaPrincipala.PUSH_BACK(key);
  231.                 std::cout << "  Am adaugat valoarea " << key << " la sfarsitul listei. \n";
  232.                 break;
  233.             }
  234.             case 3:
  235.             {
  236.                 std::cout << "  Elementele listei: ";
  237.                 ListaPrincipala.PRINT();
  238.                 break;
  239.             }
  240.             case 4:
  241.             {
  242.                 std::cout << "  Introduceti valoarea pe care doriti sa o stergeti: ";
  243.                 std::cin >> key;
  244.                 if (ListaPrincipala.SEARCH(key) != NULL)
  245.                 {
  246.                     ListaPrincipala.ERASE(key);
  247.                     std::cout << "  Am eliminat " << key << " din lista. \n";
  248.                 }
  249.                 else
  250.                     std::cout << "  Nu s-a gasit niciun element in lista cu cheia " << key << ". \n";
  251.                 break;
  252.             }
  253.             case 5:
  254.             {
  255.                 ListaPrincipala.CLEAR();
  256.                 std::cout << "Am golit lista. \n";
  257.                 break;
  258.             }
  259.             case 6:
  260.             {
  261.                 int element;
  262.                 std::cout << "  Introduceti valoarea de inserat si cheia elementului din lista dupa care dorim sa inseram: ";
  263.                 std::cin >> key >> element;
  264.                 if (ListaPrincipala.SEARCH(element))
  265.                 {
  266.                     ListaPrincipala.INSERT(key, ListaPrincipala.SEARCH(element));
  267.                     std::cout << "  Am introdus " << key << " in lista. \n";
  268.                 }
  269.                 else
  270.                     std::cout << "  Nu exista elementul " << element << ". Nu am putut insera valoarea " << key << " in lista. \n";
  271.                 break;
  272.             }
  273.             case 7:
  274.             {
  275.  
  276.                 ListaPrincipala.SORT();
  277.                 ListaPrincipala.ERASE_DOUBLES();
  278.                 std::cout << "  Am sortat lista si am eliminat dublurile. \n";
  279.  
  280.                 break;
  281.             }
  282.             case 8:
  283.             {
  284.                 LISTA ListaSecundara;
  285.                 int dimensiune, comandaSecundara;
  286.                 std::cout << "  A doua lista: \n";
  287.                 std::cout << "  Introduceti numarul de elemente pe care le are lista: ";
  288.                 std::cin >> dimensiune;
  289.  
  290.                 std::cout << "      1 pentru adaugarea la inceput\n";
  291.                 std::cout << "      2 pentru adaugarea la sfarsit\n";
  292.                 while (dimensiune)
  293.                 {
  294.                     std::cout << "      Introduceti numarul comenzii si valoarea de introdus: ";
  295.                     std::cin >> comandaSecundara >> key;
  296.                     switch (comandaSecundara)
  297.                     {
  298.                     case 1:
  299.                     {
  300.                         ListaSecundara.PUSH_FRONT(key);
  301.                         break;
  302.                     }
  303.                     case 2:
  304.                     {
  305.                         ListaSecundara.PUSH_BACK(key);
  306.                         break;
  307.                     }
  308.                     }
  309.                     dimensiune--;
  310.                 }
  311.                 std::cout << "  Lista secundara: ";
  312.                 ListaSecundara.PRINT();
  313.                 ListaPrincipala.ERASE(ListaSecundara);
  314.                 ListaSecundara.CLEAR();
  315.                 break;
  316.             }
  317.             }
  318.  
  319.         std::cout << "\n";
  320.     } while (comandaPrincipala != 0);
  321.  
  322.     if (!ListaPrincipala.EMPTY())
  323.         ListaPrincipala.CLEAR();
  324.  
  325.     return 0;
  326. }
Add Comment
Please, Sign In to add comment