已知一维数组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;
}
}
有问题欢迎指导 小白学习中