数组中数据块移动(C语言国二模拟题)
请编写程序,实现功能:移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。
例如,一维数组中的原始内容为:11,22,33,44,15,66,78,18,90,110;p的值为3。移动后,一维数组中的内容应为: 15,66,78,18,90,110,11,22,33,44。
方法1:辅助空间法
(1)分配与原始空间大小相同的辅助空间;
(2)将下标0-p的数据块先保存在辅助空间中;
(3)将原始空间中余下的数据块前移;
(4)将辅助空间中p+1个数据接到原始空间的后面。
#include <stdio.h>
#define N 10
int main()
{
int a[N]={1,2,3,4,5,6,7,8,9,10},p=3;
int b[N],i; //(1)辅助空间b
for(i=0;i<=p;i++) //(2)备份p+1
b[i]=a[i];
for(i=0;i<N-p-1;i++) //(3)n-p-1个前移
a[i]=a[p+i+1];
//for(i=p+1;i<N;i++)a[i-p-1]=a[i];
for(i=0;i<=p;i++) //(4)接上 p+1
a[N-p+i-1]=b[i];
for(i=0;i<N;i++)
printf("%d,",a[i]);
}
方法2:数据块移动法
示意图如下:
代码如下:
#include <stdio.h>
#define N 10
int main()
{
int a[N]={1,2,3,4,5,6,8,8,9,10},p=3;
int temp,i,j;
for(j=0;j<=p;j++) //移动p+1次
{
temp=a[0];
for(i=1;i<N;i++) //每次移动n-1
a[i-1]=a[i];
a[N-1]=temp;
}
for(i=0;i<N;i++)
printf("%d,",a[i]);
}
结果: