版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/github_38201918/article/details/82929266
计算机考研王道数据结构2.2.4编程第8题另解
- 因为本人考研所以在学习王道的数据结构做到这题的时候有了和答案不一样的想法,打算发出来和大家讨论一下能不能这样解
- 题目:
已知在一维数组A【m+n】中依次存放着线性表(a1,a2,a3,…,am)和(b1,b2,b3,…,bn)。试编写一个函数,将数组中两个顺序表的位置互换,即将(b1,b2,b3,…,bn)放在(a1,a2,a3,…,am)前面。 - 书上的解法:
==思路:==首先将数组A[m+n]中的全部元素(a1,a2,a3,…,am,b1,b2,b3,…bn)原地逆置为(bn,bn-1,…b1,am,am-1,am-2,…a1),再对前n个元素和后m个元素分别使用逆置算法,就可以得到(b1,b2,b3,…,bn,a1,a2,a3,…,am),从而实现顺序表的位置互换。
代码
书本的代码
typedef int DataType;
void Reverse(DataType A[],int left,int right,int arraySize){
//逆转(aleft,aleft+1,aleft+2,...aright)为(aright,aright-1,...,aleft)
if(left>=right||right>=arrSize)
return;
int mid=(left+right)/2;
for(int i =0;i<=mid-left;i++){
DataType temp=A[left-i];
A[left+i]=A[right-i];
A[right-i]=temp;
}
}
void Exchange(DataType A[],int m ,int n,int arraySize){
/*数组A[m+n]中,从0到m-1存放顺序表(a1,a2,a3,....,am),从m到m+n-1存放顺序表(b1,b2,b3,...,bn),算法将这两个表的位置互换*/
Reverse(A,0,m+n-1,arraySize);
Reverse(A,0,n-1,arraySize);
Reverse(A,n,m+n-1,arraySize);
}
我的想法
我觉得王道的思维有点略显复杂,实际上,原来的位置+平移长度对全长度进行取余,得到的结果就恰好是最后的坐标,所以这题可以大胆的使用这个方法。
大意如图(画的不好)
代码如下:
代码
我的代码
#include<stdio.h>
#include<stdlib.h>
void ChangeList(int A[],int m,int n){//A的元素的总量为n+m
int temp1=A[0],temp2;//交换中间变量
int all=m+n;
if(all&1){//为奇数
for(int i=0;i<all;i++){
temp2=A[m*(i+1)%all];
A[m*(i+1)%all]=temp1;
temp1=temp2;
}
}
else{//偶数的情况
for(int i=0;i<all/2;i++){//偶数位进行调换
temp2=A[m*(i+1)%all];
A[m*(i+1)%all]=temp1;
temp1=temp2;
}
temp1=A[1];
for(int i=0;i<all/2;i++){//偶数位进行调换
temp2=A[(m*(i+1)+1)%all];
A[(m*(i+1)+1)%all]=temp1;
temp1=temp2;
}
}
}
main(){
int A[10]={0,1,2,3,4,5,6,7,8,9};
printf("原来的序列是:");
for(int i =0;i<10;i++){
printf("%d ",A[i]);
}
printf("\n");
ChangeList(A,6,4);
printf("现在前面m=6和后面n=4进行交换得到:");
for(int i =0;i<10;i++){
printf("%d ",A[i]);
}
}
代码运行结果: