已知在一维数组A[m+n]中依次存放两个线性表(a1,a2,a3...,am)和(b1,b2.....,bn)。试编写一个程序,将数组中两个顺序表的位置互换,即将(b1,b2.....,bn)放在(a1,a2,a3...,am)的前面
算法:
先倒置数组,然后分别对a和b进行倒置,负负得正使a,b次序交换且保持原有顺序表内容不变
程序代码:
#include <iostream> #include <functional> #include <algorithm> using namespace std; int main() { int a[9] = { 1,2,3,4, 5,6,7,8,9 }; int m = 4, n = 5; int len = sizeof(a) / sizeof(a[0]); for (int i = 0; i < len / 2; i++) { int temp = a[i]; a[i] = a[len - i - 1]; a[len - 1 - i] = temp; } for (int i = 0; i < n / 2; i++) { int temp = a[i]; a[i] = a[n - 1 - i]; a[n - 1 - i] = temp; } for (int i = n; i < (m +n+ n) / 2; i++) { int temp = a[i]; a[i] = a[m + n+n - 1 - i]; a[m + n+n - 1 - i] = temp; } for(auto s:a) { cout << " " << s ; } }
重点:
要注意的是在整个数组倒置后对于此时的a和b来说,m和n的值发生了交换,不能仍旧认为a的位置是0~m,b的位置是m+1~m+n了
第二个是在程序中第三次倒置时,for的循环条件是i在a没有到达线性表的后一半,即为i<(n+(m+n))/2,不能想当然的写成i<(m+n)/2