配列の要素を、右方向に回転移動する関数を作る。 //********************************************************* // 大きさ 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, 関連
・配列の要素を逆順に並べ替える |
|