有 n 个整数,使前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m个数,见下图,写一个函数实现该功能。

题目:
        有 n 个整数 , 使前面各数顺序向后移 m 个位置 , 最后 m 个数变成最前面的 m 个数 , 见下图 , 写一个函数实现该功能。
        类似于书架有十本书,我们要把最后面的四本书放到最前面来的这个流程。
那么我们要做的事情就是先把后面的四本书拿下来,然后把前面的六本书往后移,最后把拿下来的四本书插到最前面去就完成了。
也就是我们要把 1 2 3 4 5 6 7 8 9 10 变成  7 8 9 10 1 2 3 4 5 6。
        代码如下
//把长度为n的数字arr的后面m个数据前移
void Move(int* arr, int n,int m)//n是数组总长度
{
	//第一步防错误处理,也称判断参数的合法性
	if (m <= 0 || m >= n)
		return;
	//int brr[m];//错误
	//动态创建m长度的数组
	//int* brr;
	int*brr = (int*)malloc(m * sizeof(int));//没有返回空指针就是申请成功了,失败返回空。
	//不用管malloc到底一共申请出多少字节。C和C++都没有接口能让你真正的检测它实际给了你多少内存,这是它的内部信息,你只管你需要的内存够用就行
	assert(brr != NULL);
	if (brr == NULL)//申请内存失败
		return;
	//把arr后面的m个数据复制到brr中,重点的下标,i从m的第一个数开始比较好,即n-m+i
	for (int i = 0; i < m; i++)
	{
		brr[i] = arr[n - m + i];
	}
	//把arr中前n-m个数据后移,从最后面的数据先移动,如果从最前面的数据先移就会覆盖掉原有的数据,如先移第一个数据就会覆盖掉原来的第五个数据,用循环
	//如果将i放arr的结尾,那么前面要移的数就是i-m,i++,这是左下标;如果将i放在前面要移的数的末尾(n-m-1),那后面移植的位置就是i+m。从后面开始移,i要--。这是右下标
	for (int i =n-m-1; i >=0; i--)
	{
		arr[i + m] = arr[i];
	}
	//把brr的数据复制到arr的前面,用循环
	for (int i = 0; i < m; i++)
	{
		arr[i] = brr[i];
	}

	//释放brr
	free(brr);
}
void Show(int* arr, int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%4d", arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	Show(arr, sizeof(arr) / sizeof(arr[0]));
	Move(arr, sizeof(arr) / sizeof(arr[0]), 4);//sizeof(arr)/sizeof(arr[0])是求数组长度公式
	Show(arr, sizeof(arr) / sizeof(arr[0]));
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值