Advertisement
Guest User

aps2dz1KRAJ

a guest
Oct 22nd, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 20.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cmath>
  4. #include <stack>
  5. #include <queue>
  6.  
  7. using namespace std;
  8.  
  9. const int MAX = 100;
  10.  
  11. class povecanaTabela {
  12.    
  13. private:
  14.    
  15.     int brojElem;
  16.     int zauzetoElem;
  17.     int prosirenje;
  18.     int *niz, *flagNiz;
  19.    
  20.     void sort(int* &niz, int n) {
  21.         for (int i = 0; i < n; i++) {
  22.             for (int j = i; j < n; j++) {
  23.                 if (niz[i] > niz[j]) {
  24.                     int pom = niz[i];
  25.                     niz[i] = niz[j];
  26.                     niz[j] = pom;
  27.                 }
  28.             }
  29.         }
  30.     }
  31.    
  32.     void realociraj() {
  33.         cout << endl << "Doslo je do realokacije tabele!!!" << endl;
  34.         int k = 2 * brojElem;
  35.         int *niz2 = new int[k];
  36.         int *flagNiz2 = new int[k];
  37.        
  38.         for (int i = 0; i < k; i++) {
  39.             niz2[i] = niz[i / 2];
  40.             flagNiz2[i] = (i % 2 ? 0 : 1);
  41.         }
  42.        
  43.         delete[] niz;
  44.         delete[] flagNiz;
  45.         flagNiz = flagNiz2;
  46.         niz = niz2;
  47.         brojElem *= 2;
  48.     }
  49.    
  50.     int ternPret(int key) const {
  51.         int low = 0;
  52.         int high = brojElem - 1;
  53.        
  54.         while (high >= low) {
  55.             int p1 = low + ceil((high - low)) / 3;
  56.             int p2 = high - ceil((high - low)) / 3;
  57.            
  58.             if (key == niz[p1]) {
  59.                 int k = p1;
  60.                 while (flagNiz[k] == 0 and k >= 0) {
  61.                     if (niz[k] != key) break;
  62.                     k--;
  63.                 }
  64.                 if (niz[k] == key and flagNiz[k] == 1) return k;
  65.                 else {
  66.                     while (flagNiz[k] == 0) k++;
  67.                     if (niz[k] == key) return k;
  68.                 }
  69.                
  70.             }
  71.             else if (key == niz[p2]) {
  72.                 int k = p2;
  73.                 while (flagNiz[k] == 0 and k >= 0) {
  74.                     if (niz[k] != key) break;
  75.                     k--;
  76.                 }
  77.                 if (niz[k] == key and flagNiz[k] == 1) return k;
  78.                
  79.             }
  80.             else if (key < niz[p1]) high = p1 - 1;
  81.             else if (key > niz[p1] and key < niz[p2]) {
  82.                 low = p1;
  83.                 high = p2 - 1;
  84.             }
  85.             else if (key > niz[p2]) low = p2 + 1;
  86.         }
  87.        
  88.         int k = low;
  89.         while (k >= 0) {
  90.             if (flagNiz[k] == 1 and niz[k] < key) break;
  91.             k--;
  92.         }
  93.         while (flagNiz[k] == 1 and niz[k] == key) k++;
  94.         if (k == 0 and key < niz[k]) return -1;
  95.         else return k;
  96.     }     //UVEK VRACA ELEMENT IZA KOGA TREBA DA SE UBACI NOVI ELEMENT
  97.    
  98.    
  99.    
  100.    
  101. public:
  102.     ~povecanaTabela() {
  103.         delete[] niz;
  104.         delete[] flagNiz;
  105.     }
  106.     int getBrojElem()const {
  107.         return brojElem;
  108.     }
  109.     int getZauzetoElem()const {
  110.         return zauzetoElem;
  111.     }
  112.     int getProsirenje()const {
  113.         return prosirenje;
  114.     }
  115.    
  116.     void formirajTabelu() {
  117.         cout << "Unesite broj elemenata tabele: " << endl;
  118.         int n;
  119.         cin >> n;
  120.        
  121.         if (n < 1 or n > MAX) {
  122.             cout << "Nevazeci broj elemenata!" << endl;
  123.             return;
  124.         }
  125.        
  126.         int *nizx = new int[n];
  127.         for (int i = 0; i < n; i++) {
  128.             cout << "Unesite " << i + 1 << ". element tabele: ";
  129.             cin >> nizx[i];
  130.         }
  131.         sort(nizx, n);
  132.         cout << "Unesite prosirenje: ";
  133.         int p;
  134.         cin >> p;
  135.        
  136.         int *niz2 = new int[n * p];
  137.         flagNiz = new int[n * p];
  138.        
  139.         for (int i = 0; i < n * p; i++) {
  140.             niz2[i] = nizx[i / p];
  141.             flagNiz[i] = (i % p == 0 ? 1 : 0);
  142.         }
  143.        
  144.         delete[] nizx;
  145.         this->niz = niz2;
  146.         this->brojElem = n * p;
  147.         this->prosirenje = p;
  148.         this->zauzetoElem = n;
  149.         cout << endl << "Tabela uspesno formirana! Ispis: " << endl;
  150.         this->ispisiTabelu();
  151.     }
  152.    
  153.     void ispisiTabelu() const {
  154.         cout << endl;
  155.         for (int i = 0; i < brojElem; i++) {
  156.             cout << niz[i] << "|";
  157.         }
  158.         cout << endl;
  159.         for (int i = 0; i < brojElem; i++) {
  160.             cout << flagNiz[i] << "|";
  161.         }
  162.         cout << endl;
  163.     }
  164.    
  165.    
  166.    
  167.     void ispisiElem(int key) const {
  168.         int k = ternPret(key);
  169.         if (niz[k] == key and flagNiz[k] == 1) {
  170.             cout << "Element " << key << " nadjen na poziciji " << k << "." << endl;
  171.             return;
  172.         }
  173.         else {
  174.             cout << "Nije nadjen element koji ima vrednost " << key << endl;
  175.             return;
  176.         }
  177.     }
  178.    
  179.     void umetanjeKljuca(int key) {
  180.        
  181.         if (zauzetoElem == brojElem) realociraj();
  182.        
  183.         int k = ternPret(key);
  184.        
  185.         if (k == -1) {
  186.             k = 0;
  187.             while (1) {
  188.                 if (flagNiz[k] == 0) break;
  189.                 k++;
  190.             }
  191.             for (int i = k; i > 0; i--) {
  192.                 flagNiz[i] = flagNiz[i - 1];
  193.                 niz[i] = niz[i - 1];
  194.             }
  195.             flagNiz[0] = 1;
  196.             niz[0] = key;
  197.             zauzetoElem++;
  198.             cout << "Kljuc uspesno umetnut na poziciji " << 0 << endl;
  199.             return;
  200.         }
  201.        
  202.         else if (k == brojElem - 1) {
  203.             while (1) {
  204.                 if (flagNiz[k] == 0) break;
  205.                 k--;
  206.             }
  207.             for (int i = k; i < brojElem - 1; i++) {
  208.                 flagNiz[i] = flagNiz[i + 1];
  209.                 niz[i] = niz[i + 1];
  210.             }
  211.             flagNiz[brojElem - 1] = 1;
  212.             niz[brojElem - 1] = key;
  213.             zauzetoElem++;
  214.             cout << "Kljuc uspesno umetnut na poziciji " << brojElem - 1 << endl;
  215.             return;
  216.         }
  217.        
  218.         if (k != brojElem - 1 and k!=-1) k++; //pozicija gde treba da stavimo element
  219.         int poz = k;
  220.        
  221.         if (flagNiz[k] == 0) {
  222.             niz[k] = key;
  223.             flagNiz[k] = 1;
  224.             k++;
  225.             while (flagNiz[k] == 0 and k < brojElem) {
  226.                 niz[k] = key;
  227.                 k++;
  228.             }
  229.             zauzetoElem++;
  230.             cout << "Kljuc uspesno umetnut na poziciji " << poz << endl;
  231.             return;
  232.         }
  233.        
  234.         // trazenje mesta udesno
  235.        
  236.         else {
  237.             while (k < brojElem - 1) {
  238.                 if (flagNiz[k] == 0) break;
  239.                 k++;
  240.             }
  241.             if (flagNiz[k] == 0) {
  242.                 for (int i = k; i > poz; i--) {
  243.                     niz[i] = niz[i - 1];
  244.                     flagNiz[i] = flagNiz[i - 1];
  245.                 }
  246.                 niz[poz] = key;
  247.                 flagNiz[poz] = 1;
  248.                 zauzetoElem++;
  249.                 cout << "Kljuc uspesno umetnut na poziciji " << poz << endl;
  250.                 return;
  251.             }
  252.            
  253.             // trazenje mesta ulevo
  254.            
  255.             poz--;
  256.            
  257.             while (k >= 0) {
  258.                 if (flagNiz[k] == 0) break;
  259.                 k--;
  260.             }
  261.            
  262.             if (flagNiz[k] == 0) {
  263.                 for (int i = k; i < poz; i++) {
  264.                     niz[i] = niz[i + 1];
  265.                     flagNiz[i] = flagNiz[i + 1];
  266.                 }
  267.                 niz[poz] = key;
  268.                 flagNiz[poz] = 1;
  269.                 zauzetoElem++;
  270.                 cout << "Kljuc uspesno umetnut na poziciji " << poz << endl;
  271.                 return;
  272.             }
  273.         }
  274.     }
  275.    
  276.     void brisanjeKljuca(int key) {
  277.         int k = ternPret(key);
  278.         if (niz[k] == key and flagNiz[k] == 1) {
  279.             flagNiz[k] = 0;
  280.             cout << "Uspesno brisanje kljuca na poziciji " << k << endl;
  281.             zauzetoElem--;
  282.             return;
  283.         }
  284.         else {
  285.             cout << "Element nije pronadjen ili je nevazeci! " << endl;
  286.         }
  287.     }
  288.    
  289.     int* nizValidnihElem() const {
  290.         int *nizValidnih = new int[zauzetoElem];
  291.         int cnt = 0;
  292.         for (int i = 0; i < brojElem; i++) {
  293.             if (flagNiz[i]) {
  294.                 nizValidnih[cnt] = niz[i];
  295.                 cnt++;
  296.             }
  297.         }
  298.         cout << "Od sledecih elemenata se pravi stablo:"<<endl;
  299.         for (int i = 0; i < cnt; i++) {
  300.             cout << nizValidnih[i] << " ";
  301.         }
  302.         cout << endl;
  303.         return nizValidnih;
  304.     }
  305. };
  306.  
  307. typedef struct node {
  308.     node *father;
  309.     node *left;
  310.     node *right;
  311.     int val;
  312.     int brojCvorova;
  313. }node;
  314.  
  315. class binarnoStablo {
  316.    
  317. private:
  318.    
  319.     node *root;
  320.     int brojCvorova;
  321.    
  322. public:
  323.    
  324.     ~binarnoStablo() {
  325.        
  326.         queue <node*> q;
  327.         node *p = root;
  328.         q.push(p);
  329.        
  330.         while (!q.empty()) {
  331.             p = q.front();
  332.             q.pop();
  333.             if (p != nullptr) {
  334.                 if (p->left) q.push(p->left);
  335.                 if (p->right) q.push(p->right);
  336.             }
  337.             delete p;
  338.         }
  339.        
  340.     }
  341.    
  342.     node *getRoot() const {
  343.         return root;
  344.     }
  345.     binarnoStablo() {
  346.         brojCvorova = 0;
  347.     }
  348.    
  349.     void dodajCvor(int val) {
  350.         node *n = new node;
  351.         n->val = val;
  352.         n->left = nullptr;
  353.         n->right = nullptr;
  354.         if (brojCvorova == 0) {
  355.             n->father = nullptr;
  356.             root = n;
  357.             brojCvorova++;
  358.             return;
  359.         }
  360.         else {
  361.             node *p = root;
  362.             node *f = nullptr;
  363.             while (p) {
  364.                 if (val == p->val) {
  365.                     cout << endl << "Broj kljuceva koji imaju vrenost " << val << " je povecan za 1!" << endl;
  366.                     p->brojCvorova++;
  367.                     return;
  368.                 }
  369.                 else if (val < p->val) {
  370.                     f = p;
  371.                     p = p->left;
  372.                 }
  373.                 else if (val > p->val) {
  374.                     f = p;
  375.                     p = p->right;
  376.                 }
  377.             }
  378.            
  379.             if (f->val > val) {
  380.                 f->left = n;
  381.             }
  382.             else if (f->val < val) {
  383.                 f->right = n;
  384.             }
  385.             n->father = f;
  386.             brojCvorova++;
  387.             return;
  388.         }
  389.     }
  390.    
  391.     //Ne koristi se
  392.     void formirajStabloRek(int low, int high, int *niz) {
  393.         if (low <= high) {
  394.             int mid = (high + low) / 2;
  395.             dodajCvor(niz[mid]);
  396.             formirajStabloRek(low, mid - 1, niz);
  397.             formirajStabloRek(mid + 1, high, niz);
  398.         }
  399.     }
  400.    
  401.     void formirajStablo(int low, int high, int *niz) {
  402.        
  403.         stack<int>s1;
  404.         stack<int>s2;
  405.         int mid = ceil((low + high) / 2);
  406.         dodajCvor(niz[mid]);
  407.         s1.push(mid + 1);
  408.         s2.push(high);
  409.         high = mid - 1;
  410.         while (low <= high) {
  411.             mid = ceil((low + high) / 2);
  412.             dodajCvor(niz[mid]);
  413.             s1.push(mid + 1);
  414.             s2.push(high);
  415.             high = mid - 1;
  416.         }
  417.         while (!s1.empty()) {
  418.             low = s1.top();
  419.             s1.pop();
  420.             high = s2.top();
  421.             s2.pop();
  422.             if (low <= high) {
  423.                 mid = ceil((low + high) / 2);
  424.                 dodajCvor(niz[mid]);
  425.                 s1.push(mid + 1);
  426.                 s2.push(high);
  427.                 high = mid - 1;
  428.                 while (low <= high) {
  429.                     mid = ceil((low + high) / 2);
  430.                     dodajCvor(niz[mid]);
  431.                     s1.push(mid + 1);
  432.                     s2.push(high);
  433.                     high = mid - 1;
  434.                 }
  435.             }
  436.         }
  437.     }
  438.    
  439.    
  440.     void ispisiStabloX() const {
  441.         int space = (int)pow(brojCvorova, 1.71);
  442.         int level = 0;
  443.        
  444.         queue <node*> q;
  445.         node *p = root;
  446.         q.push(p);
  447.         q.push(nullptr);
  448.         int k1 = 2;
  449.        
  450.         while (!q.empty()) {
  451.             p = q.front();
  452.             q.pop();
  453.             if (p != nullptr) {
  454.                 for (int i = 0; i < space / k1; i++) {
  455.                     cout << " ";
  456.                 }
  457.                 if (p->val != -243){
  458.                     cout << p->val;
  459.                     if (p->left) q.push(p->left);
  460.                     else {
  461.                         node *pom = new node;
  462.                         pom->val = -243; // KARAKTERISTICNA VREDNOST
  463.                         q.push(pom);
  464.                     }
  465.                     if (p->right) q.push(p->right);
  466.                     else {
  467.                         node *pom = new node;
  468.                         pom->val = -243; // KARAKTERISTICNA VREDNOST
  469.                         q.push(pom);
  470.                     }
  471.                 } else {
  472.                     if (p->val == -243) delete p;
  473.                 }
  474.                
  475.             }
  476.             else if (!q.empty()) {
  477.                 level++;
  478.                 q.push(nullptr);
  479.                 cout << endl;
  480.                 k1 = pow(2,level) + 1;
  481.             }
  482.            
  483.         }
  484.        
  485.     }
  486.    
  487.     void ispisiKljuc(int key) const {
  488.        
  489.         cout << "Putanja do trazenog kljuca je: " << endl;
  490.         node *p = root;
  491.         while (p) {
  492.             cout << p->val;
  493.             if (p->val > key) p = p->left;
  494.             else if (p->val < key) p = p->right;
  495.             else if (p->val == key) return;
  496.             cout << "->";
  497.         }
  498.        
  499.         if (p == nullptr) cout << "Nema trazenog elementa!" << endl;
  500.     }
  501.    
  502.     void rotirajCvor(int val) {
  503.        
  504.         node *p = root;
  505.        
  506.         while (p) {
  507.             if (val == p->val) break;
  508.             else if (val < p->val) p = p->left;
  509.             else if (val > p->val) p = p->right;
  510.         }
  511.        
  512.         if (!p) {
  513.             cout << "Nema trazenog cvora! " << endl;
  514.             return;
  515.         }
  516.        
  517.         cout << "Za levu rotaciju unesite 1, a za desnu 2: ";
  518.         int r;
  519.         cin >> r;
  520.         while (r != 1 and r != 2) {
  521.             cout << "Nevalidna vrednost!" << endl;
  522.             cout << "Za levu rotaciju unesite 1, a za desnu 2: ";
  523.             cin >> r;
  524.         }
  525.         if (r == 1) {
  526.            
  527.            
  528.             node *y = p->right;
  529.             if (!y){
  530.                 cout << "Nemoguca rotacija!" << endl;
  531.                 return;
  532.             }
  533.             node *temp = y->left;
  534.             if (p == root) {
  535.                 root = y;
  536.             }
  537.             y->left = p;
  538.             if (p) p->father = y;
  539.             p->right = temp;
  540.             if (temp) temp->father = p;
  541.         }
  542.         else if (r == 2) {
  543.            
  544.             node *y = p->left;
  545.             if (!y){
  546.                 cout << "Nemoguca rotacija!" << endl;
  547.                 return;
  548.             }
  549.             node *temp = y->right;
  550.             if (p == root) {
  551.                 root = y;
  552.             }
  553.             y->right = p;
  554.             if (p) p->father = y;
  555.             p->left = temp;
  556.             if (temp) temp->father = p;
  557.            
  558.         }
  559.        
  560.     }
  561.    
  562. };
  563.  
  564. void konzola() {
  565.     cout << endl << "Unosom rednog broja izaberite komandu: " << endl << endl;
  566.     cout << "1. Pravljenje i inicijalizacija prosirene tabele" << endl;
  567.     cout << "2. Ispisivanje indeksa(pozicije) odredjenog elementa u tabeli" << endl;
  568.     cout << "3. Umetanje odredjenog elementa u tabelu" << endl;
  569.     cout << "4. Brisanje odredjenog elementa iz tabele" << endl;
  570.     cout << "5. Ispis cele tabele" << endl;
  571.     cout << "6. Formiraj binarno stablo prema tabeli" << endl;
  572.     cout << "7. Ispisi binarno stablo" << endl;
  573.     cout << "8. Pronadji zadati kljuc u stablu" << endl;
  574.     cout << "9. Dodaj novi kljuc u stablo" << endl;
  575.     cout << "10. Rotiraj zadati cvor u stablu" << endl;
  576.     cout << "0. Izlazak iz programa" << endl << endl << endl;
  577. }
  578.  
  579.  
  580. int main(void) {
  581.    
  582.     cout << "Dobrodosli u program!!! :) :) :)" << endl;
  583.     int napravljenaTabela = 0;
  584.     int napravljenoStablo = 0;
  585.     povecanaTabela *povTab = nullptr;
  586.     binarnoStablo *binSt = nullptr;
  587.    
  588.    
  589.    
  590.     while (1) {
  591.         konzola();
  592.         cout << "Unesite komandu: ";
  593.         int komanda;
  594.         cin >> komanda;
  595.         int key;
  596.         switch (komanda) {
  597.             case 1:
  598.                 if (napravljenaTabela) {
  599.                     cout << "Tabela je vec napravljena!" << endl;
  600.                     break;
  601.                 }
  602.                 cout << "Formiranje povecane tabele: " << endl;
  603.                 povTab = new povecanaTabela;
  604.                 povTab->formirajTabelu();
  605.                 napravljenaTabela = 1;
  606.                 break;
  607.             case 2:
  608.                 if (!napravljenaTabela) {
  609.                     cout << "Tabela jos ne postoji!" << endl;
  610.                     break;
  611.                 }
  612.                 cout << "Unesite element(key) za pretragu: ";
  613.                 cin >> key;
  614.                 povTab->ispisiElem(key);
  615.                 break;
  616.             case 3:
  617.                 if (!napravljenaTabela) {
  618.                     cout << "Tabela jos ne postoji!" << endl;
  619.                     break;
  620.                 }
  621.                 cout << "Unesite vrednost elementa koji stavljate u tabelu: ";
  622.                 cin >> key;
  623.                 povTab->umetanjeKljuca(key);
  624.                 povTab->ispisiTabelu();
  625.                 break;
  626.             case 4:
  627.                 if (!napravljenaTabela) {
  628.                     cout << "Tabela jos ne postoji!" << endl;
  629.                     break;
  630.                 }
  631.                 cout << "Unesite vrednost(key) elementa za brisanje: ";
  632.                 cin >> key;
  633.                 povTab->brisanjeKljuca(key);
  634.                 povTab->ispisiTabelu();
  635.                 break;
  636.             case 5:
  637.                 if (!napravljenaTabela) {
  638.                     cout << "Tabela jos ne postoji!" << endl;
  639.                     break;
  640.                 }
  641.                 cout << "Ispis cele tabele: " << endl;
  642.                 povTab->ispisiTabelu();
  643.                 break;
  644.             case 6:
  645.                 if (napravljenoStablo) {
  646.                     cout << "Stablo je vec napravljeno!" << endl;
  647.                     break;
  648.                 }
  649.                 else if (!napravljenaTabela) {
  650.                     cout << "Morate prvo napraviti tabelu!" << endl;
  651.                     break;
  652.                 }
  653.                 napravljenoStablo = 1;
  654.                 binSt = new binarnoStablo;
  655.                 binSt->formirajStablo(0, povTab->getZauzetoElem() - 1, povTab->nizValidnihElem());
  656.                 break;
  657.             case 7:
  658.                 if (!napravljenoStablo) {
  659.                     cout << "Stablo jos ne postoji!" << endl;
  660.                     break;
  661.                 }
  662.                 binSt->ispisiStabloX();
  663.                 break;
  664.             case 8:
  665.                 if (!napravljenoStablo) {
  666.                     cout << "Stablo jos ne postoji!" << endl;
  667.                     break;
  668.                 }
  669.                 cout << "Unesite broj koji trazite u stablu: ";
  670.                 cin >> key;
  671.                 binSt->ispisiKljuc(key);
  672.                 break;
  673.             case 9:
  674.                 if (!napravljenoStablo) {
  675.                     cout << "Stablo jos ne postoji!" << endl;
  676.                     break;
  677.                 }
  678.                 cout << "Unesite broj koji dodajete u stablo: ";
  679.                 cin >> key;
  680.                 binSt->dodajCvor(key);
  681.                 break;
  682.             case 10:
  683.                 if (!napravljenoStablo) {
  684.                     cout << "Stablo jos ne postoji!" << endl;
  685.                     break;
  686.                 }
  687.                 cout << "Unesite element oko koga zelite da napravite rotaciju: ";
  688.                 cin >> key;
  689.                 binSt->rotirajCvor(key);
  690.                 cout << endl << "Stanje stabla posle rotiranja: " << endl;
  691.                 binSt->ispisiStabloX();
  692.                 break;
  693.             case 0:
  694.                 delete povTab;
  695.                 delete binSt;
  696.                 exit(1);
  697.                 break;
  698.                
  699.             default:
  700.                 cout << "Nevazeca komanda!!!" << endl;
  701.                 break;
  702.         }
  703.     }
  704. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement