アプリ版:「スタンプのみでお礼する」機能のリリースについて

大きさ 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
$

質問者からの補足コメント

  • 関数 upheap()の作成と関数downheap()の作成がわかりません。例示でも良いので教えてくださると助かります。

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/01/11 16:06

A 回答 (2件)

具体的にはどこがわからなくて困っている?



と書いておきつつ, 「問題2」の文章がおかしいと指摘しておこう.
    • good
    • 0

質問は何ですか?

この回答への補足あり
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!