笔记:
代码:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
void swap_int(int *ap,int *bp)
{
int tmp=*ap;
*ap=*bp;
*bp=tmp;
}
void left_movear(int *br,int n)//左移动1个元素
{
if(nullptr==br||n<2) return;
int tmp=br[0];
for(int i=0;i<n-1;++i)//不减一会把越界的数据赋值给9下标
{
br[i]=br[i+1];
}
br[n-1]=tmp;
}
void right_movear(int *br,int n)//左移动1个元素
{
if(nullptr==br||n<2) return;
int tmp=br[n-1];
for(int i=n-1;i>0;--i)//等于0会越界
{
br[i]=br[i-1];
}
br[0]=tmp;
}
void kleft_movear(int *br,int n,int k)
{
if(k>=0)
{
while(k--)
{
right_movear(br,n);
}
}
else//正数右移负数左移
{
while(k++)
{
right_movear(br,n);
}
}
}
void kright_movear(int *br,int n,int k)
{
if(nullptr==br||n<2) return;
k=k%n;//取余数
if(k>=0)
{
while(k--)
{
right_movear(br,n);
}
}
else//正数右移负数左移
{
while(k++)
{
right_movear(br,n);
}
}
}
void print_ar(const int *br,int n)
{
if(nullptr==br) return;
for(int i=0;i<n;++i)
{
printf("%5d",br[i]);
}
printf("\n");
}
void reverse_ar(int *br,int left,int right)//数组倒置函数
{
if(nullptr==br||left>=right) return;
while(left<right)
{
swap_int(&br[left],&br[right]);
left++;
right--;
}
}
void left_kmove(int *br,int n,int k)
{
if(nullptr==br||n<2||k<1) return;
k=k%n;//取余数
reverse_ar(br,0,k-1);
reverse_ar(br,k,n-1);
reverse_ar(br,0,n-1);
}
void right_kmove(int *br,int n,int k)
{
if(nullptr==br||n<2||k<1) return;
k=k%n;//取余数
int n1=n-k;
reverse_ar(br,0,n1-1);
reverse_ar(br,n1,n-1);
reverse_ar(br,0,n-1);//妙啊妙啊
}
int main()
{
int ar[]={12,23,34,45,56,67,78,89,90,100};
int n=sizeof(ar)/sizeof(ar[0]);
print_ar(ar,n);
//left_movear(ar,n);
//print_ar(ar,n);
//right_movear(ar,n);
//print_ar(ar,n);
//kleft_movear(ar,n,5);
//print_ar(ar,n);
kright_movear(ar,n,-5);
print_ar(ar,n);
//left_kmove(ar,n,3);//第二种方法
//print_ar(ar,n);
right_kmove(ar,n,5);//第二种方法
print_ar(ar,n);
return 0;
}
结果:
12 23 34 45 56 67 78 89 90 100
67 78 89 90 100 12 23 34 45 56
12 23 34 45 56 67 78 89 90 100