rbtree_test.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "rbtree.h"
  4. typedef int rbtree_key_type;
  5. typedef int rbtree_val_type;
  6. struct rbtree_entry {
  7. struct rb_node rb_node;
  8. rbtree_key_type key;
  9. rbtree_val_type val;
  10. };
  11. int rbtree_insert(struct rb_root* root, struct rbtree_entry* entry) {
  12. printf("insert %d\n", entry->key);
  13. struct rb_node** n = &root->rb_node;
  14. struct rb_node* parent = NULL;
  15. struct rbtree_entry* e = NULL;
  16. while (*n) {
  17. parent = *n;
  18. e = rb_entry(*n, struct rbtree_entry, rb_node);
  19. if (entry->key < e->key) {
  20. n = &(*n)->rb_left;
  21. } else if (entry->key > e->key) {
  22. n = &(*n)->rb_right;
  23. } else {
  24. return -1;
  25. }
  26. }
  27. rb_link_node(&entry->rb_node, parent, n);
  28. rb_insert_color(&entry->rb_node, root);
  29. return 0;
  30. }
  31. int rbtree_remove(struct rb_root* root, struct rbtree_entry* entry) {
  32. printf("remove %d\n", entry->key);
  33. rb_erase(&entry->rb_node, root);
  34. return 0;
  35. }
  36. struct rbtree_entry* rbtree_search(struct rb_root* root, const rbtree_key_type* key) {
  37. struct rb_node* n = root->rb_node;
  38. struct rbtree_entry* e = NULL;
  39. while (n) {
  40. e = rb_entry(n, struct rbtree_entry, rb_node);
  41. if (*key < e->key) {
  42. n = n->rb_left;
  43. } else if (*key > e->key) {
  44. n = n->rb_right;
  45. } else {
  46. return e;
  47. }
  48. }
  49. return NULL;
  50. }
  51. void rbtree_entry_print(struct rbtree_entry* entry) {
  52. if (entry == NULL) {
  53. printf("null\n");
  54. return;
  55. }
  56. printf("%d:%d\n", entry->key, entry->val);
  57. }
  58. int main() {
  59. struct rb_root root = { NULL };
  60. struct rbtree_entry* entry = NULL;
  61. struct rbtree_entry entries[10];
  62. for (int i = 0; i < 10; ++i) {
  63. memset(&entries[i], 0, sizeof(struct rbtree_entry));
  64. entries[i].key = i;
  65. entries[i].val = i;
  66. }
  67. rbtree_insert(&root, &entries[1]);
  68. rbtree_insert(&root, &entries[2]);
  69. rbtree_insert(&root, &entries[3]);
  70. rbtree_insert(&root, &entries[7]);
  71. rbtree_insert(&root, &entries[8]);
  72. rbtree_insert(&root, &entries[9]);
  73. rbtree_insert(&root, &entries[4]);
  74. rbtree_insert(&root, &entries[5]);
  75. rbtree_insert(&root, &entries[6]);
  76. rbtree_remove(&root, &entries[1]);
  77. rbtree_remove(&root, &entries[9]);
  78. rbtree_remove(&root, &entries[4]);
  79. rbtree_remove(&root, &entries[6]);
  80. int key = 5;
  81. entry = rbtree_search(&root, &key);
  82. rbtree_entry_print(entry);
  83. key = 4;
  84. entry = rbtree_search(&root, &key);
  85. rbtree_entry_print(entry);
  86. struct rb_node* node = NULL;
  87. // while((node = rb_first(&root))) {
  88. while((node = root.rb_node)) {
  89. entry = rb_entry(node, struct rbtree_entry, rb_node);
  90. rb_erase(node, &root);
  91. rbtree_entry_print(entry);
  92. memset(entry, 0, sizeof(struct rbtree_entry));
  93. }
  94. return 0;
  95. }