数据结构学习与实验指导(二)数组元素移动

本次实验是根据陈越老师的数据结构学习与实验指导中的第二章,数组元素循环右移。
一共有两个方法:①是每次移动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]);
	}
}

现在先贴着代码吧,以后有时间在补充。本人也算是个小白而已,有什么问题请指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值