已知一维数组A[M+N]中依次存放两个线性表(a1,a2,a3,a4....an与b1,b2,b3...bn)试写函数将两顺序表的位置互换

已知一维数组A[M+N]中依次存放两个线性表(a1,a2,a3,a4....an与b1,b2,b3...bn)试写函数将两顺序表的位置互换,即将b1,b2,b3...bn放在a1,a2,a3,a4....an前面


刚看这个题,想的第一种算法是
先将M,N进行比较,如果M大,则将b顺序表前移到表头

a1 a2 a3…an b1 b2 b3…bn 变成
b1 b2 b3…bn a(n+1) a(n+2)…am a1 a2 a3…an
然后再把a1 a2 a3…an往前移m-n
这种算法显然复杂难算

后面发现的一种简单的算法

①先将整个顺序表翻转,然后分别将a,b翻转
a1 a2 a3…an b1 b2 b3…bn 变成
bn…b3,b2,b1 an…a3 a2 a1
②将bn…b3 b2 b1 翻转
b1 b2 b3…bn an…a3 a2 a1
③将 an…a3 a2 a1 翻转
b1 b2 b3…bn a1 a2 a3…an

插入代码:Ctrl/Command + Shift + K

话不多说,上代码

void demo(SqList &L)
{
	int temp,j;
	for(j=0;j<(M+N)/2;j++)//进行倒转操作①
	{
		temp = L.data[j];
		L.data[j] = L.data[M+N-1-j];
		L.data[M+N-1-j] = temp;
	}
	for(j=0;j<N/2;j++)//进行倒转操作②
	{
		temp = L.data[j];
		L.data[j] = L.data[N-1-j];
		L.data[N-1-j] = temp;
	}
	for(j=0;j<M/2;j++)//进行倒转操作③
	{
		temp = L.data[N+j];
		L.data[N+j] = L.data[M-1-j];
		L.data[M-1-j] = temp;	
	}
}

如果单独写一个翻转函数也是不错的方法
这里就只写翻转函数了

void exchange(int data[],int left,int right)
{
    int j,temp;
	for(j=0;j<(right-left)/2;j++)
	{
		temp = data[left+i];
		data[left+i] = data[right-i];
		data[right-i] = temp;
	}
}

有问题欢迎指导 小白学习中

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值