配列 レポート問題1 解答解説

Array-1 (レベルA)

 整数型配列 array とそれに入っているデータの数 n に対して,次の操作を行う二つの関数 arrayInsert と arrayDelete とを作れ。

  1. 新しいデータ newdata を第 k 要素 array[k] の場所に挿入する関数。(挿入前に array[k] 以降にあったデータは一つずつ後ろにずらす。)
    arrayInsert(int array[], int n, int newdata, int k)
  2. 第 k 要素の内容を削除する(削除前に array[k+1] 以降にあったデータは一つずつ前にずらす)関数。
    arrayDelete(int array[], int n, int k)

1の解答

void arrayInsert(int array[], int n, int newdata, int k)の仕様
整数型配列 array の最初の n 個の要素のうち k 番目以降のものの数値を, ひとつずつ後ろにずらしたのちに,k 番目の要素 array[k] に newdata を代入する。
void arrayInsert(int array[], int n, int newdata, int k)
{
    int i;
	
    for (i = n; i > k; i--) {
        array[i] = array[i-1];
    }
    array[k] = newdata;
}
配列への挿入

array[k], ..., array[n-1] までの要素にある値は、array[k+1], ..., array[n] に移す必要がある.これを次のようにしてしまうと、誤りである.

    for (i = k; i < n; i++) {     /*      */
        array[i+1] = array[i];    /* 誤り */
    }                             /*      */

これでは、 array[k] の内容を array[k+1] に移した時点で、それまでに array[k+1] にあったデータが失われてしまう.これを避けるには、 配列の内容を後ろの方から順に移せばよい.

2 の解答

void arrayDelete(int array[], int n, int k)の仕様
整数型配列 array の最初の n 個の要素のうち k+1 番目以降のものの数値を, ひとつずつ前にずらす。(結果として k 番目の要素の数値が削除される)
void arrayDelete(int array[], int n, int k)
{
    int i;
	
    for (i = k+1; i < n; i++) {
        array[i-1] = array[i];
    }
}
配列要素の削除

array[k+1], ..., array[n-1] の内容をarray[k], ..., array[n-2] に移すので、
array[i-1] = array[i]
という代入を、配列の先頭の方から行えばよい.

まとめ

以上のテクニックをまとめると、次のようになる.