题目是:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,写一个函数实现以上功能
#include
int input(int *p)
{
int i=0;
do
{
scanf("%d",p+i);
i++;
}
while(*(p+i-1)!=-1);
return i-1;
}
int* mv(int n,int m,int p)
{
int i,b[100],*c=NULL;
for(i=0;i<m;i++)
{
b[i]=(p+m-1);
}
for(i=0;i<n-m;i++)
{
b[m-1+i]=*(p+i);
}
c=b;
return c;
}
void output(int p,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d",(p+i));
}
}
int main()
{
int a[100],n,m,*o=NULL;
n=input(a);
printf("请输入m(把数据最后的m个数按顺序移动到最前):\n");
scanf("%d",m);
o=mv(n,m,a);
output(o,n);
return 0;
}
问题如下:
1.有很多地方少了星号(*),不知道是不是复制粘贴的原因
2.mv函数里两个for循环都有问题
3.你不能把一个局部数组b给返回main函数,需要malloc或者new才行
#include<iostream>
#include<vector>
using namespace std;
int input(int *p)
{
int i=0;
do
{
scanf("%d",p+i);
i++;
}
while(*(p+i-1)!=-1);
return i-1;
}
int* mv(int n,int m,int *p)
{
int *b = (int *)malloc(sizeof(int) * n);
int i;
for(i=0;i<m;i++)
{
b[i]=*(p+n-m+i);
}
for(i=0;i<n-m;i++)
{
b[m+i]=*(p+i);
}
return b;
}
void output(int *p,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d ",*(p+i));
}
}
int main()
{
int a[100],n,m,*o=NULL;
n=input(a);
printf("请输入m(把数据最后的m个数按顺序移动到最前):\n");
scanf("%d",&m);
o=mv(n,m,a);
output(o,n);
free(o);
return 0;
}
假设你输入了1 2 3 4 5 6 7 8 9, 9个数, 你想移动后4个数到前面, 那么:
1. 先旋转后面4个数, 结果是 1 2 3 4 5 9 8 7 6
2. 在旋转前面5个数, 结果是 5 4 3 2 1 9 8 7 6
3. 最后将整个数组旋转, 结果是 6 7 8 9 1 2 3 4 5
用个环形队列就好了吧
首先, 你的说的移动是怎样的移动
比如:
第一种: 1 2 3 4 5 6 移动四位后变成 3 4 5 6 1 2
第二种: 1 2 3 4 5 6 移动四位后变成 6 5 4 3 1 2
根据这两种不同的移动, 我做了不同的操作 , 希望可以帮到你, 具体代码如下(可在VS运行):
第一种操作演示及结果:
第二种操作演示及结果:
代码中有详细的注释,还有你的代码错误的地方之前几位都已经给出,你自行研究吧。
![
![
第一次用这个平台,有点不太懂弄,现在我再把全部代码放上去。刚才图片怎么就没有全部上传呢? 哈哈哈……