• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:一次元配列で表現された最小ヒープの値挿入)

一次元配列で最小ヒープの値挿入

このQ&Aのポイント
  • ヒープに新たなデータを挿入する関数insertを作成し、空の配列に複数回insertを行うことで構成したヒープがヒープ条件を満たしていることを確認する。
  • 最小ヒープの値挿入についての質問です。
  • 1回の値挿入できるが、交換が1回しか行われないという問題を抱えています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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]が真になり続けるので無限ループ。