大きさ size の配列 heap を考える。すなわち、各要素値 heap[i]に対し、2*i+1<size-1 ならば heap[i]<heap[2*i+1]となり、2*i+2<size-1 ならば heap[i]<heap[2*i+2]となるようなデー タ格納を考える。未完成プログラムを以下に示す。
#include <stdio.h>#include <stdlib.h>void printarray(int heap[], int size); void swap(int heap[], int i, int j);
void upheap(int heap[], int i);
void downheap(int heap[], int i, int size); int main(void){
int data[] = {8, 98, 87, 36, 35, 54, 11, 33, 6, 79}, size = 10; int *heap, i;
heap = (int *) malloc(sizeof(int)*size);
for(i = 0; i <size; i++){
heap[i] = data[i];
upheap(heap, i);
}
printarray(heap, size);
// heap[0] = heap[--size];
// downheap(heap, 0, size);
// printarray(heap, size); return 0;
}
void printarray(int heap[], int size){
int i;
for (i = 0; i <size; i++)
printf("%2d%c", heap[i], i == size-1 ? '\n': ' '); }
void swap(int heap[], int i, int j){ int tmp = heap[i];
heap[i] = heap[j];
heap[j] = tmp;
}
void upheap(int heap[], int i){
// ここを作成(問題1)
}
void downheap(int heap[], int i, int size){ // ここを作成(問題2)
}
問題1:
配列 data[i]に格納されている要素値を配列 heap[i]へ順次格納し、課題の条件を満たすよう に、配列 heap の要素値を入れ替える関数 upheap()を作成せよ。関数は指定したプロトタイプに従い、下記の実行結果が得られることを確認せよ。 ヒント:j=2*i+1 または j=2*i+2 ならば、i は(j-1)/2 で求まる。
[実行例]
$ ./a.exe
6 8 11 33 36 87 54 98 35 79
$
問題2:
main 関数内のコメントアウトを削除し、heap[0]の値が heap[size-1]に、size が size-1 に置 き換える。課題の条件を満たすように、置き換えられたれた heap[0]の値を入れ替える関数 downheap()を作成せよ。関数は指定したプロトタイプに従い、下記の実行結果が得られることを 確認せよ。
ヒント:heap[i]の値は、2*i+2<size-1ならばheap[2*i+1] とheap[2*i+2]の小さい方と入 れ替えることになる
[実行例]
$ ./a.exe
6 8 11 33 36 87 54 98 35 79
8 33 11 35 36 87 54 98 79
$
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# C言語 3 2022/10/04 15:07
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
【C++】関数ポインタの使い方
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
「{ } で囲むだけ」は正しい?
-
実数の整数部,小数部の取得
-
c言語の配列を使ってサイコロを...
-
if と配列の組み合わせ
-
C言語で行列の積を計算できるよ...
-
入力を待たずにstdinの監視をし...
-
C言語 エラーの原因がわからな...
-
C++でvectorにテキストファイル...
-
ラップ関数とはどんなものですか?
-
数字列を3桁ごとにカンマで区切...
-
return 1L
-
PowerShellがうまくいかない
-
C言語の配列をC++のvectorに高...
-
野球の対戦成績のテーブル表示...
-
部分行列の抜き出し(C言語)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
c++でテンプレートのコードでわ...
-
(int *)の意味
-
ラップ関数とはどんなものですか?
-
数字列を3桁ごとにカンマで区切...
-
c言語のリダイレクトによる円...
-
比較回数と交換回数表示について
-
実数の整数部,小数部の取得
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
PowerShellがうまくいかない
-
c言語の配列を使ってサイコロを...
-
課題でつまってます・・・
-
C言語のサイコロシミュレート
-
エラー 添字が付けられた値が、...
おすすめ情報
関数 upheap()の作成と関数downheap()の作成がわかりません。例示でも良いので教えてくださると助かります。