1.题目描述
已知一维数组A[m+n]中依次存放两个线性表( a 1 , a 2 , . . . , A m a_1,a_2,...,A_m a1,a2,...,Am)和( b 1 , b 2 , . . . , b n b_1,b_2,...,b_n b1,b2,...,bn)。将数组中两个顺序表的位置交换,即将( b 1 , b 2 , . . . , b n b_1,b_2,...,b_n b1,b2,...,bn)放在( a 1 , a 2 , . . . , A m a_1,a_2,...,A_m a1,a2,...,Am)前面。编程解决该问题。
2.算法思想
这个想法来源于线性代数。
(
A
T
B
T
)
T
(A^TB^T)^T
(ATBT)T = BA。
就是先将A的顺序颠倒过来再将B的循序颠倒过来。然后再将整体的顺序颠倒过来。就可以实现从AB到BA的过程。
3.代码呈现
顺序表的基本结构和操作详见:https://blog.csdn.net/zfq17796515982/article/details/107140989
主要代码:
void reverse(SqList &L, int s, int e){ // 左闭右闭
int mid = (s+e)/2;
for(int i=s;i<=mid;i++){
swap(L.data[i], L.data[s+e-i]);
}
}
void f(SqList &L, int n, int m){
reverse(L, 0, n-1);
reverse(L, n, n+m-1);
reverse(L, 0, n+m-1);
}
int main()
{
SqList L;
L.data = new ElemType[MaxSize];
L.length = 0;
int n, m;
cin>>n>>m; // 输入前一段和后一段的长度。
for(int i=0;i<n+m;i++){
ElemType c; cin>>c;
ListInsert(L, i+1, c);
}
ListPrint(L);
f(L, n, m);
ListPrint(L);
return 0;
}
4.运行结果
3 4
1 2 3 6 7 8 9
1 2 3 6 7 8 9
6 7 8 9 1 2 3