質問: p->data) ここの部分で教科書では関数を使って比べていましたがむずかしいので不等号を使って比べることにしました keyは値ですが、p->dataは番地ですよね 同じように値同士で扱うにはどのようにしたら良いのでしょうか 構造体の場合、アロー演算子は番地、ドットが実体だと習いましたがエラーが出てしまいます 3関数の値渡しについてです case 1: printf("追加する数字を入力してください\n"); scanf("%d",&a); insert(a); break; case 5: printf("指定した値の番地を出力します\n"); scanf("%d",&key1); search(key1); break; case 6: printf("指定した値を削除します\n"); scanf("%d",&key2); delete(key2); break; ここの部分で出力する場合の値と指定した値の変数名はそれぞれ変えたほうが良いですよね? 4探索した値の番地を出力する際に、 /* もしキーと注目している節のデータとが等しければポインタを関数として返す */ printf("探索した値の番地です>>%d\n",p->data); return p; としていますが、めちゃくちゃな状態です 探索した値の番地を返す場合、 return pはどのように扱えば良いのか悩みます。 ### 補足情報(FW/ツールのバージョンなど 初心者で使い方がよく分かっていません 自分の理解が正しいのか不安なのでコメント多いです 見づらければ修正します ご指摘ください
回答: searchのインデントを修正しました。 あきらかにおかしいことが判るかと思います。 whileの外側でNotExistを印字すべきです。 ``` NODE *search(int key) { NODE *p; /* 現在注目している節 */ p = root; /* まず根に注目する */ /* 進むべき子が存在する限り繰り返す */ while (p != NULL) { /* キーと注目している節のデータが等しいか比較 */ if (key == p->data) { /* もしキーと注目している節のデータとが等しければポインタを関数として返す */ printf("探索した値の番地です>>%p\n", p); return p; } else if (key < p->data) { /* キーの方が小さければ左部分木に進む */ p = p->left; } else { /* キーの方が大きければ右部分木に進む */ p = p->right; } /* ループを抜け出たということは見付からなかったというと NULL返して失敗したことを知らせる */ printf("NotExist\n"); return NULL; } } ```