用指针实现数组元素循环移动

任务描述
本关任务:编写程序,用指针实现以下功能, n 个整数存入一维数组中,将该数组循环左移 m 位。如一个长度为 10 的数组中原来的元素顺序为0 1 2 3 4 5 6 7 8 9,则循环左移 3 个位置后元素的顺序为 3 4 5 6 7 8 9 0 1 2。

相关知识
为了完成本关任务,有两种算法思想:一种是使用辅助数组实现数据移动;另一种是不使用辅助数组,只需一个中间变量就可实现数据移动。

使用辅助数组实现数据移动
创建一个同样大小辅助数组,存放临时数据,最后将数据存回原数组。

#include
#define N 20
int main()
{
int a[N],b[N];
int i,n,m;
int *p;
printf(“输入整数个数:”);
scanf(“%d”,&n);
printf(“输入%d个整数:\n”,n);
for(i=0;i {
scanf(“%d”,&a[i]);
}
p = a;
printf(“输入移动位数:”);
scanf(“%d”,&m);
for( i=0;i {
b[i] = *(p+(i+m)%n);
}
for(i=0;i {
a[i] = b[i];
printf(“%d “,a[i]);
}
printf(”\n”);
return 0;
}
不使用辅助数组实现数据移动
假如一个长度为n=10的数组中,原来的元素顺序为(0 1 2 3 4 5 6 7 8 9),循环左移m=3个位置。不使用辅助数组实现数据移动的步骤如下:

第一步:首先逆置数组前m个元素,则数组中元素为(2 1 0 3 4 5 6 7 8 9);
第二步:逆置余下n-m个元素,则数组中元素为(2 1 0 9 8 7 6 5 4 3);
第三步:逆置整个数组a, 则数组中元素为(3 4 5 6 7 8 9 0 1 2)。
采用此算法仅需要很少的额外空间,在时间和空间上都很高效。

编程要求
请仔细阅读右侧代码,结合相关知识,在 Begin-End 区域内进行代码补充,实现数组的循环左移。

测试说明
测试输入:
10
91 1 42 32 9 57 6 33 2 88
3

输入说明:
第一行为n,表示n个整数。
第二行为n个整数。
第三行为m,表示移动m位。

预期输出:
32 9 57 6 33 2 88 91 1 42

开始你的任务吧,祝你成功!

#include 
#define N 20
int main()
{
    int a[N];
    int i,n,m,t; 
    int *p,*q;
    scanf("%d",&n);//输入整数个数
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    p = a;
    scanf("%d",&m);//输入移动位数
    /***** 首先逆置数组前m个元素 *****/
    /********** Begin *********/
    for( p = &a[0], q = &a[m-1] ;p < q; p++, q--)
    {
        t=*p; *p=*q; *q=t;
    }
    /********** End **********/
    /***** 逆置余下n-m个元素 *****/
    /********** Begin *********/
    for( p = &a[m], q = &a[n-1] ;p < q; p++, q--)
    {
        t=*p; *p=*q; *q=t;
    }
    /********** End **********/
    /***** 逆置整个数组 *****/
    /********** Begin *********/
    for( p = &a[0], q = &a[n-1] ;p < q; p++, q--)
    {
        t=*p; *p=*q; *q=t;
    }
    /********** End **********/
    for(i=0;i<n;i++)
    {  
        printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}

利用第二个方法,用三次for来进行位置交换的操作。

你可能感兴趣的:(算法,数据结构,c语言)