Advertisement
J00ker

Untitled

Nov 8th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.83 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct Nod {
  6.     int val;
  7.     Nod *next = NULL;
  8. };
  9.  
  10. struct Lista {
  11.     Nod *prim = NULL, *ult = NULL, *p = NULL;
  12.     /// int lg = 0;
  13.  
  14.     void AdaugareInceput(int x) {
  15.         /// if(lg == 0) {
  16.         if(prim == NULL) {
  17.             prim = new Nod;
  18.             prim->val = x;
  19.             prim->next = NULL;
  20.             ult = prim;
  21.         }
  22.         else {
  23.             p = new Nod;
  24.             p->val = x;
  25.             p->next = prim;
  26.             prim = p;
  27.         }
  28.         /// lg++;
  29.     }
  30.  
  31.     void AdaugareSfarsit(int x) {
  32.         /// if(lg == 0) {
  33.         if(ult == NULL) {
  34.             ult = new Nod;
  35.             ult->val = x;
  36.             ult->next = NULL;
  37.             prim = ult;
  38.         }
  39.         else {
  40.             p = new Nod;
  41.             p->val = x;
  42.             p->next = NULL;
  43.             ult->next = p;
  44.             ult = p;
  45.         }
  46.         /// lg++;
  47.     }
  48.  
  49.     void Afisare() {
  50.         cout << "\n";
  51.  
  52.         p = prim;
  53.         while(p != NULL) {
  54.             cout << p->val << " ";
  55.             p = p->next;
  56.         }
  57.  
  58.         cout << "\n";
  59.     }
  60.  
  61.     int CautareDupaValoare(int v) {
  62.         int poz = 1;
  63.  
  64.         p = prim;
  65.         while(p != NULL) {
  66.             if(p->val == v) return poz;
  67.             p = p->next;
  68.             poz++;
  69.         }
  70.  
  71.         return -1;
  72.     }
  73.  
  74.     int CautareDupaPozitie(int poz) {
  75.         if(poz < 1) return -1;
  76.         int poz2 = 1;
  77.  
  78.         p = prim;
  79.         while(p != NULL) {
  80.             if(poz == poz2) return p->val;
  81.             p = p->next;
  82.             poz2++;
  83.         }
  84.  
  85.         return -1;
  86.     }
  87.  
  88.     void AdaugareDupaValoare(int v, int x) {
  89.         p = prim;
  90.         while(p != NULL) {
  91.             if(p->val == v) {
  92.                 Nod *aux = new Nod;
  93.                 aux->val = x;
  94.                 aux->next = p->next;
  95.  
  96.                 p->next = aux;
  97.  
  98.                 if(p == ult) ult = aux;
  99.  
  100.                 return;
  101.             }
  102.             p = p->next;
  103.         }
  104.     }
  105.  
  106.     void AdaugareDupaPozitie(int poz, int x) {
  107.         if(poz < 1) return;
  108.  
  109.         int poz2 = 1;
  110.  
  111.         p = prim;
  112.         while(p != NULL) {
  113.             if(poz == poz2) {
  114.                 Nod *aux = new Nod;
  115.                 aux->val = x;
  116.                 aux->next = p->next;
  117.  
  118.                 p->next = aux;
  119.  
  120.                 if(p == ult) ult = aux;
  121.  
  122.                 return;
  123.             }
  124.             p = p->next;
  125.             poz2++;
  126.         }
  127.     }
  128.  
  129.     void StergereDupaValoare(int v) {
  130.         Nod *prev;
  131.  
  132.         p = prev = prim;
  133.         while(p != NULL) {
  134.             if(p->val == v) {
  135.                 if(p == prim && p == ult) {
  136.                     prim = ult = p->next; /// NULL
  137.                     delete p;
  138.                     return;
  139.                 }
  140.                 if(p == prim) {
  141.                     prim = p->next;
  142.                     delete p;
  143.                     return;
  144.                 }
  145.                 if(p == ult) {
  146.                     ult = prev;
  147.                     delete p;
  148.                     return;
  149.                 }
  150.  
  151.                 prev->next = p->next;
  152.                 delete p;
  153.             }
  154.             prev = p;
  155.             p = p->next;
  156.         }
  157.     }
  158.  
  159.     void StergereDupaPozitie(int poz) {
  160.         if(poz < 1) return;
  161.  
  162.         Nod *prev;
  163.         int poz2 = 1;
  164.  
  165.         p = prev = prim;
  166.         while(p != NULL) {
  167.             if(poz == poz2) {
  168.                 if(p == prim && p == ult) {
  169.                     prim = ult = p->next; /// NULL
  170.                     delete p;
  171.                     return;
  172.                 }
  173.                 if(p == prim) {
  174.                     prim = p->next;
  175.                     delete p;
  176.                     return;
  177.                 }
  178.                 if(p == ult) {
  179.                     ult = prev;
  180.                     ult->next = NULL;
  181.                     delete p;
  182.                     return;
  183.                 }
  184.  
  185.                 prev->next = p->next;
  186.                 delete p;
  187.             }
  188.             poz2++;
  189.             prev = p;
  190.             p = p->next;
  191.         }
  192.     }
  193.  
  194. };
  195.  
  196. /// 1
  197. void InserareMedii() {
  198.     Lista L;
  199.     int n, x;
  200.     cout << "n = "; cin >> n;
  201.  
  202.     for(int i = 1; i <= n; i++) {
  203.         cin >> x;
  204.         L.AdaugareSfarsit(x);
  205.     }
  206.     L.Afisare();
  207.  
  208.     int med, poz = 1;
  209.     Nod *p = L.prim;
  210.     while(p->next != NULL) {
  211.         med = (p->val + p->next->val) / 2;
  212.  
  213.         L.AdaugareDupaPozitie(poz, med);
  214.  
  215.         p = p->next->next;
  216.         poz += 2;
  217.     }
  218.     L.Afisare();
  219. }
  220.  
  221. /// 2
  222. void InserareSortata() {
  223.     Lista L;
  224.     int n, x, poz;
  225.     Nod *p;
  226.  
  227.     cout << "n = "; cin >> n;
  228.     for(int i = 1; i <= n; i++) {
  229.         cin >> x;
  230.         if((L.prim == NULL) || (x <= L.prim->val)) L.AdaugareInceput(x);
  231.         else {
  232.             p = L.prim;
  233.             poz = 1;
  234.  
  235.             while(p != NULL && p->val < x) {
  236.                 p = p->next;
  237.                 poz++;
  238.             }
  239.  
  240.             if(p == NULL) L.AdaugareSfarsit(x);
  241.             else          L.AdaugareDupaPozitie(poz - 1, x);
  242.         }
  243.         L.Afisare();
  244.     }
  245.  
  246. }
  247.  
  248. /// 3
  249. Nod *Inv(Nod *p) {
  250.     if(p->next == NULL) return p;
  251.     else {
  252.         Nod *n = Inv(p->next);
  253.         n->next = p;
  254.         p->next = NULL;
  255.     }
  256. }
  257.  
  258. void InversareLista() {
  259.     Lista L;
  260.     int n, x;
  261.     cout << "n = "; cin >> n;
  262.  
  263.     for(int i = 1; i <= n; i++) {
  264.         cin >> x;
  265.         L.AdaugareSfarsit(x);
  266.     }
  267.     L.Afisare();
  268.  
  269.     Inv(L.prim);
  270.  
  271.     swap(L.prim, L.ult);
  272.  
  273.     L.Afisare();
  274.  
  275. }
  276.  
  277. /// 4
  278. void InterclasareListe() {
  279.     Lista A, B;
  280.     int n, m, x;
  281.  
  282.     cout << "n = "; cin >> n;
  283.     for(int i = 1; i <= n; i++) {
  284.         cin >> x;
  285.         A.AdaugareSfarsit(x);
  286.     }
  287.     A.Afisare();
  288.  
  289.     cout << "m = "; cin >> m;
  290.     for(int i = 1; i <= m; i++) {
  291.         cin >> x;
  292.         B.AdaugareSfarsit(x);
  293.     }
  294.     B.Afisare();
  295.  
  296.     Nod *pA, *pB, *pAux;
  297.     pA = A.prim;
  298.     pB = B.prim;
  299.  
  300.     while(pA != NULL && pB != NULL) {
  301.         if(pA->val <= pB->val) {
  302.             pAux = pA->next;
  303.             pA->next = pB;
  304.             pA = pAux;
  305.         }
  306.         else {
  307.             pAux = pB->next;
  308.             pB->next = pA;
  309.             pB = pAux;
  310.         }
  311.         //A.Afisare();
  312.         //B.Afisare();
  313.     }
  314.  
  315.     if(A.prim->val < B.prim->val) A.Afisare();
  316.     else B.Afisare();
  317. }
  318.  
  319. /// 5
  320. void SumaNumereMari() {
  321.     Lista A, B, C;
  322.     char nr[100];
  323.  
  324.     cout << "A = "; cin >> nr;
  325.     for(int i = 0; i < strlen(nr); i++)
  326.         A.AdaugareInceput(nr[i] - '0');
  327.  
  328.     cout << "B = "; cin >> nr;
  329.     for(int i = 0; i < strlen(nr); i++)
  330.         B.AdaugareInceput(nr[i] - '0');
  331.  
  332.     int mem = 0, s;
  333.     Nod *pA = A.prim, *pB = B.prim;
  334.     while(pA != NULL && pB != NULL) {
  335.         s = pA->val + pB->val + mem;
  336.  
  337.         C.AdaugareInceput(s % 10);
  338.         mem = s / 10;
  339.  
  340.         pA = pA->next;
  341.         pB = pB->next;
  342.     }
  343.     while(pA != NULL) {
  344.         s = pA->val + mem;
  345.  
  346.         C.AdaugareInceput(s % 10);
  347.         mem = s / 10;
  348.  
  349.         pA = pA->next;
  350.     }
  351.     while(pB != NULL) {
  352.         s = pB->val + mem;
  353.  
  354.         C.AdaugareInceput(s % 10);
  355.         mem = s / 10;
  356.  
  357.         pB = pB->next;
  358.     }
  359.  
  360.     C.Afisare();
  361. }
  362.  
  363. /// 6
  364. void ProdusNumereMari() {
  365.     Lista A;
  366.     int B;
  367.     char nr[100];
  368.  
  369.     cout << "A = "; cin >> nr;
  370.     for(int i = 0; i < strlen(nr); i++)
  371.         A.AdaugareInceput(nr[i] - '0');
  372.  
  373.     cout << "B = "; cin >> B;
  374.  
  375.     int mem = 0, s;
  376.     Nod *pA = A.prim;
  377.     while(pA != NULL) {
  378.         s = pA->val * B + mem;
  379.  
  380.         pA->val = s % 10;
  381.         mem = s / 10;
  382.  
  383.         pA = pA->next;
  384.     }
  385.     while(mem) {
  386.         A.AdaugareSfarsit(mem % 10);
  387.         mem /= 10;
  388.     }
  389.  
  390.     A.Afisare();
  391. }
  392.  
  393. /// 7
  394. void ProdusNumereMari2() {
  395.     Lista A, B, C;
  396.     char nr[100];
  397.     int c_len = 0;
  398.  
  399.     Nod *pA, *pB, *pC;
  400.     Nod *poz;
  401.  
  402.     cout << "A = "; cin >> nr;
  403.     for(int i = 0; i < strlen(nr); i++)
  404.         A.AdaugareInceput(nr[i] - '0');
  405.     c_len = strlen(nr);
  406.  
  407.     cout << "B = "; cin >> nr;
  408.     for(int i = 0; i < strlen(nr); i++)
  409.         B.AdaugareInceput(nr[i] - '0');
  410.     c_len *= strlen(nr);
  411.  
  412.     for(int i = 1; i <= c_len; i++)
  413.         C.AdaugareInceput(0);
  414.  
  415.     int mem;
  416.     pB = B.prim;
  417.     pC = C.prim;
  418.     while(pB != NULL) {
  419.         mem = 0;
  420.  
  421.         pA = A.prim;
  422.         poz = pC;
  423.         while(pA != NULL) {
  424.             poz->val += ((pA->val * pB->val) + mem) % 10;
  425.             mem = ((pA->val * pB->val) + mem) / 10;
  426.  
  427.             pA = pA->next;
  428.             poz = poz->next;
  429.         }
  430.  
  431.         pB = pB->next;
  432.         pC = pC->next;
  433.         C.Afisare();
  434.     }
  435. }
  436.  
  437. int main() {
  438.     /*
  439.     InserareMedii();
  440.     InserareSortata();
  441.     InversareLista();
  442.     InterclasareListe();
  443.     SumaNumereMari();
  444.     ProdusNumereMari();
  445.     */
  446.     ProdusNumereMari2();
  447.     return 0;
  448. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement