各位大神,现在这个程序可以运行。但是我不太明白那个递归调用的循环体。如何通过end 跟*p就实现了数组的变换,希望指点迷津。
//有n个整数,顺序向后移动m个位置,最后m个数变成最前面的m个数
//每次移动一个,end为每次替换的数
void move(int array[20],int n,int m){
int p,end;
end=(array+n-1);
for(p=array+n-1;p>array;p--)
p=(p-1);
*array=end;
m--;
//递归调用,当循环次数m减少到0的时候,停止调用
if(m>0)move(array,n,m);
}
int main(){
int num[20],n,m,i;
printf("共有多少数\n");
scanf("%d",&n);
printf("请输入n个数\n");
for(i=0;i
scanf("%d",&num[i]);
printf("你想要后退多少\n");
scanf("%d",&m);
move(num,n,m);
printf("现在它们是\n");
for(i=0;i
printf("%d ",num[i]);
printf("\n");
return 0;
}
分析见注释,供参考:
#include <stdio.h>
void move(int array[], int n, int m) {
int *p, end;
end = *(array + n - 1); //变量 end 保存数组最后一个元素值 array[n-1]
for (p = array + n - 1; p > array; p--)//整个数组循环右移一位,p是指针,起始指向数组最后一位 p = &array[n-1]
*p = *(p - 1); //数组元素右移赋值
*array = end; //将保存在变量end的最后一位元素移动到数组首位值即 array[0] = end;
printf("m=%d:\n", m); //以下代码,输出每次右移一位后数组的排列情况
for (p = array; p < array + n; p++)
printf("%d ", *p);
printf("\n"); //到此
m--;
//递归调用,当循环次数m减少到0的时候,停止调用
if (m > 0) move(array, n, m);
}
int main() {
int num[20], n, m, i;
printf("共有多少数\n");
scanf("%d", &n);
printf("请输入%d个数\n",n);
for (i = 0; i < n; i++)
scanf("%d", &num[i]);
printf("你想要后退多少\n");
scanf("%d", &m);
move(num, n, m);
printf("现在它们是\n");
for (i = 0; i < n; i++)
printf("%d ", num[i]);
printf("\n");
return 0;
}
//共有多少数
//5
//请输入5个数
//1 2 3 4 5
//你想要后退多少
//3
//m = 3:
//5 1 2 3 4
//m = 2 :
//4 5 1 2 3
//m = 1 :
//3 4 5 1 2
//现在它们是
//3 4 5 1 2
*arry *加一个数组名,代表着数组的首位也即arry[0]