Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.85 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4.  
  5.  
  6. typedef struct Cvor {
  7.     int info;
  8.     struct Cvor* levo;
  9.     struct Cvor* desno;
  10.     struct Cvor* roditelj;
  11. }Cvor;
  12.  
  13.  
  14. int ternarnaPretraga(int* tabela, int* vektor, int br_kljuceva, int faktor_uvecanja, int zadati_kljuc, int* indeks, int* n);
  15. int* napraviNiz(int* br_kljuceva, int faktor_uvecanja);
  16. void ispis(int* tabela, int n);
  17. void stek_stavi(int* stek, int* top, int broj);
  18. int* stek_skini(int* stek, int* top);
  19. Cvor* napraviStablo(int* tabela, int* vektor, int* indeks, int* n, int zadati_kljuc, int br_kljuceva);
  20. Cvor* napraviCvor(int broj);
  21. Cvor* ubaciCvor(Cvor* koren, int broj);
  22. Cvor* BSTubaci(Cvor* koren, Cvor* novi);
  23. void obradiDesnoPodstablo(int* stek, int* top, Cvor* koren);
  24. Cvor* BSTPretraga(Cvor* koren, int k);
  25. void printInorder(Cvor* node);
  26. void ispisStabla(Cvor* koren);
  27. void ispisiRed(int* red, int* front, int* rear);
  28.  
  29. int main() {
  30.  
  31.     int br_kljuceva, zadati_kljuc = 0, kljuc, indeks, opcija, provera, n, broj, k;
  32.     int* tabela; int* vektor;
  33.  
  34.  
  35.     printf("Unesite broj elemenata niza\n");
  36.     scanf("%d", &br_kljuceva);
  37.  
  38.  
  39.  
  40.  
  41.     int faktor_uvecanja = 1;
  42.     tabela = napraviNiz(&br_kljuceva, faktor_uvecanja);
  43.     n = br_kljuceva;
  44.     //ispis(tabela, n);
  45.  
  46.     vektor = malloc(n * sizeof(int));
  47.  
  48.  
  49.     for (int i = 0; i < n; i++)
  50.         vektor[i] = 1;
  51.  
  52.  
  53.     Cvor* koren = napraviStablo(tabela, vektor, &indeks, &n, zadati_kljuc, br_kljuceva);
  54.  
  55.  
  56.     printInorder(koren);
  57.  
  58.  
  59.  
  60.     printf("\nUnesite opciju\n");
  61.     printf("1. Formiranje stabla\n");
  62.     printf("2. Pretraga na zadatu vrednost\n");
  63.     printf("3. Umetanje kljuca\n");
  64.     printf("4. Ispis stabla\n");
  65.     printf("5. Brisanje stabla\n");
  66.  
  67.     scanf("%d", &opcija);
  68.  
  69.  
  70.     switch (opcija) {
  71.  
  72.     case 1:
  73.         break;
  74.  
  75.     case 2: printf("Unesite kljuc\n");
  76.         scanf("%d", &k);
  77.         Cvor* trazeni_cvor = BSTPretraga(koren, k);
  78.         if (trazeni_cvor != NULL) {
  79.             printf("Trazeni cvor je: %d\n", trazeni_cvor->info);
  80.         }
  81.         else {
  82.             printf("Trazeni cvor ne postoji\n");
  83.         }
  84.         break;
  85.  
  86.     case 3: printf("Unesite kljuc koji zelite da ubacite\n");
  87.         scanf("%d", &k);
  88.         Cvor* novi = napraviCvor(k);
  89.         BSTubaci(koren, novi);
  90.         printInorder(koren);
  91.         break;
  92.  
  93.  
  94.  
  95.         scanf("%d", &opcija);
  96.  
  97.         printf("\nUnesite opciju\n");
  98.         printf("1. Formiranje stabla\n");
  99.         printf("2. Pretraga na zadatu vrednost\n");
  100.         printf("3. Umetanje kljuca\n");
  101.         printf("4. Ispis stabla\n");
  102.         printf("5. Brisanje stabla\n");
  103.  
  104.  
  105.     }
  106.     printf("\nISPIS PO LEVEL ORDERU\n");
  107.     ispisStabla(koren);
  108.     printf("Nisam puko\n");
  109.  
  110. }
  111.  
  112. int* napraviNiz(int* br_kljuceva, int faktor_uvecanja) {
  113.  
  114.  
  115.     int a, i, j, n;
  116.  
  117.     printf("Unesite elemente\n");
  118.     n = (*br_kljuceva) * faktor_uvecanja;
  119.  
  120.     int* pomocni_niz = malloc(n * sizeof(int));
  121.  
  122.     for (i = 0; i < n; i++) {
  123.         scanf("%d", &a);
  124.         pomocni_niz[i] = a;
  125.         for (j = 1; j < faktor_uvecanja; j++) {
  126.             pomocni_niz[i + j] = a;
  127.         }
  128.         i = i + j - 1;
  129.  
  130.     }
  131.  
  132.     return pomocni_niz;
  133.  
  134. }
  135.  
  136. int ternarnaPretraga(int* tabela, int* vektor, int br_kljuceva, int faktor_uvecanja, int zadati_kljuc, int* indeks, int* n) {
  137.  
  138.     int prvi, poslednji, srednji1, srednji2, i, j;
  139.  
  140.  
  141.  
  142.     prvi = 0; poslednji = *n - 1;
  143.  
  144.     while (prvi <= poslednji) {
  145.  
  146.         srednji1 = prvi + (poslednji - prvi) / 3;
  147.         srednji2 = poslednji - (poslednji - prvi) / 3;
  148.  
  149.         if (zadati_kljuc == tabela[srednji1]) {
  150.             if (vektor[srednji1] == 1) {
  151.                 *indeks = srednji1;
  152.                 return tabela[srednji1];
  153.  
  154.             }
  155.             else {
  156.                 int k = srednji1;
  157.                 while (zadati_kljuc == tabela[k])
  158.                 {
  159.                     k--;
  160.                 }
  161.  
  162.                 if (vektor[k + 1] == 1) {
  163.                     *indeks = k + 1;
  164.                     return tabela[srednji1];
  165.  
  166.                 }
  167.                 else {
  168.                     return 0;
  169.                 }
  170.  
  171.  
  172.             }
  173.  
  174.  
  175.         }
  176.  
  177.  
  178.         if (zadati_kljuc == tabela[srednji2]) {
  179.             if (vektor[srednji2] == 1) {
  180.                 *indeks = srednji2;
  181.                 return tabela[srednji2];
  182.  
  183.             }
  184.             else {
  185.                 int k = srednji2;
  186.                 while (zadati_kljuc == tabela[k])
  187.                 {
  188.                     k--;
  189.                 }
  190.  
  191.                 if (vektor[k + 1] == 1) {
  192.                     *indeks = srednji2;
  193.                     return tabela[srednji2];
  194.                 }
  195.                 else {
  196.                     //printf("\nne postoji kljuc\n");
  197.                     return 0;
  198.                 }
  199.             }
  200.         }
  201.  
  202.  
  203.         if (zadati_kljuc < tabela[srednji1]) {
  204.             poslednji = srednji1 - 1;
  205.         }
  206.         if (zadati_kljuc > tabela[srednji1]) {
  207.             prvi = srednji1 + 1;
  208.         }
  209.         if (zadati_kljuc < tabela[srednji2]) {
  210.             poslednji = srednji2 - 1;
  211.         }
  212.         if (zadati_kljuc > tabela[srednji2]) {
  213.             prvi = srednji2 + 1;
  214.         }
  215.  
  216.     }
  217.  
  218.     if ((zadati_kljuc == tabela[prvi]) && (vektor[prvi] == 1)) {
  219.         *indeks = prvi;
  220.         return tabela[prvi];
  221.     }
  222.     else {
  223.         *indeks = prvi;
  224.         return 0;
  225.     }
  226.  
  227.  
  228. }
  229.  
  230. void ispis(int* tabela, int n) {
  231.  
  232.     for (int w = 0; w < n; w++) {
  233.         printf("%d ", tabela[w]);
  234.     }
  235.  
  236.     printf("\n");
  237.  
  238. }
  239.  
  240. void stek_stavi(int* stek, int* top, int broj) {
  241.  
  242.     if (stek == NULL) {
  243.         printf("Greska na steku\n");
  244.     }
  245.  
  246.     stek[++(*top)] = broj;
  247.  
  248. }
  249.  
  250. int* stek_skini(int* stek, int* top) {
  251.  
  252.     if (stek == NULL) {
  253.         printf("Greska na steku2\n");
  254.     }
  255.  
  256.     return stek[(*top)--];
  257.  
  258.  
  259. }
  260.  
  261.  
  262. Cvor* napraviStablo(int* tabela, int* vektor, int* indeks, int* n, int zadati_kljuc, int br_kljuceva) {
  263.  
  264.     Cvor* koren = NULL;
  265.     Cvor* trenutni = NULL;
  266.  
  267.     int prvi, poslednji, srednji, srednji_prethodni, vrednost, brojac = 0, provera;
  268.  
  269.     provera = 1;
  270.     int* stek = calloc(50, sizeof(int));
  271.     int top = -1;
  272.  
  273.     poslednji = (*n);
  274.  
  275.     prvi = 0;
  276.     srednji_prethodni = poslednji;
  277.  
  278.     //srednji_prethodni = srednji_prethodni + 1;
  279.  
  280.     while (1) {
  281.  
  282.         zadati_kljuc = (tabela[0] + tabela[srednji_prethodni - 1]) / 2;
  283.  
  284.         vrednost = ternarnaPretraga(tabela, vektor, n, 1, zadati_kljuc, indeks, n);
  285.  
  286.         srednji = *indeks;
  287.  
  288.         for (int j = srednji + 1; j < srednji_prethodni; j++) {
  289.  
  290.             stek_stavi(stek, &top, tabela[j]);
  291.             brojac++;
  292.         }
  293.  
  294.         /*if (provera == 1) {
  295.             stek_stavi(stek, &top, tabela[(*n) - 1]);
  296.             provera = 0;
  297.         }*/
  298.  
  299.         if (brojac != 0)
  300.             stek_stavi(stek, &top, brojac);
  301.  
  302.         brojac = 0;
  303.  
  304.         koren = ubaciCvor(koren, tabela[srednji]);
  305.  
  306.         if (srednji == 0)
  307.             break;
  308.  
  309.         srednji_prethodni = srednji;
  310.  
  311.     }
  312.  
  313.  
  314.  
  315.     obradiDesnoPodstablo(stek, top, koren);
  316.  
  317.     return koren;
  318.  
  319. }
  320.  
  321. Cvor* napraviCvor(int broj) {
  322.  
  323.     Cvor* cvor = (Cvor*)malloc(1 * sizeof(Cvor));
  324.  
  325.  
  326.     cvor->levo = NULL;
  327.     cvor->desno = NULL;
  328.     cvor->roditelj = NULL;
  329.     cvor->info = broj;
  330.  
  331.     return cvor;
  332.  
  333. }
  334.  
  335. Cvor* ubaciCvor(Cvor* koren, int broj) {
  336.  
  337.  
  338.     Cvor* cvor = napraviCvor(broj);
  339.  
  340.  
  341.     if (koren == NULL) {
  342.  
  343.         koren = cvor;
  344.  
  345.         return koren;
  346.     }
  347.  
  348.     Cvor* pomocni = koren;
  349.  
  350.     while (pomocni->levo != NULL) {
  351.         pomocni = pomocni->levo;
  352.     }
  353.  
  354.     pomocni->levo = cvor;
  355.     cvor->roditelj = pomocni;
  356.  
  357.     return koren;
  358.  
  359. }
  360.  
  361. Cvor* BSTubaci(Cvor* koren, Cvor* novi) {
  362.  
  363.     //Kod prepisan iz knjige!
  364.     Cvor* p = koren;
  365.     Cvor* q = NULL;
  366.  
  367.     while (p != NULL) {
  368.         q = p;
  369.  
  370.         if (novi->info == p->levo) {
  371.             printf("Postoji kljuc\n");
  372.             return;
  373.         }
  374.         else if (novi->info < p->info) {
  375.             p = p->levo;
  376.  
  377.         }
  378.         else
  379.             p = p->desno;
  380.     }
  381.  
  382.     if (q == NULL) {
  383.  
  384.         koren = novi;
  385.     }
  386.     else if (novi->info < q->info) {
  387.         q->levo = novi;
  388.         novi->roditelj = q;
  389.     }
  390.     else {
  391.         q->desno = novi;
  392.         novi->roditelj = q;
  393.     }
  394.  
  395.     return koren;
  396.  
  397. }
  398.  
  399.  
  400. void obradiDesnoPodstablo(int* stek, int top, Cvor* koren)
  401. {
  402.     int br_elem = 1;
  403.     int broj, info1, info2, info3;
  404.     Cvor* cvor1;
  405.     Cvor* cvor2;
  406.     Cvor* cvor3;
  407.  
  408.     int i;
  409.  
  410.     while (top > -1) {
  411.         br_elem = stek_skini(stek, &top);
  412.  
  413.         while (br_elem != 0)
  414.         {
  415.             if (br_elem < 3)
  416.             {
  417.                 for (i = 0; i < br_elem; i++)
  418.                 {
  419.                     broj = stek_skini(stek, &top);
  420.                     cvor1 = napraviCvor(broj);
  421.                     BSTubaci(koren, cvor1);
  422.                 }
  423.                 br_elem -= i;
  424.             }
  425.             else
  426.             {
  427.                 info3 = stek_skini(stek, &top);
  428.                 info1 = stek_skini(stek, &top);
  429.                 info2 = stek_skini(stek, &top);
  430.  
  431.                 cvor1 = napraviCvor(info1);
  432.                 cvor2 = napraviCvor(info2);
  433.                 cvor3 = napraviCvor(info3);
  434.  
  435.                 BSTubaci(koren, cvor1);
  436.  
  437.                 cvor1->levo = cvor2;
  438.                 cvor1->desno = cvor3;
  439.  
  440.                 cvor2->roditelj = cvor1;
  441.                 cvor3->roditelj = cvor1;
  442.  
  443.                 br_elem -= 3;
  444.             }
  445.         }
  446.     }
  447.  
  448. }
  449.  
  450. void printInorder(Cvor* koren)
  451. {
  452.     if (koren != NULL) {
  453.         printInorder(koren->levo);
  454.         printf("%d ", koren->info);
  455.         printInorder(koren->desno);
  456.  
  457.     }
  458.  
  459. }
  460.  
  461. void red_stavi(Cvor** red, int* rear, Cvor* cvor) {
  462.  
  463.     if (red == NULL) {
  464.         printf("Greska na redu\n");
  465.     }
  466.     //printf("na [%d] = %d\n", *rear, cvor->info);
  467.     red[(*rear)++] = cvor;
  468.  
  469. }
  470.  
  471. Cvor* red_skini(Cvor** red, int* front) {
  472.  
  473.     if ((*red) == NULL) {
  474.         printf("Greska na redu2\n");
  475.     }
  476.     Cvor* cvor = red[(*front)++];
  477.     return cvor;
  478.  
  479.  
  480. }
  481.  
  482. int prazan_red(int front, int rear) {
  483.     if (front == rear) {
  484.         printf("red je prazan\n");
  485.         return 1;
  486.     }
  487. }
  488.  
  489.  
  490.  
  491. Cvor* BSTPretraga(Cvor* koren, int k) {
  492.  
  493.     Cvor* p = NULL;
  494.  
  495.     p = koren;
  496.  
  497.     while ((p != NULL) && (k != p->info)) {
  498.         if (k < p->info) {
  499.             p = p->levo;
  500.         }
  501.         else {
  502.             p = p->desno;
  503.         }
  504.     }
  505.  
  506.     return p;
  507. }
  508.  
  509. void ispisStabla(Cvor *koren) {
  510.      
  511.     Cvor** red = malloc(50 * sizeof(Cvor*));
  512.     Cvor* sledeci = NULL;
  513.     int front = 0; int rear = 0;
  514.     int brojac = 0;
  515.     sledeci = koren;
  516.     int h = 0;
  517.     red_stavi(red, &rear, sledeci);
  518.    
  519.     while (brojac < 5) {
  520.         sledeci = red_skini(red, &front);
  521.    
  522.         printf("ispis: %d.. ___front: %d\n", sledeci->info, front);
  523.        
  524.         if (sledeci->levo != NULL) {
  525.  
  526.             red_stavi(red, &rear, sledeci->levo);
  527.         }
  528.         if (sledeci->desno != NULL) {
  529.             red_stavi(red, &rear, sledeci->desno);
  530.         }
  531.         printf("rear: %d\n", rear);
  532.         brojac++;
  533.  
  534.  
  535.     }
  536.     printf("\nfront: %d rear: %d", front, rear);
  537.     front = 0;
  538.     ispisiRed(red, &front, &rear);
  539.  
  540.     /*while (brojac > 0){
  541.  
  542.         sledeci->info = red_skini(red, &front);
  543.  
  544.         printf("%d..", sledeci->info);
  545.         brojac--;
  546.     }*/
  547.  
  548.  
  549. }
  550.  
  551. void ispisiRed(Cvor** red, int* front, int* rear)
  552. {
  553.     Cvor* nesto = NULL; int i = 0, k;
  554.     int broj = 16;
  555.     printf("\n");
  556.     for (i = (*front); i < (*rear); i++)
  557.     {
  558.         for (int j = 0; j < broj; j++) {
  559.             printf(" ");
  560.         }
  561.  
  562.         for ( k = 0; k < i + 1; k++) {
  563.             printf("%d", red[k]->info);
  564.         }
  565.  
  566.  
  567.         for (int j = 0; j < broj; j++) {
  568.                 printf(" ");
  569.         }
  570.         printf("\n");
  571.         i = i + k - 1;
  572.  
  573.     }
  574. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement