题目:
有 n
个整数
,
使前面各数顺序向后移
m
个位置
,
最后
m
个数变成最前面的
m
个数
,
见下图
,
写一个函数实现该功能。
类似于书架有十本书,我们要把最后面的四本书放到最前面来的这个流程。
那么我们要做的事情就是先把后面的四本书拿下来,然后把前面的六本书往后移,最后把拿下来的四本书插到最前面去就完成了。
也就是我们要把 1 2 3 4 5 6 7 8 9 10 变成 7 8 9 10 1 2 3 4 5 6。
代码如下
//把长度为n的数字arr的后面m个数据前移
void Move(int* arr, int n,int m)//n是数组总长度
{
//第一步防错误处理,也称判断参数的合法性
if (m <= 0 || m >= n)
return;
//int brr[m];//错误
//动态创建m长度的数组
//int* brr;
int*brr = (int*)malloc(m * sizeof(int));//没有返回空指针就是申请成功了,失败返回空。
//不用管malloc到底一共申请出多少字节。C和C++都没有接口能让你真正的检测它实际给了你多少内存,这是它的内部信息,你只管你需要的内存够用就行
assert(brr != NULL);
if (brr == NULL)//申请内存失败
return;
//把arr后面的m个数据复制到brr中,重点的下标,i从m的第一个数开始比较好,即n-m+i
for (int i = 0; i < m; i++)
{
brr[i] = arr[n - m + i];
}
//把arr中前n-m个数据后移,从最后面的数据先移动,如果从最前面的数据先移就会覆盖掉原有的数据,如先移第一个数据就会覆盖掉原来的第五个数据,用循环
//如果将i放arr的结尾,那么前面要移的数就是i-m,i++,这是左下标;如果将i放在前面要移的数的末尾(n-m-1),那后面移植的位置就是i+m。从后面开始移,i要--。这是右下标
for (int i =n-m-1; i >=0; i--)
{
arr[i + m] = arr[i];
}
//把brr的数据复制到arr的前面,用循环
for (int i = 0; i < m; i++)
{
arr[i] = brr[i];
}
//释放brr
free(brr);
}
void Show(int* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%4d", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
Show(arr, sizeof(arr) / sizeof(arr[0]));
Move(arr, sizeof(arr) / sizeof(arr[0]), 4);//sizeof(arr)/sizeof(arr[0])是求数组长度公式
Show(arr, sizeof(arr) / sizeof(arr[0]));
return 0;
}