本次实验是根据陈越老师的数据结构学习与实验指导中的第二章,数组元素循环右移。
一共有两个方法:①是每次移动1个元素,循环移动N次 ②通过三次逆序数组的部分数据
下面是代码:
方法①
#include<stdio.h>
#define ArrayMax 100
int dir;
void Shift(int arr[],int n);
void show(int arr[],int n);
int main(){
int a[ArrayMax];
int m,n,i;
printf("请输入数据长度、移动位数、左移(0)右移(1)");
scanf("%d%d%d",&n,&m,&dir);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
if(dir==1)printf("\n右移前:\n");
if(dir==0)printf("\n左移前:\n");
show(a,n);
m%=n;
for(i=0;i<m;i++){
Shift(a,n);
}
if(dir==1)printf("\n右移后:\n");
if(dir==0)printf("\n左移后:\n");
show(a,n);
}
void Shift(int arr[],int n)
{
int arrayend,arrayhead,i;
if(dir==1){
arrayend=arr[n-1];
for(i=n-1;i>0;i--)
{
arr[i]=arr[i-1];
}
arr[0]=arrayend;
}
if(dir==0){
arrayhead=arr[0];
for(i=0;i<n-1;i++)
{
arr[i]=arr[i+1];
}
arr[n-1]=arrayhead;
}
}
void show(int arr[],int n)
{
int i;
for(i=0;i<n;i++){
printf("%d ",arr[i]);
}
}
方法②`
#include<stdio.h>
#define ArrayMax 100
#define Swap(a,b) a^=b,b^=a,a^=b;
void show(int arr[],int n);
void Shift(int arr[],int n,int m);
int dir;
int main(){
int a[ArrayMax];
int m,n,i;
printf("请输入数据长度、移动位数、左移(0)右移(1)");
scanf("%d%d%d",&n,&m,&dir);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
if(dir==1)printf("\n右移前:\n");
if(dir==0)printf("\n左移前:\n");
show(a,n);
m%=n;
Shift(a,n,m);
if(dir==1)printf("\n右移后:\n");
if(dir==0)printf("\n左移后:\n");
show(a,n);
}
void Shift(int arr[],int n,int m)
{
int arrayend,arrayhead,i,j;
if(dir==1){
if(m>0 && m<n){
for(i=0,j=n-1;i<j;i++,j--){
Swap(arr[i],arr[j]);
}
for(i=0,j=m-1;i<j;i++,j--){
Swap(arr[i],arr[j]);
}
for(i=m,j=n-1;i<j;i++,j--){
Swap(arr[i],arr[j]);
}
}
}
if(dir==0){
if(m>0 && m<n){
for(i=0,j=n-1;i<j;i++,j--){
Swap(arr[i],arr[j]);
}
for(i=0,j=n-m-1;i<j;i++,j--){
Swap(arr[i],arr[j]);
}
for(i=n-m,j=n-1;i<j;i++,j--){
Swap(arr[i],arr[j]);
}
}
}
}
void show(int arr[],int n)
{
int i;
for(i=0;i<n;i++){
printf("%d ",arr[i]);
}
}
现在先贴着代码吧,以后有时间在补充。本人也算是个小白而已,有什么问题请指教!