はじめての C

二分木の挿入プログラムが やっと できた ...


/* b_insert.c */
#include
#include

struct Node {
int data;
struct Node *left;
struct Node *right;
};

int new_node();
int tree_insert();
void btree_walk();
int tree_height();

main()
{
int value;
struct Node *root;

root = NULL;
while (scanf("%d", &value) != EOF)
tree_insert(&root, value);
btree_walk(root);
putchar('\n');
printf("%d\n", tree_height(root));

return 0;
}

int new_node(struct Node **node, int value)
{
*node = malloc(sizeof(**node));

if (*node == NULL)
return 0;
(*node)->data = value;
(*node)->left = NULL;
(*node)->right = NULL;
return 1;
}

int tree_insert(struct Node **tree, int value)
{
struct Node **prev, *node;

prev = tree;
node = *tree;

for ( ; ; ) {
if (node == NULL)
return new_node(prev, value);
else if (value > node->data) {
prev = &node->right;
node = node->right;
}
else if (value < node->data) {
prev = &node->left;
node = node->left;
}
else
return 1;
}
}

void btree_walk(struct Node *tree)
{
if (tree == NULL)
return;
btree_walk(tree->left);
printf("%d ", tree->data);
btree_walk(tree->right);
}

int tree_height(struct Node *tree)
{
int left_height;
int right_height;

if (tree == NULL)
return -1;
left_height = tree_height(tree->left);
right_height = tree_height(tree->right);

if (left_height < right_height)
return right_height + 1;
else
return left_height + 1;
}

コンパイルして、random.txt を使って 確認。

$cc -c b_insert.c
$cc -o b_insert b_insert.o
$./b_insert < random.txt