Advertisement
Guest User

asp2dz1

a guest
Oct 18th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.06 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <string>
  4. #include <cmath>
  5. #include <stack>
  6. #include <queue>
  7.  
  8. using namespace std;
  9.  
  10. const int MAX = 100;
  11.  
  12. class povecanaTabela {
  13.    
  14. private:
  15.    
  16.     int brojElem;
  17.     int zauzetoElem;
  18.     int prosirenje;
  19.     int *niz, *flagNiz;
  20.    
  21.     void sort(int* &niz, int n) {
  22.         for (int i = 0; i < n; i++) {
  23.             for (int j = i; j < n; j++) {
  24.                 if (niz[i] > niz[j]) {
  25.                     int pom = niz[i];
  26.                     niz[i] = niz[j];
  27.                     niz[j] = pom;
  28.                 }
  29.             }
  30.         }
  31.     }
  32.    
  33.     void realociraj() {
  34.         cout << endl << "Doslo je do realokacije tabele!!!" << endl;
  35.         int k = 2 * brojElem;
  36.         int *niz2 = new int[k];
  37.         int *flagNiz2 = new int[k];
  38.        
  39.         for (int i = 0; i < k; i++) {
  40.             niz2[i] = niz[i / 2];
  41.             flagNiz2[i] = (i % 2 ? 0 : 1);
  42.         }
  43.        
  44.         delete[] niz;
  45.         delete[] flagNiz;
  46.         flagNiz = flagNiz2;
  47.         niz = niz2;
  48.         brojElem *= 2;
  49.     }
  50.    
  51.     int ternPret(int key) const {
  52.         int low = 0;
  53.         int high = brojElem - 1;
  54.        
  55.         while (high >= low) {
  56.             int p1 = low + ceil((high - low)) / 3;
  57.             int p2 = high - ceil((high - low)) / 3;
  58.            
  59.             if (key == niz[p1]) {
  60.                 int k = p1;
  61.                 while (flagNiz[k] == 0 and k >= 0) {
  62.                     if (niz[k] != key) break;
  63.                     k--;
  64.                 }
  65.                 if (niz[k] == key and flagNiz[k] == 1) return k;
  66.                 else {
  67.                     while (flagNiz[k] == 0) k++;
  68.                     if (niz[k] == key) return k;
  69.                 }
  70.                
  71.             }
  72.             else if (key == niz[p2]) {
  73.                 int k = p2;
  74.                 while (flagNiz[k] == 0 and k >= 0) {
  75.                     if (niz[k] != key) break;
  76.                     k--;
  77.                 }
  78.                 if (niz[k] == key and flagNiz[k] == 1) return k;
  79.                
  80.             }
  81.             else if (key < niz[p1]) high = p1 - 1;
  82.             else if (key > niz[p1] and key < niz[p2]) {
  83.                 low = p1;
  84.                 high = p2 - 1;
  85.             }
  86.             else if (key > niz[p2]) low = p2 + 1;
  87.         }
  88.        
  89.         int k = low;
  90.         while (k >= 0) {
  91.             if (flagNiz[k] == 1 and niz[k] < key) break;
  92.             k--;
  93.         }
  94.         while (flagNiz[k] == 1 and niz[k] == key) k++;
  95.         if (k == 0 and key < niz[k]) return -1;
  96.         else return k;
  97.     }     //UVEK VRACA ELEMENT IZA KOGA TREBA DA SE UBACI NOVI ELEMENT
  98.    
  99.    
  100.    
  101.    
  102. public:
  103.     ~povecanaTabela(){
  104.         delete[] niz;
  105.         delete[] flagNiz;
  106.     }
  107.     int getBrojElem()const {
  108.         return brojElem;
  109.     }
  110.     int getZauzetoElem()const {
  111.         return zauzetoElem;
  112.     }
  113.     int getProsirenje()const {
  114.         return prosirenje;
  115.     }
  116.    
  117.     void formirajTabelu() {
  118.         cout << "Unesite broj elemenata tabele: " << endl;
  119.         int n;
  120.         cin >> n;
  121.        
  122.         if (n < 1 or n > MAX) {
  123.             cout << "Nevazeci broj elemenata!" << endl;
  124.             return;
  125.         }
  126.        
  127.         int *nizx = new int[n];
  128.         for (int i = 0; i < n; i++) {
  129.             cout << "Unesite " << i + 1 << ". element tabele: ";
  130.             cin >> nizx[i];
  131.         }
  132.         sort(nizx, n);
  133.         cout << "Unesite prosirenje: ";
  134.         int p;
  135.         cin >> p;
  136.        
  137.         int *niz2 = new int[n * p];
  138.         flagNiz = new int[n * p];
  139.        
  140.         for (int i = 0; i < n * p; i++) {
  141.             niz2[i] = nizx[i / p];
  142.             flagNiz[i] = (i % p == 0 ? 1 : 0);
  143.         }
  144.        
  145.         delete[] nizx;
  146.         this->niz = niz2;
  147.         this->brojElem = n * p;
  148.         this->prosirenje = p;
  149.         this->zauzetoElem = n;
  150.         cout << endl << "Tabela uspesno formirana! Ispis: " << endl;
  151.         this->ispisiTabelu();
  152.     }
  153.     //MOZDA POPRAVI KONZOLU
  154.    
  155.     void ispisiTabelu() const {
  156.         cout << endl;
  157.         for (int i = 0; i < brojElem; i++) {
  158.             cout << niz[i] << "|";
  159.         }
  160.         cout << endl;
  161.         for (int i = 0; i < brojElem; i++) {
  162.             cout << flagNiz[i] << "|";
  163.         }
  164.         cout << endl;
  165.     }
  166.     //OVDE POPRAVI ISPIS
  167.    
  168.    
  169.     void ispisiElem(int key) const { // *****
  170.         int k = ternPret(key);
  171.         if (niz[k] == key and flagNiz[k] == 1){
  172.             cout << "Element " << key << " nadjen na poziciji " << k << "." << endl;
  173.             return;
  174.         } else {
  175.             cout << "Nije nadjen element koji ima vrednost " << key << endl;
  176.             return;
  177.         }
  178.     }
  179.    
  180.     void umetanjeKljuca(int key) {
  181.        
  182.         if (zauzetoElem == brojElem) realociraj();
  183.        
  184.         int k = ternPret(key);
  185.         if(k != brojElem - 1) k++; //pozicija gde treba da stavimo element
  186.        
  187.         if (k == -1) {
  188.             k = 0;
  189.             while (1) {
  190.                 if (flagNiz[k] == 0) break;
  191.                 k++;
  192.             }
  193.             for (int i = k; i > 0 ; i--) {
  194.                 flagNiz[i] = flagNiz[i - 1];
  195.                 niz[i] = niz[i - 1];
  196.             }
  197.             flagNiz[0] = 1;
  198.             niz[0] = key;
  199.             zauzetoElem++;
  200.             cout << "Kljuc uspesno umetnut na poziciji " << 0 << endl;
  201.             return;
  202.         }
  203.        
  204.         if (k == brojElem - 1) {
  205.             while (1) {
  206.                 if (flagNiz[k] == 0) break;
  207.                 k--;
  208.             }
  209.             for (int i = k; i < brojElem - 1; i++) {
  210.                 flagNiz[i] = flagNiz[i + 1];
  211.                 niz[i] = niz[i + 1];
  212.             }
  213.             flagNiz[brojElem - 1] = 1;
  214.             niz[brojElem - 1] = key;
  215.             zauzetoElem++;
  216.             cout << "Kljuc uspesno umetnut na poziciji " << brojElem - 1 << endl;
  217.             return;
  218.         }
  219.        
  220.         int poz = k;
  221.        
  222.         if (flagNiz[k] == 0) {
  223.             niz[k] = key;
  224.             flagNiz[k] = 1;
  225.             k++;
  226.             while (flagNiz[k] == 0) {
  227.                 niz[k] = key;
  228.                 k++;
  229.             }
  230.             zauzetoElem++;
  231.             cout << "Kljuc uspesno umetnut na poziciji " << poz << endl;
  232.             return;
  233.         }
  234.        
  235.         // trazenje mesta udesno
  236.        
  237.         else {
  238.             while (k < brojElem - 1) {
  239.                 if (flagNiz[k] == 0) break;
  240.                 k++;
  241.             }
  242.             if (flagNiz[k] == 0) {
  243.                 for (int i = k; i > poz; i--) {
  244.                     niz[i] = niz[i - 1];
  245.                     flagNiz[i] = flagNiz[i - 1];
  246.                 }
  247.                 niz[poz] = key;
  248.                 flagNiz[poz] = 1;
  249.                 zauzetoElem++;
  250.                 cout << "Kljuc uspesno umetnut na poziciji " << poz << endl;
  251.                 return;
  252.             }
  253.            
  254.             // trazenje mesta ulevo
  255.            
  256.             poz--;
  257.            
  258.             while (k >= 0) {
  259.                 if (flagNiz[k] == 0) break;
  260.                 k--;
  261.             }
  262.            
  263.             if (flagNiz[k] == 0) {
  264.                 for (int i = k; i < poz; i++) {
  265.                     niz[i] = niz[i + 1];
  266.                     flagNiz[i] = flagNiz[i + 1];
  267.                 }
  268.                 niz[poz] = key;
  269.                 flagNiz[poz] = 1;
  270.                 zauzetoElem++;
  271.                 cout << "Kljuc uspesno umetnut na poziciji " << poz << endl;
  272.                 return;
  273.             }
  274.         }
  275.     }
  276.    
  277.     void brisanjeKljuca(int key){ // ****
  278.         int k = ternPret(key);
  279.         if (niz[k] == key and flagNiz[k] == 1){
  280.             flagNiz[k] = 0;
  281.             cout << "Uspesno brisanje kljuca na poziciji " << k << endl;
  282.             return;
  283.         } else {
  284.             cout << "Element nije pronadjen ili je nevazeci! " << endl;
  285.         }
  286.     }
  287.    
  288.     int* nizValidnihElem() const {
  289.         int *nizValidnih = new int[zauzetoElem];
  290.         int cnt = 0;
  291.         for (int i = 0; i < brojElem; i++){
  292.             if (flagNiz[i]){
  293.                 nizValidnih[cnt] = niz[i];
  294.                 cnt++;
  295.             }
  296.         }
  297.         for (int i = 0; i < cnt; i++){
  298.             cout << nizValidnih[i];
  299.         }
  300.         return nizValidnih;
  301.     }
  302. };
  303.  
  304. typedef struct node {
  305.     node *father;
  306.     node *left;
  307.     node *right;
  308.     int val;
  309.     int brojCvorova;
  310. }node;
  311.  
  312. class binarnoStablo{
  313.    
  314. private:
  315.    
  316.     node *root;
  317.     int brojCvorova;
  318.    
  319. public:
  320.     node *getRoot() const{
  321.         return root;
  322.     }
  323.     binarnoStablo(){
  324.         brojCvorova = 0;
  325.     }
  326.    
  327.     void dodajCvor(int val){
  328.         node *n = new node;
  329.         n->val = val;
  330.         n->left = nullptr;
  331.         n->right = nullptr;
  332.         if (brojCvorova == 0){
  333.             n->father = nullptr;
  334.             root = n;
  335.             brojCvorova++;
  336.             return;
  337.         } else {
  338.             node *p = root;
  339.             node *f = nullptr;
  340.             while (p){
  341.                 if (val == p->val){
  342.                     p->brojCvorova ++;
  343.                     return;
  344.                 } else if (val < p->val){
  345.                     f = p;
  346.                     p = p->left;
  347.                 } else if (val > p->val){
  348.                     f = p;
  349.                     p = p-> right;
  350.                 }
  351.             }
  352.             if (f->val > val){
  353.                 f->left = n;
  354.             } else if(f->val < val){
  355.                 f->right = n;
  356.             }
  357.             n->father = f;
  358.             brojCvorova++;
  359.             return;
  360.         }
  361.     }
  362.    
  363.     void formirajStabloRek(int low, int high, int *niz){
  364.         if (low <= high){
  365.             int mid = (high + low)/2;
  366.             dodajCvor(niz[mid]);
  367.             formirajStabloRek(low, mid - 1, niz);
  368.             formirajStabloRek(mid + 1, high, niz);
  369.         }
  370.     }
  371.    
  372.     void formirajStablo(int low, int high, int *niz){
  373.        
  374.         queue<int>lq;
  375.         queue<int>mq;
  376.         queue<int>hq;
  377.        
  378.         lq.push(low);
  379.         mq.push((high+low)/2);
  380.         hq.push(high);
  381.        
  382.        
  383.         for (int i = 0; i < high; i++){
  384.             int l = lq.front();
  385.             lq.pop();
  386.             int m = mq.front();
  387.             mq.pop();
  388.             int h = hq.front();
  389.             hq.pop();
  390.             dodajCvor(niz[m]);
  391.             lq.push(l);
  392.             hq.push(m - 1);
  393.             mq.push((l + m - 1) / 2);
  394.            
  395.             lq.push(m + 1);
  396.             hq.push(h);
  397.             mq.push((m + 1 + h) / 2);
  398.            
  399.         }
  400.        
  401.        
  402.     }
  403.    
  404.    
  405.     void ispisiStabloX(){
  406.         int space = (int)pow(brojCvorova, 1.71);
  407.         int level = 1;
  408.        
  409.         queue <node*> q;
  410.         node *p = root;
  411.         q.push(p);
  412.         q.push(nullptr);
  413.         int k1 = 1;
  414.         int k2 = 2;
  415.        
  416.         while (!q.empty()){
  417.             p = q.front();
  418.             q.pop();
  419.             if (p != nullptr){
  420.                 for (int i = 0; i < space / k2 ; i++){
  421.                     cout << " ";
  422.                 }
  423.                 cout << p->val;
  424.                 if (p->left) q.push(p->left);
  425.                 if (p->right) q.push(p->right);
  426.             } else if (!q.empty()){
  427.                 level++;
  428.                 q.push(nullptr);
  429.                 cout << endl;
  430.                 int pom = k2;
  431.                 k2 += k1;
  432.                 k1 = pom;
  433.             }
  434.            
  435.         }
  436.        
  437.     }
  438.    
  439. };
  440.  
  441. void konzola(){
  442.     cout << endl << "Unosom rednog broja izaberite komandu: " << endl << endl;
  443.     cout << "1. Pravljenje i inicijalizacija prosirene tabele" << endl;
  444.     cout << "2. Ispisivanje indeksa(pozicije) odredjenog elementa u tabeli" << endl;
  445.     cout << "3. Umetanje odredjenog elementa u tabelu" << endl;
  446.     cout << "4. Brisanje odredjenog elementa iz tabele" << endl;
  447.     cout << "5. Ispis cele tabele" << endl;
  448.     cout << "6. Formiraj binarno stablo prema tabeli" << endl;
  449.     cout << "7. Ispisi binarno stablo" << endl;
  450.     cout << "0. Izlazak iz programa" << endl << endl << endl;
  451. }
  452.  
  453.  
  454. int main(void) {
  455.    
  456.     cout << "Dobrodosli u program!!! :) :) :)" << endl;
  457.     int napravljenaTabela = 0;
  458.     int napravljenoStablo = 0;
  459.     povecanaTabela *povTab = nullptr;
  460.     binarnoStablo *binSt = nullptr;
  461.    
  462.    
  463.    
  464.     while(1){
  465.         konzola();
  466.         cout << "Unesite komandu: ";
  467.         int komanda;
  468.         cin >> komanda;
  469.         int key;
  470.         switch (komanda) {
  471.             case 1:
  472.                 if (napravljenaTabela){
  473.                     cout << "Tabela je vec napravljena!" << endl;
  474.                     break;
  475.                 }
  476.                 cout << "Formiranje povecane tabele: " << endl;
  477.                 povTab = new povecanaTabela;
  478.                 povTab->formirajTabelu();
  479.                 napravljenaTabela = 1;
  480.                 break;
  481.             case 2:
  482.                 if (!napravljenaTabela){
  483.                     cout << "Tabela jos ne postoji!" << endl;
  484.                     break;
  485.                 }
  486.                 cout << "Unesite element(key) za pretragu: ";
  487.                 cin >> key;
  488.                 povTab->ispisiElem(key);
  489.                 break;
  490.             case 3:
  491.                 if (!napravljenaTabela){
  492.                     cout << "Tabela jos ne postoji!" << endl;
  493.                     break;
  494.                 }
  495.                 cout << "Unesite vrednost elementa koji stavljate u tabelu: ";
  496.                 cin >> key;
  497.                 povTab->umetanjeKljuca(key);
  498.                 povTab->ispisiTabelu();
  499.                 break;
  500.             case 4:
  501.                 if (!napravljenaTabela){
  502.                     cout << "Tabela jos ne postoji!" << endl;
  503.                     break;
  504.                 }
  505.                 cout << "Unesite vrednost(key) elementa za brisanje: ";
  506.                 cin >> key;
  507.                 povTab->brisanjeKljuca(key);
  508.                 povTab->ispisiTabelu();
  509.                 break;
  510.             case 5:
  511.                 if (!napravljenaTabela){
  512.                     cout << "Tabela jos ne postoji!" << endl;
  513.                     break;
  514.                 }
  515.                 cout << "Ispis cele tabele: " << endl;
  516.                 povTab->ispisiTabelu();
  517.                 break;
  518.             case 6:
  519.                 if (napravljenoStablo){
  520.                     cout << "Stablo je vec napravljeno!" << endl;
  521.                     break;
  522.                 }
  523.                 napravljenoStablo = 1;
  524.                 binSt = new binarnoStablo;
  525.                 binSt->formirajStabloRek(0, povTab->getZauzetoElem()-1, povTab->nizValidnihElem());
  526.                 break;
  527.             case 7:
  528.                 if (!napravljenoStablo){
  529.                     cout << "Stablo jos ne postoji!" << endl;
  530.                     break;
  531.                 }
  532.                 binSt->ispisiStabloX();
  533.                 break;
  534.             case 0:
  535.                 delete povTab;
  536.                 exit(1);
  537.                 break;
  538.                
  539.             default:
  540.                 cout << "Nevazeca komanda!!!" << endl;
  541.                 break;
  542.         }
  543.        
  544.        
  545.     }
  546.    
  547. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement