程序分析:
1. 在子函数中,输入的顺序后移的m个位置是有要求的,他必须是一个大于等于零,小于等于最大位数的数字,要是超出了这个范围就是不合适的
2. 我们这里使用的是动态内存申请的数组,所以最后一定要注意把之前申请的动态内存释放掉
void Move(int* arr, int len, int m) //这里的m是需要注意的要注意m的范围
{
assert(m >= 0 && m <= len); //此处断言就是为了判断m
if(m < 0 && m > len) // 如果m超出了范围就退出
{
return;
}
int* p = (int*)malloc(m * sizeof(int)); //申请一个动态数组p
for (int i = 0; i < m; i++)
{
p[i] = arr[len - m + i]; //p[i]放的是数组arr[]的第len-m+i个位置上的数字
}
for (int i = len - m - 1; i >= 0; i--)
{
arr[i + m] = arr[i]; //把arr[]的第i个位置上的数字赋给arr[]的i+m这就实现了顺序后移
}
for (int i = 0; i < m; i++)
{
arr[i] = p[i]; //把数组p的每个位置上的数字都赋给数组arr[]相应的位置,就得到了顺序后移的新数组
}
free(p); //把之前申请的动态内存p释放掉,防止内存泄漏
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
Move(arr, sizeof(arr) / sizeof(arr[0]), 5);
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
return 0;
}
调试结果如下: