有n個整數,使前面各數順序向後移m個位置,最後m個數變成最前面m個數。見下圖。寫一函數實現以上功能,在主函數中輸入n個整數和輸出調整後的n個數。
1⃣️:原本的數據,記n=10、m=3
2⃣️:將後三個數據取出放入一個新容器中
3⃣️:將前面七個數據向後移動三位,再將後三個數據挪進去
4⃣️:創建一個新格子,格子大小爲m(運用到動態內存)
5⃣️:將7先向後移動三位,i的位置表示爲I=n-m-1
6⃣️:n-m個數字移動完後,將整個格子挪到前面的位置中
#include <stdio.h>
void Move(int *arr,int m,int n)
{
assert(arr!=NULL);
if(m<=0||n<=0||m>=n)//不用挪
return;
int *brr = (int *)malloc(m*sizeof(int));
int i;
/*for(i=n-m;i<n;i++)
{
brr[i-n+m] = arr[i];//i作爲arr下標,容器下標爲i-(n-m)
}*/
for(i=0;i<m;i++)//i作爲brr下標
{
brr[i] = arr[i+n-m];
}
//將arr前段數據後移
for(i=n-m-1;i>=0;i--)
{
arr[i+m] = arr[i];
}
for(i=0;i<m;i++)
{
arr[i] = brr[i];
}
free(brr);
}
void Show(int *arr,int len)
{
for(int i=0;i<len;i++)
{
printf("%d",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
Move(arr,3,sizeof(arr)/sizeof(arr[0]));
Show(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}
令m=3,將12345678910移動結果輸出:
89101234567