Advertisement
Guest User

bst.c

a guest
Nov 4th, 2012
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.02 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include "bst.h"
  4.  
  5. struct bstnode {
  6.     int key;
  7.     bst *left, *right;
  8. };
  9.  
  10. static void bst_swap_keys(bst *a, bst *b);
  11. static void bst_newick_rec(const bst *b);
  12. static void *ecalloc(size_t n, size_t s);
  13.  
  14. int main(void)
  15. {
  16.     bst* b = bst_new(5);
  17.  
  18.     bst_newick(b);
  19.     bst_insert(&b, 7);
  20.  
  21.     bst_newick(b);
  22.     bst_insert(&b, 3);
  23.  
  24.     bst_insert(&b, 8);
  25.     bst_insert(&b, 2);
  26.     bst_insert(&b, 1);
  27.     bst_newick(b);
  28.  
  29.     bst_remove(&b, 7);
  30.     bst_newick(b);
  31.    
  32.     bst_delete(&b);
  33.     printf("%p\n", (void*) b);
  34.  
  35.     return EXIT_SUCCESS;
  36. }
  37.  
  38. bst *bst_new(int k) {
  39.     bst *b = ecalloc(1, sizeof *b);
  40.     b->key = k;
  41.     return b;
  42. }
  43.  
  44. void bst_insert(bst **b, int k) {
  45.     if (NULL == b) {
  46.     return;
  47.     }
  48.  
  49.     if (NULL == *b) {
  50.     *b = bst_new(k);
  51.     } else if ((*b)->key > k) {
  52.     bst_insert(&(*b)->left, k);
  53.     } else if ((*b)->key < k) {
  54.     bst_insert(&(*b)->right, k);
  55.     }
  56. }
  57.  
  58. bst *bst_search(bst *b, int k) {
  59.     if (NULL == b) {
  60.     return NULL;
  61.     } else if (b->key == k) {
  62.     return b;
  63.     } else if (b->key > k) {
  64.     return bst_search(b->left, k);
  65.     } else {
  66.     return bst_search(b->right, k);
  67.     }
  68. }
  69.  
  70. bst *bst_min(bst *b) {
  71.     if (NULL != b && NULL != b->left) {
  72.     return bst_min(b->left);
  73.     } else {
  74.     return b;
  75.     }
  76. }
  77.  
  78. void bst_remove(bst **b, int k) {
  79.     bst *temp;
  80.     if (NULL == b || NULL == *b) {
  81.     return;
  82.     }
  83.     temp = *b;
  84.  
  85.     if ((*b)->key > k) {
  86.     bst_remove(&(*b)->left, k);
  87.     } else if ((*b)->key < k) {
  88.     bst_remove(&(*b)->right, k);
  89.     } else {
  90.     if (NULL != (*b)->left && NULL != (*b)->right)
  91.     {
  92.         temp = bst_min((*b)->right);
  93.         bst_swap_keys((*b), temp);
  94.         bst_remove(&(*b)->right, k);
  95.     }
  96.     else if (NULL != (*b)->left)
  97.     {
  98.         *b = (*b)->left;
  99.     }
  100.     else if (NULL != (*b)->right)
  101.     {
  102.         *b = (*b)->right;
  103.     }
  104.     else
  105.     {
  106.         (*b) = NULL;
  107.     }
  108.     free(temp);
  109.     }
  110. }
  111.  
  112. void bst_delete(bst **b) {
  113.     if (NULL == b) {
  114.     return;
  115.     }
  116.     if (NULL != *b) {
  117.     bst_delete(&(*b)->left);
  118.     bst_delete(&(*b)->right);
  119.     free(*b);
  120.     *b = NULL;
  121.     }
  122. }
  123.  
  124. void bst_newick(const bst *b)
  125. {
  126.     if (NULL != b)
  127.     {
  128.     bst_newick_rec(b);
  129.     printf(";\n");
  130.     }
  131.     else
  132.     {
  133.     printf("NULL!\n");
  134.     }
  135. }
  136.  
  137. static void bst_newick_rec(const bst *b)
  138. {
  139.     if (NULL == b) {
  140.     return;
  141.     }
  142.  
  143.     if (NULL != b->left || NULL != b->right) {
  144.     printf("(");
  145.     if (NULL != b->left && NULL != b->right) {
  146.         bst_newick_rec(b->left);
  147.         printf(",");
  148.         bst_newick_rec(b->right);
  149.     } else if (NULL != b->left) {
  150.         bst_newick_rec(b->left);
  151.     } else {
  152.         bst_newick_rec(b->right);
  153.     }
  154.     printf(")");
  155.     }
  156.     printf("%d", b->key);
  157. }
  158.  
  159. static void bst_swap_keys(bst *a, bst *b)
  160. {
  161.     int temp;
  162.     if (NULL != a && NULL != b && a != b)
  163.     {
  164.     temp = a->key;
  165.     a->key = b->key;
  166.     b->key = temp;
  167.     }
  168. }
  169.  
  170. static void *ecalloc(size_t n, size_t s) {
  171.     void *o = calloc(n, s);
  172.     if (NULL == o) {
  173.     fprintf(stderr, "Memory allocation failed!\n");
  174.     exit(EXIT_FAILURE);
  175.     }
  176.     return o;
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement