[PR]

配列の要素を回転移動する

戻る

 配列の要素を、右方向に回転移動する関数を作る。

//*********************************************************
// 大きさ size の要素 num 個からなる配列 array の要素を
// 右方向に要素 shift 個分だけ回転移動する。
//*********************************************************
void
memrrotate
	(
		void   *array,
		size_t  shift,
		size_t  num,
		size_t  size
	 )
{
	memreverse( array,                      num,       size ); // 012345678 -> 876543210
	memreverse( array,                      shift,     size ); // 876543210 -> 678543210
	memreverse( (char *)array+(size*shift), num-shift, size ); // 678543210 -> 678012345
}//memrrotate

 配列の要素を、左方向に回転移動する関数を作る。

//*********************************************************
// 大きさ size の要素 num 個からなる配列 array の要素を
// 左方向に要素 shift 個分だけ回転移動する。
//*********************************************************
void
memlrotate
	(
		void   *array,
		size_t  shift,
		size_t  num,
		size_t  size
	)
{
	memreverse( array,                      shift,     size ); // 012345678 -> 210345678
	memreverse( (char *)array+(size*shift), num-shift, size ); // 210345678 -> 210876543
	memreverse( array,                      num,       size ); // 210876543 -> 345678012
}//memlrotate

使用例

// 関数 memrrotate(), memlrotate() の使用例です。
int main( void )
{
#define print_array(a) {for(int i=0;i<numof(a);i++){printf("%d, ",a[i]);}puts("");}

	int  a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	
	puts( "右回転" );
	print_array( a );
	memrrotate( a, 1, numof(a), sizeof(int) ); print_array( a );
	memrrotate( a, 2, numof(a), sizeof(int) ); print_array( a );
	memrrotate( a, 3, numof(a), sizeof(int) ); print_array( a );

	puts( "\n左回転" );
	print_array( a );
	memlrotate( a, 1, numof(a), sizeof(int) ); print_array( a );
	memlrotate( a, 2, numof(a), sizeof(int) ); print_array( a );
	memlrotate( a, 3, numof(a), sizeof(int) ); print_array( a );

	return 0;

#undef print_array // #define print_array(a)
}//main

実行結果

右回転
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
9, 0, 1, 2, 3, 4, 5, 6, 7, 8,
7, 8, 9, 0, 1, 2, 3, 4, 5, 6,
4, 5, 6, 7, 8, 9, 0, 1, 2, 3,

左回転
4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
5, 6, 7, 8, 9, 0, 1, 2, 3, 4,
7, 8, 9, 0, 1, 2, 3, 4, 5, 6,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

関連

配列の要素を逆順に並べ替える
整列済み配列から重複する要素を取り除く
配列が整列されているかどうか調べる
配列から要素を検索する
配列をランダムに並べ替える



Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp