//一个数组,一共有m个,需要把后面n个移动到最前面 #include <stdio.h> #include <stdlib.h> void Move(int *arr,int n,int m) { int i; int *str = (int *)malloc(m*sizeof(int));//申请一个和需要被移动数组一样个数的动态内存 for (i = 0 ; i<m ; i++)//第一步:把数组后面的n个字移动到另一个数组里 { str[i] = arr[n-m+i]; } for (i = n-m-1 ; i>=0 ; i--)//第二步:数字从最后一个开始移动 { arr[i+m] = arr[i]; } for (i = 0 ; i<m ; i++)//第三步:把后面的数字移动到前面 { arr[i] = str[i]; } for (i = 0 ; i<n ; i++) { printf ("%d ",arr[i]); } printf ("\n"); free(str); } int main() { int arr[]={1,2,3,4,5,6,7,8,9,10}; Move(arr,sizeof(arr)/sizeof(arr[0]),3); return 0; }
当需要移动的数字个数m小于总数组数n时,只能根据图二的情况一来判断;
当需要移动的数字个数m大于等于总数组数n时,就可以依据图二的情况二来判断。
图三就是我们所说的”内存重叠“问题,如果遇到需要移动的数字个数m小于总数组数n时,就要考虑这个问题,仿照最上面的例题,解决”内存重叠“的问题。
!!!注意!!!一定不要越界!!!