我是靠谱客的博主 呆萌鸡翅,最近开发中收集的这篇文章主要介绍数组左移右移1、数组左移右移(循环)2、左移右移(逆置)3、左移右移(用递归方法写的逆置)4、左移右移(结构体),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、数组左移右移(循环)

void Output(const int* ar, int n)
{
	for (int i = 0; i < n; ++i)
	{
		printf("%d ", ar[i]);
	}
}

void Right_Move_Array(int* ar, int n)
{
	assert(ar != nullptr && n > 0);
	int tmp = ar[n-1];
	for (int i = n-1; i > 0; --i)
	{
		ar[i] = ar[i - 1];
	}
	ar[0] = tmp;
}

void Left_Move_Array(int* ar, int n)
{
	assert(ar != nullptr && n > 0);
	int tmp = ar[0];
	for (int i = 0; i < n-1; ++i)
	{
		ar[i] = ar[i + 1];
	}
	ar[n-1] = tmp;
}

void Left_Move_Array_K(int* ar, int n, int k)
{
	assert(ar != nullptr && n > 0);
	bool tag = k >= 0 ? true : false;
	if (tag)
	{
		k = k % n;
		for (int i = 0; i < k; ++i)
		{
			Left_Move_Array(ar, n);
		}
	}
	else
	{
		k = -k;
		k = k % n;
		for (int i = 0; i < k; ++i)
		{
			Right_Move_Array(ar, n);
		}
	}
}

void Right_Move_Array_K(int* ar, int n, int k)
{
	Left_Move_Array_K(ar, n, -k);
}

int main()
{
	const int n = 10;
	int ar[n] = { 10,9,8,7,6,5,4,3,2,1 };
	int k = 0;

	printf("please enter a number:");
	scanf_s("%d", &k);
	Right_Move_Array_K(ar, n, k);
	Output(ar, n);

	return 0;
}

2、左移右移(逆置)

示例:
数组{12,23,34,45,56,67,78,89,90,100}左移三位。
第一步:左三位数逆置,{34,23,12,45,56,67,78,89,90,100}。
第二步:右七位数逆置,{34,23,12,100,90,89,78,67,56,45}。
第三步:整体逆置,{45,56,67,78,89,90,100,12,23,34}。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>


void Output(const int* ar, int n)
{
	for (int i = 0; i < n; ++i)
	{
		printf("%d ", ar[i]);
	}
}


void Move(int* br, int l, int r)
{
	int tmp = 0;
	int i = 0;
	int j = 0;
	for (i = l,j = r; i < j; ++i, --j)
	{
		tmp = br[i];
		br[i] = br[j];
		br[j] = tmp;
	}
}

//左移右移
void Reverse_Array(int* ar, int n,int k)
{
	int tag = 1;
	int left = 0;
	int right = n - 1;
	assert(ar != nullptr && n > 0);
	if (k < 0)
	{
		k = -k;
		tag = 0;
	}
	k = k % n;
	if (tag)
	{
		Move(ar, left, k - 1);
		Move(ar, k, right);
		Move(ar, 0, n-1);
	}
	else
	{
		Move(ar, left, n - k - 1);
		Move(ar, n - k, right);
		Move(ar, 0, n - 1);
	}
}


int main()
{
	const int n = 10;
	int ar[n] = { 10,9,8,7,6,5,4,3,2,1 };
	int k = 0;

	printf("please enter a number:");
	scanf_s("%d", &k);
	Reverse_Array(ar, n, k);
	Output(ar, n);

	return 0;
}

3、左移右移(用递归方法写的逆置)

void Swap_Int(int *ap,int *bp)
{
	int tmp = *ap;
	*ap = *bp;
	*bp = tmp;
}

void ReverseAr(int* br, int left, int right)
{
	while(left < right)
	{
		Swap_Int(&br[left++], &br[right--]);
	}
	return;
}

void Left_Move_Array_K(int* br, int n, int k)
{
	assert(br != nullptr);
	k = k % n;
	ReverseAr(br, 0, k - 1);
	ReverseAr(br, k, n - 1);
	ReverseAr(br, 0, n - 1);
}

int main()
{
	const int n = 10;
	int ar[n] = { 12,23,34,45,56,67,78,89,90,100 };
	int k = 3;
	Left_Move_Array_K(ar, n, k);

	for (int i = 0; i < n; ++i)
	{
		printf("%d ", ar[i]);
	}
	return 0;
}

4、左移右移(结构体)

#include<stdio.h>
#include<assert.h>

//用结构体写的左移右移

#define ARSIZE 10

struct MoveArray
{
	int data[ARSIZE];
	int curpos;
	int maxsize;
};

int GetElem(struct MoveArray* par, int pos)
{
	return par->data[(pos + par->curpos) % par->maxsize];
}

void Print_Ar(struct MoveArray* par)
{
	for (int i = 0; i < par->maxsize; ++i)
	{
		printf("%d ", GetElem(par, i));
	}
	printf("n");
}

void Left_Move_K(struct MoveArray* par, int k)
{
	par->curpos = k;
	Print_Ar(par);
}

void Right_Move_K(struct MoveArray* par, int k)
{
	par->curpos = par->maxsize - k;
	Print_Ar(par);
}

void Init_MoveAr(struct MoveArray* par, int k)
{
	if (k > 0)
	{
		Left_Move_K(par,k);
	}
	else
	{
		k = -k;
		Right_Move_K(par, k);
	}
}

int main()
{
	MoveArray ar = { 12,23,34,45,56,67,78,89,90,100,0,ARSIZE };
	int k = 0;

	printf("please enter a number:");
	scanf_s("%d", &k);
	Init_MoveAr(&ar, k);

	return 0;
}

定义一个结构体,结构体包括:数组、起始位置、数组大小。
初始中起始位置为0,即从数组的第一个数字进行读取。
如果左移三位,则起始位置向右移三位,即从数组的第三个数字进行读取,当读取到数组末尾时,起始位置(3)加上读取的第几位数(8),再对数组大小取余((3+8)%10=1),这样读取的数就转到数组的第一个数了。(右移同理)

最后

以上就是呆萌鸡翅为你收集整理的数组左移右移1、数组左移右移(循环)2、左移右移(逆置)3、左移右移(用递归方法写的逆置)4、左移右移(结构体)的全部内容,希望文章能够帮你解决数组左移右移1、数组左移右移(循环)2、左移右移(逆置)3、左移右移(用递归方法写的逆置)4、左移右移(结构体)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部