構造リストに似たものを作成しています。main の先頭で、null ポインターを宣言します。次に、insert() 関数を数回呼び出し、そのポインターへの参照を渡し、新しい要素を追加します。
しかし、何かが間違っているようです。リストの要素を表示できstd::cout
ず、警告なしでコンパイルされたとしても、プログラムを壊すだけです。
#include <iostream>
struct node {
node *p, *left, *right;
int key;
};
void insert(node *&root, const int key)
{
node newElement = {};
newElement.key = key;
node *y = NULL;
std::cout << root->key; // this line
while(root)
{
if(key == root->key) exit(EXIT_FAILURE);
y = root;
root = (key < root->key) ? root->left : root->right;
}
newElement.p = y;
if(!y) root = &newElement;
else if(key < y->key) y->left = &newElement;
else y->right = &newElement;
}
int main()
{
node *root = NULL;
insert(root, 5);
std::cout << root->key; // works perfectly if I delete cout in insert()
insert(root, 2);
std::cout << root->key; // program breaks before this line
return 0;
}
ご覧のとおり、挿入関数で新しい構造要素を作成し、ルート ポインター内に保存します。最初の呼び出しでは while ループは開始されていないので機能し、メイン関数でルートの要素を表示できます。
しかし、2 番目の呼び出しでは、while ループは既に機能しており、説明した問題が発生します。
root->key
これを最初の呼び出しに配置しても機能しないため、構文に問題があります。
何が問題で、その理由は何ですか?
また、次のようなポインターを介して新しいリストの要素を挿入することを常に見てきました。
node newElement = new node();
newElement->key = 5;
root->next = newElement;
このコードは次と同じですか:
node newElement = {};
newElement.key = 5;
root->next = &newElement;
? 少しきれいになり、メモリを削除する必要がなくなります。