我是靠谱客的博主 呆萌鸡翅,最近开发中收集的这篇文章主要介绍数组左移右移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、左移右移(结构体)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复