私の質問は、次のコードに関するものです。
#include <stdio.h>
#include <stdlib.h>
struct node
{
int v;
struct node * left;
struct node * right;
};
typedef struct node Node;
struct bst
{
Node * root;
};
typedef struct bst BST;
BST * bst_insert(BST * tree, int newValue);
Node * bst_insert_node(Node * node, int newValue);
void bst_traverseInOrder(BST * tree);
void bst_traverseInOrderNode(Node * node);
int main(void)
{
BST * t;
bst_insert(t, 5);
bst_insert(t, 8);
bst_insert(t, 6);
bst_insert(t, 3);
bst_insert(t, 12);
bst_traverseInOrder(t);
return 0;
}
BST * bst_insert(BST * tree, int newValue)
{
if (tree == NULL)
{
tree = (BST *) malloc(sizeof(BST));
tree->root = (Node *) malloc(sizeof(Node));
tree->root->v = newValue;
tree->root->left = NULL;
tree->root->right = NULL;
return tree;
}
tree->root = bst_insert_node(tree->root, newValue);
return tree;
}
Node * bst_insert_node(Node * node, int newValue)
{
if (node == NULL)
{
Node * new = (Node *) malloc(sizeof(Node));
new->v = newValue;
new->left = NULL;
new->right = NULL;
return new;
}
else if (newValue < node->v)
node->left = bst_insert_node(node->left, newValue);
else
node->right = bst_insert_node(node->right, newValue);
return node;
}
void bst_traverseInOrder(BST * tree)
{
if (tree == NULL)
return;
else
{
bst_traverseInOrderNode(tree->root);
printf("\n");
}
}
void bst_traverseInOrderNode(Node * node)
{
if (node == NULL)
return;
else
{
bst_traverseInOrderNode(node->left);
printf("%d ", node->v);
bst_traverseInOrderNode(node->right);
}
}
したがって、コードはそのまま完全に機能します。各値が BST に正しく挿入され、トラバーサル関数がツリーを正しくトラバースします。ただし、最初に t を BST として宣言するとき (27 行目など)、t を NULL に割り当てると (BST * t = NULL など)、挿入が機能しなくなります。しかし、最初の挿入に t を再割り当てすると (例: t = bst_insert(t, 5))、すべてが再び機能します。これには特別な理由がありますか?
次に、構造体へのポインタへのポインタをいつ渡す必要があるかをどのように知ることができますか? 指す値を変更したい場合は、関数int i
に渡す必要があり&i
ますよね? しかし、 内の値を変更したい場合、 だけでなく、関数にstruct node n
を渡す必要があるのはなぜですか?**node
*node
ご覧いただきありがとうございます。