問題描述:在一維數組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; }