3o_3v

simple bst in c

May 10th, 2022 (edited)
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.49 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct node {
  5.     struct node *levo;
  6.     struct node *pravo;
  7.     struct node *verx;
  8.     int value;
  9.     int key;
  10. };
  11.  
  12. struct node *searchnode(struct node *derevo, int key);
  13.  
  14. struct node *findmin(struct node *derevo) {
  15.     while (derevo->levo) {
  16.         derevo = derevo->levo;
  17.     }
  18.     return derevo;
  19. }
  20.  
  21. struct node *delnode(struct node *derevo, int key) {
  22.     struct node *deleting = searchnode(derevo, key);
  23.     if (!deleting) {
  24.         return derevo;
  25.     }
  26.  
  27.     if (deleting->pravo == NULL && deleting->levo == NULL) {
  28.         if (deleting->verx) {
  29.             if (deleting->verx->levo == deleting) {
  30.                 deleting->verx->levo = NULL;
  31.             } else {
  32.                 deleting->verx->pravo = NULL;
  33.             }
  34.             free(deleting);
  35.             return derevo;
  36.         } else {
  37.             free(deleting);
  38.             return NULL;
  39.         }
  40.     }
  41.  
  42.     if (deleting->pravo && deleting->levo) {
  43.         struct node *nextnode = findmin(deleting->pravo);
  44.         deleting->key = nextnode->key;
  45.         deleting->value = nextnode->value;
  46.         if (nextnode->pravo) {
  47.             if (nextnode->verx == deleting) {
  48.                 deleting->pravo = nextnode->pravo;
  49.                 nextnode->pravo->verx = deleting;
  50.             } else {
  51.                 nextnode->verx->levo = nextnode->pravo;
  52.                 nextnode->pravo->verx = nextnode->verx;
  53.             }
  54.         } else {
  55.             if (nextnode->verx == deleting) {
  56.                 deleting->pravo = NULL;
  57.             } else {
  58.                 nextnode->verx->levo = NULL;
  59.             }
  60.         }
  61.         free(nextnode);
  62.         return derevo;
  63.     }
  64.  
  65.     if (deleting->pravo) {
  66.         if (deleting->verx) {
  67.             if (deleting->verx->pravo == deleting) {
  68.                 deleting->verx->pravo = deleting->pravo;
  69.             } else {
  70.                 deleting->verx->levo = deleting->pravo;
  71.             }
  72.             deleting->pravo->verx = deleting->verx;
  73.         } else {
  74.             derevo = derevo->pravo;
  75.             derevo->verx = NULL;
  76.         }
  77.         free(deleting);
  78.         return derevo;
  79.     }
  80.  
  81.     if (deleting->verx) {
  82.         if (deleting->verx->pravo == deleting) {
  83.             deleting->verx->pravo = deleting->levo;
  84.         } else {
  85.             deleting->verx->levo = deleting->levo;
  86.         }
  87.         deleting->levo->verx = deleting->verx;
  88.     } else {
  89.         derevo = derevo->levo;
  90.         derevo->verx = NULL;
  91.     }
  92.     free(deleting);
  93.     return derevo;
  94. }
  95.  
  96. struct node *addnode(struct node *derevo, int key, int value) {
  97.     struct node *node = derevo;
  98.     struct node *prev = NULL;
  99.     while (node) {
  100.         if (key > node->key) {
  101.             prev = node;
  102.             node = node->pravo;
  103.         } else if (key < node->key) {
  104.             prev = node;
  105.             node = node->levo;
  106.         } else {
  107.             node->value = value;
  108.             return derevo;
  109.         }
  110.     }
  111.     node = malloc(sizeof(struct node));
  112.     node->key = key;
  113.     node->value = value;
  114.     node->verx = prev;
  115.     node->levo = NULL;
  116.     node->pravo = NULL;
  117.     if (!prev) {
  118.         return node;
  119.     }
  120.     if (key > prev->key) {
  121.         prev->pravo = node;
  122.     } else {
  123.         prev->levo = node;
  124.     }
  125.     return derevo;
  126. }
  127.  
  128. struct node *searchnode(struct node *derevo, int key) {
  129.     while (derevo) {
  130.         if (key > derevo->key) {
  131.             derevo = derevo->pravo;
  132.         } else if (key < derevo->key) {
  133.             derevo = derevo->levo;
  134.         } else {
  135.             return derevo;
  136.         }
  137.     }
  138.     return NULL;
  139. }
  140.  
  141. void cleanderevo(struct node *derevo) {
  142.     if(derevo == NULL){
  143.         return;
  144.     }
  145.     if(derevo->levo){
  146.         cleanderevo(derevo->levo);
  147.     }
  148.     if(derevo->pravo){
  149.         cleanderevo(derevo->pravo);
  150.     }
  151.     free(derevo);
  152. }
  153.  
  154. int main(void) {
  155.     struct node *derevo = NULL;
  156.     char c;
  157.     int k, v;
  158.     scanf("%c", &c);
  159.     while (c != 'F') {
  160.         if (c == 'A') {
  161.             scanf("%d %d", &k, &v);
  162.             derevo = addnode(derevo, k, v);
  163.         } else if (c == 'D') {
  164.             scanf("%d", &k);
  165.             derevo = delnode(derevo, k);
  166.         } else if (c == 'S') {
  167.             scanf("%d", &k);
  168.             struct node *poisk = searchnode(derevo, k);
  169.             if (poisk) {
  170.                 printf("%d %d\n", poisk->key, poisk->value);
  171.             }
  172.         }
  173.         scanf("%c", &c);
  174.     } // A = 65, D = 68, S = 83, F = 70
  175.     cleanderevo(derevo);
  176. }
  177.  
Add Comment
Please, Sign In to add comment