有个n整数,存储在数组array中,使其前面各数顺序向后移动m个位置,最后的m个数变成最前面的m个数,并输出

例如输入数据“1 2 3 4 5 6”,m移动3位,则输出数据“4 5 6 1 2 3。
#include <stdio.h>
int main(void)
{
int array[10];
int i,j,n,m,arrayend;
int *p;
printf("输入共有多少个数字:");
scanf("%d",&n);
printf("需要后移多少位:");
scanf("%d",&m);
printf("请依次输入%d个数:\n",n);
for(i=0;i<n;i++) /*输入数据*/
scanf("%d",&array[i]);
for(i=0;i<m;i++)
{
arrayend=*(array+n-1); /*保存指针*/
p=array+n-1; /*指针赋值*/
for(j=n-1;j>0;j--) /*循环移动*/
{
*p=*(p-1);
p--;
}
*p=arrayend; /*回复指针*/
}
printf("输出移动后的%d个数:\n",n);
for(i=0;i<n;i++)
printf("%d ",array[i]);
printf("\n");
return 0;
}

其中,for(i=0;i<n;i++)
printf("%d ",array[i]);输出的是移动后的,我主要就是不知道,移动后的指针是存储在哪里的,为什么用这个输出是移动后的
我自己弄懂了!
我搞懂了,arrayend保存的是数组元素最后一位的值,进入内循环:
for (j=n-1;j>0;j--)
{
*p=*(p-1);
p--;
/*for逆向循环,执行*p=*(p-1),此时*p指向了2,p的地址也指向了2,再执行p--,*p的指此时指向了1,p也指向了1,再执行p--,此时已经循环两次,j已经不大大于0,所以跳出循环,此时的数组为“3 1 2*/
}
进入第二次外套循环,此时arrayend指向的就是2,再执行内套循环,就成了“2 3 1”,我们再输出数组,便就是“231”!

忘掉你的指针吧。
移动后的结果,只是array数组的重新排列。结果:array[10]={4,5,6,1,2,3,0,0,0,0};
最后输出也只是将重新排列好的数组打印出来。
假如写成这样:
--------------------------
int array[]={1,2,3,4,5,6,0,0,0,0};
move(array);//move()干的是按要求排列数组的活
for(i=0;i<6;i++)
printf("%d",array[i]);
---------------------------
是否就不存在困扰呢?追问

利用指针实现数组的移动,你的这个我也知道,但你能说明这两个循环嵌套吗:

for(i=0;i0;j--) /*循环移动*/
{
*p=*(p-1);
p--;
}
*p=arrayend; /*回复指针*/
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-07
你问的这个问题是计算机专业2010年的考研题,第42题。
时间复杂度和空间复杂度都最小的一种算法:
算法思路:
将数组array[n]的n个元素原地逆置,变为(array_n-1,array_n-2,...,array_m,
arry_m-1,...,array_0),然后再将前n-m个元素原地逆置(得到arry_m,array_m+1,...,array_n-1)和后m个元素原地逆置(得到arry_0,array_1,...,array_m-1),即得到最终结果。每个数据仅需挪动两次,所以时间复杂度为O(n);除函数参数占用空间外,仅用2个整型变量,所以空间复杂度为O(1).
算法实现(关键代码):
//逆置
void reverse(int array[], int left, int right)
{
int k = left,j = right, temp; //left为左边界,right为右边界
while(k<j)
{//交换array[k]与array[j]
temp = array[k], array[k] = r[j], array[j] = temp;
k++; //k右移一个位置
j--; //j左移一个位置
}
}

void leftshit(int array[], int n, int m)
{
if(m>0&&m<n)
{
reverse(array,0,n-1); //将全部元素逆置
reverse(array,0,n-m); //将前n-m个元素逆置
reverse9(array,n-m,n-1); //将后m个元素逆置
}
}
第2个回答  2011-03-07
e <iostream>

using namespace std;

int main()
{
int array[] = ;
int i = sizeof(array)/sizeof(int);
cout << i << endl;

return 0;
}追问

谢谢您,这位不留名的热心网友,你的回答我有点不懂,因为我正在学C基础。我想知道的是解释上面这两个for循环嵌套,现在我已经从老师那里得到答案了,我已经懂了!总之谢谢您!

相似回答