Guest User

Untitled

a guest
Aug 15th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.11 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define LEFT -1
  6. #define RIGHT 1
  7. #define NODE_NUM 1024 // 最大ノード数
  8. #define START_ID 1 // intの初期値0とID=0と区別ができないので1から開始
  9. #define NAME_MAX_LENGTH // タグ名の最大長
  10.  
  11. // ポインタ有りノード
  12. typedef struct _node {
  13. struct _node* parent;
  14. struct _node* left;
  15. struct _node* right;
  16. int id;
  17. char name[NAME_MAX_LENGTH];
  18. } node;
  19.  
  20. // ポインタ無しノード
  21. typedef struct _array_node {
  22. int parent;
  23. int left;
  24. int right;
  25. char name[NAME_MAX_LENGTH];
  26. } array_node;
  27.  
  28. // ポインタ有りノードの生成
  29. node* create_node(char *name) {
  30. node* new_node;
  31. new_node = (node*)malloc( sizeof(node) );
  32. strcpy(new_node->name, name);
  33. return new_node;
  34. }
  35.  
  36. // ポインタ無しノードの生成
  37. array_node* create_array_node(char *name) {
  38. array_node* new_node;
  39. new_node = (array_node*)malloc( sizeof(array_node) );
  40. strcpy(new_node->name, name);
  41. return new_node;
  42. }
  43.  
  44. // 任意のノードに対してノードを追加する
  45. node* insert_node(node* parent, int pos, node* inserted_node) {
  46. inserted_node->parent = parent;
  47. if (pos == LEFT) parent->left = inserted_node;
  48. else parent->right = inserted_node;
  49. }
  50.  
  51. // 与えられたノードを深さ優先で再帰的に下って順序を知る
  52. // XXX idはcreate_node時に付与していけばeachする必要がなくなるかも
  53. int each(node* target, int id, node** nodes) {
  54. nodes[id] = target;
  55. target->id = id;
  56.  
  57. id++;
  58. if (target->left != NULL) id = each(target->left, id, nodes);
  59. if (target->right != NULL) id = each(target->right, id, nodes);
  60. return id;
  61. }
  62.  
  63. // ポインタ有りノード集合から ポインタ無し集合を生成
  64. map_to_array_node(node** nodes, array_node** array_nodes) {
  65. int i;
  66. for (i = START_ID; nodes[i] != NULL && i < NODE_NUM; i++) {
  67. array_nodes[i] = create_array_node(nodes[i]->name);
  68. if (nodes[i]->parent != NULL) array_nodes[i]->parent = nodes[i]->parent->id;
  69. if (nodes[i]->left != NULL) array_nodes[i]->left = nodes[i]->left->id;
  70. if (nodes[i]->right != NULL) array_nodes[i]->right = nodes[i]->right->id;
  71. }
  72. }
  73.  
  74. /*
  75. <root>
  76. <self>
  77. <child>
  78. <gchild></gchild>
  79. </child>
  80. </self>
  81. <sibling></sibling>
  82. </root>
  83. */
  84. int main(void) {
  85. node* root;
  86. node* self;
  87. node* child;
  88. node* gchild;
  89. node* sibling;
  90. node* nodes[NODE_NUM];
  91. array_node* array_nodes[NODE_NUM];
  92.  
  93. root = create_node("root");
  94. self = create_node("self");
  95. child = create_node("child");
  96. gchild = create_node("gchild");
  97. sibling = create_node("sibling");
  98.  
  99. insert_node(root, LEFT, self);
  100. insert_node(self, LEFT, child);
  101. insert_node(child, LEFT, gchild);
  102. insert_node(self, RIGHT, sibling);
  103.  
  104. each(root, START_ID, nodes);
  105. map_to_array_node(nodes, array_nodes);
  106.  
  107. // test
  108. printf("%d\n", array_nodes[START_ID + 0]->left); // 1->left = 2 : self
  109. printf("%d\n", array_nodes[START_ID + 1]->left); // 2->left = 3 : child
  110. printf("%d\n", array_nodes[START_ID + 2]->left); // 3->left = 4 : gchild
  111. printf("%d\n", array_nodes[2]->right); // 2->right = 5 : sibling
  112.  
  113. return 0;
  114. }
Add Comment
Please, Sign In to add comment