已知在一维数组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)。
//试编写一个函数,将数组中两个顺序表互换,即将 (b1,b2,b3,...,bn)放在 (a1,a2,a3,...,am)的前面
#include <iostream>
#define ElemType int
#define InitSize 50
using namespace std;
typedef struct {
ElemType *data;
int MaxSize,length;
}SeqList;
void printList(SeqList L)
{
cout<<"表为:";
for (int i = 0; i < L.length; i++)
cout << L.data[i] << " ";
cout << endl;
}
void Init(SeqList &L)
{
L.data = new ElemType[InitSize]; //C++的初始动态分配语句
if (!L.data){ cout << "存储空间申请失败!"; return; }
L.length = 0;
L.MaxSize = InitSize;
}
void Reverse(ElemType A[],int left,int right,int arraySize)
{
if (left>=right || right>=arraySize) return;
int mid=(left+right)/2;
for(int i=0;i<mid-left;i++)
{
ElemType temp=A[left+i];
A[left+i]=A[right-i];
A[right-i]=temp;
}
}
void Exchange(ElemType A[],int m,int n,int arraySize)
{
Reverse(A,0,m+n-1,arraySize);
Reverse(A,0,n-1,arraySize);
Reverse(A,n,m+n-1,arraySize);
}
int main(){
SeqList a; Init(a);
SeqList b; Init(b);
int i,j,k;
cout<<"请输入a表长:"; cin>>a.length;
for ( i = 0; i < a.length; i++) cin >> a.data[i];
printList(a);
cout<<"请输入b表长:"; cin>>b.length;
for ( j = 0; j < b.length; j++) cin >> b.data[j];
printList(b);
int arraySize=50;
ElemType A[arraySize];
i=0;j=0;k=0;
for( i = 0; i < a.length; i++) A[k++]=a.data[i];
for(j = 0; j < b.length; j++) A[k++]=b.data[j];
arraySize=k;
for(k=0;k<arraySize;k++)cout<<A[k]<< "\t";
cout<<endl;
Exchange(A,a.length,b.length,a.length+b.length);
cout<<"结果为:";
for(k=0;k<a.length+b.length;k++)cout<<A[k]<< "\t";
cout<<endl;
return 0;
}
测试样例: