Advertisement
Guest User

ASP2DomBST3

a guest
Oct 19th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 21.25 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. /* ------ Deklaracija funkcija nasledjenih iz prvog zadatka ------ */
  5.  
  6. void initTable(int **table, int **valid, int sizeKeys, int *keys, int increasFactor, int *size);
  7. int binarySearch(int *table, int *valid, int size, int key);
  8. int checkValid(int *table, int *valid, int key, int cur);
  9. void deleteKey(int **table, int **valid,int size, int key);
  10. int binaryInsert(int *table, int *valid, int size, int key);
  11. void insertKey(int **table, int **valid, int *size, int key, int increasFactor);
  12. void increaseTable(int **table, int **valid, int size);
  13.  
  14.  
  15. /* ------ Implementacija struktura koriscenih u drugom zadatku ------ */
  16.  
  17. /* Node - struktura koji se koristi kao cvor za stablo binarne pretrage - BST */
  18. typedef struct node{
  19.     int key;
  20.     struct node *left, *right;
  21. } Node;
  22.  
  23. /* Queue node - Struktura koja se koristi za implementaciju fifo reda
  24.  Red je implementiran kao jednostruka ulancana lista
  25.  Red se koristi za level order obilazak stabla prilikom ispisa i brisanja stabla */
  26. struct QueueNode{
  27.     Node *nd;
  28.     struct QueueNode *next;
  29. } *frontQ, *rearQ, *tempQ, *front1Q;
  30.  
  31.  
  32. /* Stack node - Struktura koja se koristi za implementaciju steka kao ulancane liste
  33.  Element steka ce sadrzati dve promenljive, koje ce se koristiti prilikom
  34.  Implementacije formiranja stabla koriscenjem binarne pretrage povecane tabele*/
  35. struct StackNode {
  36.     int low;
  37.     int high;
  38.     struct StackNode *next;
  39. } *top; //Pokazivac na vrh steka3
  40.  
  41.  
  42. /* ------ Deklaracija funkcijih koriscenih u drugom zadatku ------ */
  43.  
  44. // Pomocna funkcija za ubacivanje cvora
  45. Node* newNode(int item);
  46. // Zahtevane funkcije
  47. Node* insert(Node *root, int key);
  48. int search(Node *root, int key1);
  49. Node* rotate(Node *root,int key1, int right);
  50. //Pomocne funkcije za koriscenje steka
  51. int StackEmpty();
  52. void push(int l, int h);
  53. struct StackNode* pop();
  54. //Zahtevana funkcija koja koristi stek
  55. Node* formBST(int *table, int *valid, int size);
  56. //Pomocne funkcije za koriscenje reda
  57. void enq(Node *n);
  58. void deq();
  59. int empty();
  60. //Zahtevane funkcije koje korsite red
  61. void printBST(Node* root);
  62. void deleteBST(Node* root);
  63.  
  64. /* ------ Implementacija funkcija nasledjenih iz prvog zadatka ------ */
  65.  
  66. void initTable(int **table, int **valid, int sizeKeys, int *keys, int increasFactor, int *size){
  67.     *size = sizeKeys*increasFactor;
  68.     *table = (int*)calloc( *size, sizeof(int));
  69.     *valid = (int*)calloc( *size, sizeof(int));
  70.     for(int i = 0; i < sizeKeys; i++)
  71.         for(int j = 0; j < increasFactor; j++){
  72.             (*table)[j + i*increasFactor] = keys[i];
  73.             if( j != 0)
  74.                 (*valid)[j + i*increasFactor] = 0;
  75.            else
  76.                 (*valid)[j + i*increasFactor] = 1;
  77.         }
  78. }
  79.  
  80. int binarySearch(int *table, int *valid, int size, int key){
  81.     // printf("pozvao sam binary za %d\n", key);
  82.     int low = 0, high = size; //gornja i donja granica
  83.     int cur;
  84.     while(low <= high){
  85.         cur = low+(high-low)/2;
  86.         if(table[cur] == key)
  87.             return checkValid(table, valid, key, cur);
  88.         if(table[cur] > key)
  89.             high = cur - 1;
  90.         else
  91.             low = cur + 1;
  92.     }
  93.     return -1;
  94. }
  95.  
  96. int checkValid(int *table, int *valid, int key, int cur){ //proverava da li pronadjen kljuc validan
  97.     while(cur >= 0 && ( valid[cur] != 1 || table[cur] != key )){ //trazi sve dok ne pronadje valid bit ili ne nadije na novi kljuc
  98.         cur--;
  99.     }
  100.     if(cur < 0 ||table[cur] != key ) //izasao iz opsega ili nasao drugi kljuc
  101.         return -1;
  102.     if(valid[cur] == 1)  //nasao je valid bit za pitani kljuc
  103.         return cur;
  104. }
  105.  
  106. void deleteKey(int **table, int **valid,int size, int key){
  107.     int loc = binarySearch(*table, *valid, size, key); //pronalazi kljuc koji se brise
  108.     if(loc  != -1)  //ako ga je pronasao menja njegov valid bit na nulu
  109.         (*valid)[loc] = 0;
  110.     else
  111.         printf("Key %d doesn't exist\n", key);
  112.  
  113. }
  114.  
  115. //pronalazi mesto za ubacivanje uvek nadje najdesnje povoljno mesto
  116. int binaryInsert(int *table, int *valid, int size, int key){
  117.     int cur, high = size, low = 0; //gornja i donja granica
  118.     while (low < high) {
  119.         cur = (high + low) / 2;
  120.         if (table[cur] == key)
  121.             return cur;
  122.         else if (table[cur] > key)
  123.             high =  cur - 1;
  124.         else
  125.             low = cur + 1;
  126.     }
  127.     if(low == size)
  128.         return size;
  129.     else if(table[0] > key)
  130.         return 0;
  131.     else
  132.         return low;
  133. }
  134.  
  135. void insertKey(int **table, int **valid, int *size, int key, int increasFactor){
  136.     printf("Ubacujem kljuc %d\n", key);
  137.     int place = binaryInsert(*table, *valid, *size, key);// gde treba biti umetnut
  138.     //proveri da li je taj vec ubacen
  139.     if((*table)[place] == key){
  140.         if(place = checkValid(*table, *valid, key, place) != -1){
  141.             return; //Ovaj kljuc je vec u tabeli ne treba nista da se radi
  142.         }
  143.         else{
  144.             //Ovaj kljuc je vec u tabeli ali nije validan, postavi ga da bude validan
  145.             (*valid)[place] = 1;
  146.             return;
  147.         }
  148.     }
  149.     else if(place == 0){ //stavlja se na pocetak;
  150.         if((*valid)[0] == 1){ //Ako prvi jeste validan, pokusamo da ga pomerimo u desno, ako ne moze onda prosirimo tabelu
  151.             int i = 1;
  152.             int oldKey = (*table)[0];
  153.             while((*valid)[i] !=1)
  154.                 i++;
  155.             if(i == 1){
  156.                 //Ako ne moze da se umetne povecavamo tabelu
  157.                 *size *= 2;
  158.                 increaseTable(table, valid, *size);
  159.                 insertKey(table, valid, size, key, 1 );
  160.             }
  161.             else
  162.                 //Ako moze da se umetne
  163.                 for(int j = 0; j < i; j++){
  164.                     if( j < i/2 )
  165.                         (*table)[j] = key;
  166.                     else{
  167.                         (*table)[j] = oldKey;
  168.                     }
  169.                 }
  170.                 (*valid)[i/2] = 1;
  171.         }
  172.         else{           //Ako prvi nije validan, pregazimo ga samo
  173.             int i = 0;
  174.             while((*valid)[i] == 0){
  175.                 (*table)[i] = key;
  176.                 i++;
  177.             }
  178.             *(valid)[0] = 1;
  179.         }
  180.     }
  181.     else if(place == *size){
  182.         //Postavlja se na kraj
  183.         printf("postavljam na kraj\n");
  184.         place--;
  185.         if(-1 == checkValid(*table, *valid, (*table)[place], place)){ //Ako poslednji nije validn pregazi ga
  186.             printf("Zadnji nije validan");
  187.             while((*valid)[place] != 1){
  188.                 (*table)[place--] = key;
  189.             }
  190.             (*valid)[place+1] = 1;
  191.         }
  192.         else {
  193.             while((*valid[place]) != 1)
  194.                 place--;
  195.             if(place == *size){ // Ako je poslednji zauzet, moramo da prosirimo
  196.                    *size *= 2;
  197.                     increaseTable(table, valid, *size);
  198.                     insertKey(table, valid, size, key, 1 );
  199.                     return;
  200.             }
  201.             else{ //Ako poslednji nije zauzet, pomerimo ga u levo i onda ubacimo novi
  202.                 place += (*size - place)/2;
  203.                 (*valid)[place] = 1;
  204.                 while(place < *size){
  205.                     (*table)[place] = key;
  206.                     place++;
  207.                 }
  208.             }
  209.         }
  210.     }
  211.     //postavljam negde u sredinu
  212.     else{
  213.         if((*valid)[place] == 1){//Ovo mesto je zauzeto pa treba pomeriti neki kljuc
  214.             place++;
  215.  
  216.             if((*valid)[place + 1] == 0 && (*table)[place] < key){ // Moze da se pomeri unapred, i onda to i uradimo i umetnemo novi ljuce
  217.  
  218.                 int i = place+1;
  219.                 while((*valid)[i] != 1 && i != *size)
  220.                     i++;
  221.                 for(int j = place; j < place + (i- place)/2; j++)
  222.                     (*table)[j] = key;
  223.                 (*valid)[place + (i-place)/2] = 1;
  224.             }
  225.             else if((*valid)[place - 2] == 0){ //Ako nije mogao da se pomeri unapred onda pokusam da se pomeri ovaj iza, ako moze pomerimo
  226.                 place -= 2;
  227.                 int i = place;
  228.                 while(i != 0 && (*valid)[i] != 1)
  229.                     i--;
  230.                 (*valid)[i + (place - i)/2 + 1] = 1;
  231.                 for(int j = i + (place - i)/2 + 1; j < place +1; j++)
  232.                     (*table)[j] = key;
  233.             }
  234.             else{ //Moramo da prosirimo
  235.                 *size *= 2;
  236.                 increaseTable(table, valid, *size);
  237.                 //ovo nije rekurzija
  238.                 insertKey(table, valid, size, key, 1 );
  239.             }
  240.         }
  241.         else{ //Mesto nije zauzeto, pa mozemo slobodno da umetnemo
  242.             int i = place - 1;
  243.             while(i != 0 && (*valid)[i] != 1)
  244.                 i--;
  245.             i += (place - i)/2;
  246.             (*valid)[i+1] = 1;
  247.             for(int j = i+1; j < place+1; j++)
  248.                 (*table)[j] = key;
  249.         }
  250.     }
  251.  
  252. }
  253.  
  254. void increaseTable(int** table, int** valid, int size){
  255.     //napravimo nove nizove koji su duplo veci
  256.     int* tableNew = calloc(size, sizeof(int));
  257.     int* validNew = calloc(size, sizeof(int));
  258.     //Prekopiramo stari sadrzaj tako da ga je sada duplo vise
  259.     for(int i = 0; i < size/2; i++)
  260.         tableNew[2*i+1] = (tableNew[2*i] = (*table)[i]);
  261.     for(int i = 0; i < size/2; i++)
  262.         if((*valid)[i])
  263.             validNew[2*i] = 1;
  264.     //Oslobodimo staru memoriju i tu upisemo nove lise
  265.     free(*table);
  266.     free(*valid);
  267.     (*table) = tableNew;
  268.     (*valid) = validNew;
  269. }
  270.  
  271. /* ------ Implementacija funkcija koriscenih u drugom zadatku ------ */
  272.  
  273. // Pomocna funkcija za ubacivanje novog cvora
  274. Node* newNode(int item){
  275.     Node *temp = (Node *)malloc(sizeof(Node));
  276.     temp->key = item;
  277.     temp->left = temp->right = NULL;
  278.     return temp;
  279. }
  280.  
  281. //Funkcija koja ubacuje novi cvor u BST
  282. //Root je pokazivac na koreni cvor, a key vrednost koja se ubacuje u BST
  283. Node* insert(Node *root, int key){
  284.     //Napravi novi cvor koji sadrzi vrednost key
  285.     Node* newnode = newNode(key);
  286.     // Pointer to start traversing from root and
  287.     // traverses downward path to search
  288.     // where the new node to be inserted
  289.     Node* x = root;
  290.     // Pointer y maintains the trailing
  291.     // pointer of x
  292.     Node* y = NULL;
  293.     while (x != NULL){
  294.         y = x;
  295.         if (key < x->key)
  296.             x = x->left;
  297.         else
  298.             x = x->right;
  299.     }
  300.  
  301.     //Ako je root NULL, onda je drvo prazno
  302.     // Novi cvor je koreni cvor
  303.     if (y == NULL)
  304.         y = newnode;
  305.  
  306.     //Ako je novi kljuc manji od dodeli novi cvor kao levo dete
  307.     else if (key < y->key)
  308.         y->left = newnode;
  309.     // dodeli novi cvor kao desno dete
  310.     else
  311.         y->right = newnode;
  312.  
  313.     if(root == NULL)
  314.         return y;
  315.     else
  316.         return root;
  317. }
  318.  
  319. // Funkija koja trazi kljuc
  320. int search(Node *root, int key1){
  321.     // Spustaj se niz stablo dok ne dodjes do kraja
  322.     Node* temp = root;
  323.     while (temp != NULL) {
  324.         //nastavi kroz desno podstablo
  325.         if (key1 > temp->key)
  326.             temp = temp->right;
  327.         //nastavi kroz levo podstablo
  328.         else if (key1 < temp->key)
  329.             temp = temp->left;
  330.         else
  331.             return 1; // Vrati jedan ako je pronadjen kljuc
  332.     }
  333.     return 0;
  334. }
  335.  
  336. /* Funkija za jednostruku rotaciju
  337.  right se koristi kao fleg
  338.  right = 1 rotiraj u desno, right = 0, rotiraj u levo */
  339. Node* rotate(Node *root,int key1, int right){
  340.  
  341.         // Pronadji prosledjeni kljuc(cvor) oko kog se vrsi Rotacija
  342.         //Isti princip kao search funkcija
  343.         Node* x = root, *prev = NULL;
  344.         while (x != NULL) {
  345.             if (key1 > x->key){
  346.                 prev = x;
  347.                 x = x->right;}
  348.             else if (key1 < x->key){
  349.                 prev = x;
  350.                 x = x->left;}
  351.             else break;
  352.         }
  353.  
  354.         if( x == NULL){
  355.             printf("Given node doesn't exists\n");
  356.             return root;
  357.         }
  358.  
  359.         Node *y = NULL, *tmp = NULL;
  360.  
  361.         //Rotacija u desno i nemamo levog sina -> nista se ne radi
  362.         if(right && x->left==NULL){
  363.             return root;
  364.         }
  365.         //Rotacija u levo i nemamo desnog sina -> nista se ne radi
  366.         else if(!right && x->right==NULL){
  367.             return root;
  368.         }
  369.  
  370.         //Rotiranje u desno
  371.         if(right){
  372.             y = x->left;
  373.             tmp = y->right;
  374.             y->right = x;
  375.             x->left = tmp;
  376.         }else{
  377.             //Rotiranje u levo
  378.             y = x->right;
  379.             tmp = y->left;
  380.             y->left = x;
  381.             x->right = tmp;
  382.         }
  383.  
  384.         //Rotacija korenog cvora, novi cvor postaje koren
  385.         if( x == root ) {root = y;}
  386.         //Ukoliko rotirani cvor ima roditelja, menja mu se roditelj
  387.         else if(prev->right == x) prev->right = y;
  388.         else if(prev->left == x) prev->left = y;
  389.  
  390.         return root;
  391. }
  392.  
  393. // Provera da li je stek prazan
  394. int StackEmpty(){
  395.     return top == NULL;
  396. }
  397.  
  398. //Funkcija koja dodaje element na vrh steka
  399. void push(int l, int h){
  400.     struct StackNode *sn = (struct StackNode*)malloc(sizeof(struct StackNode));
  401.     sn->low = l;
  402.     sn->high = h;
  403.     sn->next = top;
  404.     top = sn; //azuriraj pokazivac na vrh
  405. }
  406.  
  407. //Funkcija koja vraca pokazivac na element skinut sa vrha steka
  408. struct StackNode* pop(){
  409.     // Provera da li je doslo do underflow-a
  410.     // Moze i da se izbaci
  411.     if (top == NULL) {
  412.         printf("\nStack Underflow");
  413.         exit(1);
  414.     }
  415.     else {
  416.         struct StackNode *temp;
  417.         //ono na sta pokazuje vrh postavi na pomocni pokazivac
  418.         temp = top;
  419.         // pomeri vrh steka
  420.         top = top->next;
  421.         // unisti pokazivac na sledeci
  422.         temp->next = NULL;
  423.         return temp;
  424.     }
  425. }
  426.  
  427. //Funkcija koja formira BST koriscenjem prosirene tabele
  428. Node* formBST(int *table, int *valid, int size){
  429.     int low = 0, high = size;
  430.     int mid = high/2;
  431.     //Pomocni cvor koji ce se koristiti kao koreni
  432.     Node *toor = NULL;
  433.     push(low, high);
  434.  
  435.     while(!StackEmpty()){
  436.  
  437.         //Uzmi sa vrha steka element
  438.         struct StackNode *temp = pop();
  439.         low = temp->low;
  440.         high = temp->high;
  441.  
  442.         free(temp);
  443.  
  444.         //Doslo je do deformacije preskoci ovaj element
  445.         if(high < low) continue;
  446.         //Ne mozemo na vise segmenata da delimo kod
  447.         // Proverimo da li je validan kljuc i ako jeste ubacujemo ga
  448.         else if( low == high )
  449.             if(valid[low] == 1){
  450.                 //toor = insert(toor, table[low]);
  451.                 toor = insert(toor, table[low]);
  452.                 continue;
  453.             }
  454.  
  455.         //Proveravamo da li je element na pola segmenta validan
  456.         mid = (low+high) / 2;
  457.         if(valid[mid] == 1)
  458.             toor = insert(toor, table[mid]);
  459.             //toor = insert(toor, table[mid]);
  460.  
  461.         //Ubacujemo granicnike ka gornjem i donjem preostalom segmentu
  462.         push(mid+1, high);
  463.         push(low,mid-1);
  464.     }
  465.  
  466.     return toor;
  467. }
  468.  
  469. //Provera da li je red prazan
  470. int QueueEmpty(){
  471.      if ((frontQ == NULL) && (rearQ == NULL))
  472.         return 1;
  473.     else
  474.        return 0;
  475. }
  476.  
  477. //Enqueue - ubaci u red novi Cvor
  478. void enq(Node *n){
  479.     if (rearQ == NULL){
  480.         rearQ = (struct QueueNode *)malloc(1*sizeof(struct QueueNode));
  481.         rearQ->next = NULL;
  482.         rearQ->nd = n;
  483.         frontQ = rearQ;
  484.     }else{
  485.         tempQ = (struct QueueNode *)malloc(1*sizeof(struct QueueNode));
  486.         rearQ->next = tempQ;
  487.         tempQ->nd = n;
  488.         tempQ->next = NULL;
  489.         rearQ = tempQ;
  490.     }
  491. }
  492.  
  493. //Dequeue - izbaci cvor iz reda
  494. void deq(){
  495.     front1Q = frontQ;
  496.     if (front1Q == NULL){
  497.         printf("\n Error: Trying to display elements from empty queue");
  498.         return;
  499.     }else
  500.         if (front1Q->next != NULL){
  501.             front1Q = front1Q->next;
  502.             free(frontQ);
  503.             frontQ = front1Q;
  504.         } else {
  505.             free(frontQ);
  506.             frontQ = NULL;
  507.             rearQ = NULL;
  508.         }
  509. }
  510.  
  511. // Funckija koja unistava BST u level order poretku
  512. void deleteBST(Node *root){
  513.     // Prazno stablo ne radi nista
  514.     if (root == NULL)
  515.         return;
  516.     // ubaci koreni cvor u red
  517.     enq(root);
  518.     //pomocni pokazivac na cvor kojim uzimamo element iz reda
  519.     Node *frontN = NULL;
  520.     // vrti se u petlji dok se ne isprazni red
  521.     while (!QueueEmpty()) {
  522.         // delete each node in the queue one by one after pushing their
  523.         // non-empty left and right child to the queue
  524.         //uzmi prvog iz reda
  525.         frontN = frontQ->nd;
  526.         //izabci prvog iz reda
  527.         deq();
  528.         //Ako ima levo dete, onda ubaci to dete u red
  529.         if (frontN->left)
  530.            enq(frontN->left);
  531.         //Ako ima desno dete, onda ubaci to dete u red
  532.         if (frontN->right)
  533.            enq(frontN->right);
  534.         // Tek nakon sto su deca ubacena u red, oslobadja se memorija koju je zauzimao cvor
  535.         free(frontN);
  536.     }
  537. }
  538.  
  539. //Funkcija koja ispisuje cvorove stabla u level order poretku
  540. // Isti princip kao iza brisanje stabla
  541. void printBST(Node *root){
  542.     if (root == NULL)
  543.         return;
  544.  
  545.     Node *frontN = NULL;
  546.  
  547.     enq(root);
  548.     while (!QueueEmpty()) {
  549.         frontN = frontQ->nd;
  550.         deq();
  551.         if (frontN->left)
  552.            enq(frontN->left);
  553.  
  554.         if (frontN->right)
  555.            enq(frontN->right);
  556.  
  557.         printf("%d ", frontN->key);
  558.     }
  559.     printf("\n"); //Novi red nakon ispisa svih cvorova
  560. }
  561.  
  562. int main(){
  563.  
  564.     // Deklaracija koriscenih promenljivih
  565.     int size = 0, increasFactor = 0;
  566.     int *valid = 0;
  567.     int *table = 0;
  568.     int *keys;
  569.     frontQ = rearQ = NULL;
  570.     Node *root = NULL;
  571.     int flag = 1, ch, n;
  572.  
  573.     while(flag){
  574.         printf("-===Menu===-");
  575.         printf("\n 1 - Initialize table");
  576.         printf("\n 2 - Insert into table");
  577.         printf("\n 3 - Search table");
  578.         printf("\n 4 - Delete kety");
  579.         printf("\n 5 - Display table");
  580.         printf("\n 6 - Initialize BST");
  581.         printf("\n 7 - Search BST");
  582.         printf("\n 8 - Insert into BST");
  583.         printf("\n 9 - Show BST");
  584.         printf("\n 10 - Delete BST");
  585.         printf("\n 11 - Rotate left");
  586.         printf("\n 12 - Rotate right");
  587.         printf("\n 0 - Exit");
  588.  
  589.         printf("\n Enter choice : ");
  590.         scanf("%d", &ch);
  591.  
  592.         switch(ch){
  593.         case 1:
  594.             if(table != NULL){
  595.                 free(table);
  596.                 free(keys);
  597.                 free(valid);
  598.             }
  599.             int f;
  600.             printf("How many starting keys?\n");
  601.             scanf("%d", &n);
  602.             keys = calloc(n, sizeof(int));
  603.             printf("Enter %d differnet key, in increasing order:\n", n);
  604.             for(int i = 0; i < n; i++)
  605.                 scanf("%d", &keys[i]);
  606.             printf("What is increase factor?\n");
  607.             scanf("%d", &f);
  608.             initTable(&table, &valid, n, keys,f, &size);
  609.             break;
  610.         case 2:
  611.             printf("Which key you want to insert\n");
  612.             int new;
  613.             scanf("%d", &new);
  614.             insertKey(&table, &valid, &size, new, 1);
  615.             break;
  616.         case 3:
  617.             printf("Which key to search for?\n");
  618.             int key;
  619.             scanf("%d", &key);
  620.             int ret = binarySearch(table,valid, size,key);
  621.             ret != -1 ? printf("Key %d is at position %d.\n",key, ret) : printf("Key %d is not in the table\n", key);
  622.             break;
  623.         case 4:
  624.             printf("Which key you want to delete?\n");
  625.             scanf("%d", &key);
  626.             deleteKey(&table,&valid,size,key);
  627.             break;
  628.         case 5:
  629.             printf("Table of keys:\n");
  630.             for(int i = 0; i < size; i++){
  631.                 printf("%d", table[i]);
  632.                 if(table[i] < 10)
  633.                     putchar(' ');
  634.             }
  635.             printf("\nValid table:\n");
  636.             for(int i = 0; i < size; i++)
  637.                 printf("%d ", valid[i]);
  638.             putchar('\n');
  639.             break;
  640.         case 6:
  641.             root = formBST(table,valid,size);
  642.             printf("The BST is formed.\n");
  643.             break;
  644.         case 7:
  645.             printf("Insert the key: ");
  646.             scanf("%d", &n);
  647.             if (search(root, n))
  648.                 printf("\n The key exists in BST.\n");
  649.             else
  650.                 printf("\nThe key doesnt exists in BST.\n");
  651.             break;
  652.         case 8:
  653.             printf("Insert the key: ");
  654.             scanf("%d", &n);
  655.             root = insert(root, n);
  656.             break;
  657.         case 9:
  658.             printBST(root);
  659.             break;
  660.         case 10:
  661.             deleteBST(root);
  662.             root = NULL;
  663.             printf("The BST is deleted.\n");
  664.             break;
  665.         case 11:
  666.             printf("Insert the key: ");
  667.             scanf("%d", &n);
  668.             root = rotate(root, n, 0);
  669.             break;
  670.         case 12:
  671.             printf("Insert the key: ");
  672.             scanf("%d", &n);
  673.             root = rotate(root, n, 1);
  674.             break;
  675.         case 0:
  676.             deleteBST(root);
  677.             if(table != NULL){
  678.                 free(table);
  679.                 free(keys);
  680.                 free(valid);
  681.             }
  682.             flag = 0;
  683.             break;
  684.         default:
  685.             printf("Wrong choice, Please enter correct choice");
  686.             break;
  687.         }
  688.     }
  689.     return 0;
  690. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement