书上习题10.4
有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。写一函数实现以上功能,主函数中输入n个整数和输出调整后的n个数。
#include <stdio.h>
void move(int *p,int n,int m);
void main()
{
int n,m,i;
int num[20];
printf(“how many numbers \n”);
scanf(“%d”,&n);
printf(“input %d numbers\n”,n);
for(i=0;i<n;i++)
scanf(“%d”,&num[i]);
printf(“numbers want to move:\n”);
scanf(“%d”,&m);
move(num,n,m);
printf(“now \n”);
for(i=0;i<n;i++)
printf(“%d “,num[i]);
}
void move(int *p,int n,int m)
{
int *w,array_end;
array_end=*(p+n-1);
for(w=p+n-1;w>p;w–)
{
*w=*(w-1);
}
*w=array_end;
m–;
if(m>0)
move(p,n,m);
}
>> 本文固定链接: http://www.vcgood.com/archives/2669
学习了,好象不完整呀。
编译不过?
这个函数的好处是只移动尽量少的次数,每次都移动应该移到的
位置,而且只设置一个空位(tmp)
void move (int a[],int n, int m) /*m <=n */
{
int r,k ;
int count=0 , t=0,tmp;
while (count<n)
{
r= t ; // r is blank position;
tmp = a[r] ; // a[r]–>tmp
while (1)
{
k = (n-m+r) %n ;
if (k==t)
break ;
a[r] = a[k] ; // r+m –>r ,
count++;
r = k ;
}
a[r] = tmp ;
count++;
t++;
}
}
#define N 20
main()
{
int a[N];
int n,m ,i;
while (1)
{
printf(“enter the array of line is: < %d \n”,N);
scanf(“%d”,&n);
printf(“\n”);
printf(“enter each item of array (total %d):\n”,n );
for(i=0;i<n;i++)
{
scanf(“%d”,&a[i]);
}
printf(“enter the numbers will be moved: < %d \n”,n);
scanf(“%d”,&m);
move(a,n,m);
for(i=0;i<n;i++)
printf(“%3d”,a[i]);
printf(“\n”);
}
return 0 ;
}
void move(int *p,int n,int m)
{
int *w,array_end;
array_end=*(p+n-1);
for(w=p+n-1;w>p;w–)这里的p和w都是指针,怎能比大小呢
{
*w=*(w-1);
}
*w=array_end;
m–;
if(m>0)
move(p,n,m);
}
只要将for循环的条件改成for(w=p+n-1,i=0;i<n-1;w–,i++)就可以了