- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:一次元配列で表現された最小ヒープの値挿入)
一次元配列で最小ヒープの値挿入
このQ&Aのポイント
- ヒープに新たなデータを挿入する関数insertを作成し、空の配列に複数回insertを行うことで構成したヒープがヒープ条件を満たしていることを確認する。
- 最小ヒープの値挿入についての質問です。
- 1回の値挿入できるが、交換が1回しか行われないという問題を抱えています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 1回しか交換されません。 この↓中で*nを更新していないから(while-loopが一回止まり)じゃないかしら。 void insert(int val, int a[], int *n) int temp; a[*n] = val; while(a[(*n-1) / 2] >= a[*n]){ temp = a[(*n-1) / 2]; a[(*n-1) / 2] = a[*n]; a[*n] = temp; } }
その他の回答 (1)
- Wr5
- ベストアンサー率53% (2173/4061)
回答No.1
操作しようとしているmain()の配列変数aは、ローカル変数であってヒープではありません。 現状で初期値が設定されているのが10個、配列のサイズが11個なのであと1つの値を入れることは可能ですが…課題の要件は満たさないでしょう。 # というかこの場合のヒープってなんでしょう?? で…… >while(a[(*n-1) / 2] >= a[*n]){ > temp = a[(*n-1) / 2]; > a[(*n-1) / 2] = a[*n]; > a[*n] = temp; >} のループでは*nの値(というか、アドレス渡しする必要あるんでしょうか?)は変化していません。 条件が真だったら1回入れ替えが実行され、後は条件から外れるのでループ終了するでしょう。 # 条件が「以上」となっているので、無限ループする可能性もありますが。 # 今回の場合、main()でbが15だったときに時に、a[(*n-1) / 2] >= a[*n]が真になり続けるので無限ループ。