Advertisement
Guest User

Untitled

a guest
Apr 30th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.71 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdbool.h>
  4.  
  5. #define t 2
  6. #define NUM_OF_KEYS 1000
  7. #define RAND_NUMBER_MAX 1000
  8.  
  9. typedef struct node
  10. {
  11. int n; // number of nodes in leaf
  12. int key[2 * t - 1]; // array of keys
  13.  
  14. bool leaf; // is leaf
  15.  
  16. struct node* c[2 * t]; // if not leaf the pointers to childs
  17.  
  18. } node;
  19.  
  20. typedef struct tree {
  21. node* root;
  22. } tree;
  23.  
  24. node *b_tree_new_node()
  25. {
  26. node *n = (node*)malloc(sizeof(node));
  27.  
  28. for (int i = 0; i < 2 * t; i++)
  29. {
  30. n->c[i] = NULL;
  31. }
  32.  
  33. for (int i = 0; i < 2 * t - 1; i++)
  34. {
  35. n->key[i] = NULL;
  36. }
  37.  
  38. return n;
  39.  
  40. }
  41.  
  42. void b_tree_split_child(node* x, int i)
  43. {
  44. node* z = b_tree_new_node();
  45.  
  46. node* y = x->c[i];
  47.  
  48. z->leaf = y->leaf;
  49. z->n = t - 1;
  50.  
  51. for (int j = 0; j < t - 1; j++)
  52. {
  53. z->key[j] = y->key[j + t];
  54. }
  55.  
  56. if (y->leaf == false)
  57. {
  58. for (int j = 0; j < t; j++)
  59. {
  60. z->c[j] = y->c[j + t];
  61. }
  62. }
  63.  
  64. y->n = t;
  65.  
  66. for (int j = x->n; j > i; j--)
  67. {
  68. x->c[j + 1] = x->c[j];
  69. }
  70. x->c[i + 1] = z;
  71.  
  72. for (int j = x->n; j > i; j--)
  73. {
  74. x->key[j] = x->key[j - 1];
  75. }
  76.  
  77. x->key[i] = y->key[t - 1];
  78. x->n = x->n + 1;
  79.  
  80. // DISK WRITE Y
  81. // DISK WRITE Z
  82. // DISK WRITE X
  83. }
  84.  
  85. void b_tree_insert_nonfull(node* x, int k)
  86. {
  87.  
  88. int i = x->n;
  89.  
  90. if (x->leaf == true)
  91. {
  92. while (i > 0 && k < x->key[i - 1])
  93. {
  94. x->key[i] = x->key[i - 1];
  95. i = i - 1;
  96. }
  97.  
  98. x->key[i] = k;
  99. x->n = x->n + 1;
  100. // DISK WRITE X
  101. }
  102. else
  103. {
  104.  
  105.  
  106. while (i > 0 && k < x->key[i - 1])
  107. {
  108. i = i - 1;
  109. }
  110.  
  111. // DISK READ X->C[I]
  112.  
  113. // if chosen child is full
  114. if (x->c[i]->n == 2 * t - 1)
  115. {
  116. b_tree_split_child(x, i);
  117.  
  118. if (k > x->key[i])
  119. {
  120. i = i + 1;
  121. }
  122. }
  123. b_tree_insert_nonfull(x->c[i], k);
  124. }
  125. }
  126.  
  127. void b_tree_insert(tree *T, int k)
  128. {
  129. // temp pointer to root
  130. node* r = T->root;
  131.  
  132. // if node is full
  133. if (r->n == (2 * t - 1))
  134. {
  135. // create new node
  136. node* s = b_tree_new_node();
  137. // new node is now the root
  138. T->root = s;
  139. // new node won't be leaf
  140. s->leaf = false;
  141. // new node is empty
  142. s->n = 0;
  143. // new node points to previous root
  144. s->c[0] = r;
  145.  
  146. b_tree_split_child(s, 0);
  147. b_tree_insert_nonfull(s, k);
  148. }
  149.  
  150. // if node is not full
  151. else
  152. {
  153. b_tree_insert_nonfull(r, k);
  154. }
  155. }
  156.  
  157. bool b_tree_search(node* x, int k)
  158. {
  159. int i = 0;
  160.  
  161. while (i < x->n && k > x->key[i])
  162. {
  163. i = i + 1;
  164. }
  165. if (i <= x->n && k == x->key[i])
  166. {
  167. return true;
  168. }
  169. else if (x->leaf)
  170. {
  171. return NULL;
  172. }
  173. else
  174. {
  175. return b_tree_search(x->c[i], k);
  176. }
  177. }
  178.  
  179. void init_random_generator()
  180. {
  181. srand(time(NULL));
  182. }
  183.  
  184. int random_number()
  185. {
  186. rand();
  187. return rand() % RAND_NUMBER_MAX + 1;
  188. }
  189.  
  190. void init_array(int **n, int numToAdd)
  191. {
  192. *n = (int*)malloc(sizeof(int));
  193.  
  194. if (*n == NULL)
  195. {
  196. printf("Error in malloc!");
  197. return;
  198. }
  199.  
  200. (*n)[0] = numToAdd;
  201. }
  202.  
  203. void add_to_array(int **n, int numToAdd)
  204. {
  205. static int sizeCount = 0;
  206. sizeCount++;
  207. int tempcount = sizeCount;
  208.  
  209. int *temp;
  210.  
  211. temp = (int*)realloc(*n, (sizeCount + 1) * sizeof(int));
  212.  
  213. if (temp == NULL)
  214. {
  215. printf("Error in realloc!");
  216. return;
  217. }
  218.  
  219. *n = temp;
  220.  
  221. (*n)[sizeCount] = numToAdd;
  222.  
  223. }
  224.  
  225. void print_test_array(int *test_array) {
  226. for (int i = 0; i < NUM_OF_KEYS; i++)
  227. {
  228. printf("[%d]", test_array[i]);
  229. }
  230. printf("\n");
  231. }
  232.  
  233. bool check_for_duplicates(int **test_array, int a_number)
  234. {
  235. for (int i = 0; i < NUM_OF_KEYS; i++)
  236. {
  237. if ((*test_array)[i] == a_number)
  238. {
  239. return true;
  240. }
  241. }
  242. return false;
  243. }
  244.  
  245. void load_array_data(int **test_array)
  246. {
  247. for (int i = 0; i < NUM_OF_KEYS; i++)
  248. {
  249. if (*test_array == NULL)
  250. {
  251. init_array(test_array, random_number());
  252. }
  253. else
  254. {
  255. int a_number = random_number();
  256.  
  257. while (check_for_duplicates(test_array, a_number) == true)
  258. {
  259. a_number = random_number();
  260. }
  261.  
  262. add_to_array(test_array, a_number);
  263. }
  264. }
  265.  
  266. }
  267.  
  268. int main()
  269. {
  270. init_random_generator();
  271. int *test_array = NULL; // { 3, 7, 1, 2, 5, 6, 8, 9, 4, 10, 11 };
  272. printf(">loading test data\n");
  273. load_array_data(&test_array);
  274. //print_test_array(test_array);
  275.  
  276. node *x = b_tree_new_node();
  277. x->leaf = true;
  278. x->n = 0;
  279.  
  280. tree T;
  281. T.root = x;
  282.  
  283. printf(">building tree\n");
  284.  
  285. int known_random_number = random_number();
  286.  
  287. // insert nodes
  288. for (int i = 0; i < NUM_OF_KEYS; i++) {
  289. int random = random_number();
  290. b_tree_insert(&T, test_array[i]);
  291. }
  292.  
  293. int failed_tests = 0;
  294.  
  295. printf(">searching all keys\n");
  296.  
  297. for (int i = 0; i < NUM_OF_KEYS; i++)
  298. {
  299. if (b_tree_search(T.root, test_array[i]) == false)
  300. {
  301. printf("Element not found: %d\n", test_array[i]);
  302. failed_tests++;
  303. }
  304. }
  305.  
  306.  
  307. if (failed_tests == 0)
  308. {
  309. printf(">all tests passed successfully\n");
  310. }
  311.  
  312. getchar();
  313.  
  314. return 0;
  315. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement