C言語による多分木の実装と可視化機能

多分木データ構造は様々な応用分野で利用されますが、実装方法は使用目的によって大きく異なります。本実装は組み込みシステム向けに設計されたシンプルな多分木で、スレッド管理などの用途を想定しています。

データ構造定義

#define MAX_CHILDREN 32
#define NODE_NAME_LENGTH 32

typedef struct tree_node {
    long identifier;
    struct tree_node* parent_ptr;
    int child_count;
    struct tree_node* child_nodes[MAX_CHILDREN];
    void* user_data;
} tree_node_t;

typedef struct node_list {
    tree_node_t* node_data;
    struct node_list* next_ptr;
} node_list_t;

typedef int (*name_callback_t)(long id, char* name_buffer);

typedef struct tree_structure {
    tree_node_t root_node;
    char initialized;
    int stack_index;
    char stack_data[MAX_CHILDREN][NODE_NAME_LENGTH];
    T_hSemaphore semaphore_lock;
    name_callback_t name_callback;
} tree_structure_t;

主要API関数

tree_node_t* find_tree_node(tree_structure_t* tree, long target_id);
int insert_child_node(tree_structure_t* tree, long parent_id, long child_id);
int insert_sibling_node(tree_structure_t* tree, long sibling_id, long new_id);
int remove_tree_node(tree_structure_t* tree, long target_id);
tree_structure_t* create_tree(void);
int initialize_tree(tree_structure_t* tree, long root_id, name_callback_t callback);
node_list_t* convert_tree_to_list(tree_structure_t* tree, long start_id);
node_list_t* get_child_nodes_list(tree_structure_t* tree, long parent_id);
int print_tree_linear(tree_structure_t* tree, long start_id);
int print_tree_hierarchical(tree_structure_t* tree, long start_id);

ノード操作の実装例

static tree_node_t* create_new_node(void) {
    tree_node_t* new_node = (tree_node_t*)memory_allocate(sizeof(tree_node_t));
    new_node->child_count = 0;
    memset(new_node->child_nodes, 0, MAX_CHILDREN * sizeof(tree_node_t*));
    return new_node;
}

static tree_node_t* recursive_node_search(tree_node_t* current_node, long target_id) {
    tree_node_t* result = NULL;
    
    if (current_node != NULL) {
        if (target_id == current_node->identifier) {
            result = current_node;
        } else {
            for (int i = 0; i < current_node->child_count && result == NULL; i++) {
                result = recursive_node_search(current_node->child_nodes[i], target_id);
            }
        }
    }
    return result;
}

ツリー表示機能

この実装では2種類の表示方法を提供します:

  • 線形表示: ノードを連鎖的に表示
  • 階層表示: インデントを使って木構造を視覚的に表現
static void display_node_hierarchical(tree_structure_t* tree, tree_node_t* node) {
    char node_name[16];
    char prefix[8];
    
    get_node_name(tree, node->identifier, node_name);
    prefix[0] = '\0';
    
    // 階層表示のためのプレフィックス生成
    if (tree->stack_index > 0) {
        tree_node_t* parent = node->parent_ptr;
        int prefix_index = 0;
        
        if (node == parent->child_nodes[0]) {
            prefix[prefix_index] = '-';
            tree->stack_data[tree->stack_index][prefix_index++] = '|';
        } else if (node == parent->child_nodes[parent->child_count - 1]) {
            prefix[prefix_index] = '`';
            tree->stack_data[tree->stack_index][prefix_index++] = ' ';
        } else {
            prefix[prefix_index] = '|';
            tree->stack_data[tree->stack_index][prefix_index++] = '|';
        }
        prefix[prefix_index] = '-';
        tree->stack_data[tree->stack_index][prefix_index++] = ' ';
    }
    
    // 表示処理の続き...
}

タグ: C言語 データ構造 多分木 組み込みシステム ツリー可視化

6月26日 16:56 投稿