问题描述:在一维数组A[m+n]中依次存放两个线性表(a1,a2,a3...am)和(b1,b2,b3...bn)。编写一个函数,将数组中两个顺序表的位置互换,即将(b1,b2,b3...bn)放在(a1,a2,a3...am)的前面。算法
算法设计思想:首先将数组中的所有元素(a1,a2,a3...am,b1,b2,b3...bn)原地逆置为(bn...b3,b2,b1,am...a3,a2,a1),而后再将前n个元素和后m个元素分别逆置,从而实现顺序表的位置互换。数组
代码及结果:函数
线性表逆序可参考:空间复杂度为O(1)的条件下将顺序表逆置https://blog.csdn.net/Dear_Jia/article/details/108352798.net
#include<stdio.h> #include "线性表的顺序表示和实现.cpp" bool Reverse(int A[],int left,int right,int arraySize){ //将数组A[]中的(A[left],A[left+1]...A[right])逆置为(A[right],A[right-1]...A[left+1],A[left]) if(left >= right || right >= arraySize) return false; int mid = (left + right)/2; for(int i = 0;i <= mid - left;i++){ int temp = A[i + left]; A[i + left] = A[right - i]; A[right - i] = temp; } return true; } void Exchange(int A[],int m,int n,int arraySize){ //将数组A[m+n]中依次存放的两个线性表(a1,a2,a3...am)和(b1,b2,b3...bn)的位置互换,即将(b1,b2,b3...bn)放在(a1,a2,a3...am)的前面。 Reverse(A,0,m+n-1,arraySize); Reverse(A,0,n-1,arraySize); Reverse(A,n,m+n-1,arraySize); } int main(){ //test int A[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; printf("数组中线性表位置互换后为:"); Exchange(A,10,5,15); for(int i = 0;i < 14;i++) printf("%d ",A[i]); printf("%d\n",A[14]); return 0; }