题目描述
将两个有序表合并为一个新的有序顺序表,并由函数返回结果顺序表
算法思想
首先,按照顺序不断取出两个顺序表L1,L2中表头较小的结点存储到新的顺序表L3中,因为是有序表,所以剩余元素肯定比已经添加到L3中的所有元素都要大,所以只需将两个顺序表中剩余的元素依次添加到L3中即可。
核心代码
//合并两个有序表
bool Merge(SqlList &L1,SqlList &L2,SqlList &L3){
//当需要合并的两个有序表长度大于存放结果的表的最大长度时,返回false,表示无法合并
if(L1.length+L2.length>MaxSize)
return false;
int i=0,j=0,k=0;
//将两个有序表两两比较,较小的元素加入结果集
while(i<L1.length&&j<L2.length){
if(L1.data[i]<=L2.data[j]){
L3.data[k++]=L1.data[i++];
}else{
L3.data[k++]=L2.data[j++];
}
}
//将两个有序表有剩余元素的表尾元素加入结果集
while(i<L1.length){
L3.data[k++]=L1.data[i++];
}
while(j<L2.length){
L3.data[k++]=L2.data[j++];
}
//更新存放结果集的表长
L3.length=k;
return true;
}
完整测试代码
//将两个有序表合并为一个新的有序顺序表,并由函数返回结果顺序表
#include"stdio.h"
#define MaxSize 10
typedef struct SqlList{
int data[MaxSize];
int length;
}SqlList;
//初始化
bool InitList(SqlList &L){
for(int i=0;i<MaxSize;i++){
L.data[i]=0;
}
L.length=0;
}
//插入元素
bool ListInsert(SqlList &L,int i,int e){
//判断插入位置是否合法
if(i<1||i>L.length+1)return false;
//判断当前顺序表是否已满
if(L.length>=MaxSize)return false;
//在第i个位置插入元素e
for(int j=L.length;j>=i;j--){
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.length++;
return true;
}
//合并两个有序表
bool Merge(SqlList &L1,SqlList &L2,SqlList &L3){
//当需要合并的两个有序表长度大于存放结果的表的最大长度时,返回false,表示无法合并
if(L1.length+L2.length>MaxSize)
return false;
int i=0,j=0,k=0;
//将两个有序表两两比较,较小的元素加入结果集
while(i<L1.length&&j<L2.length){
if(L1.data[i]<=L2.data[j]){
L3.data[k++]=L1.data[i++];
}else{
L3.data[k++]=L2.data[j++];
}
}
//将两个有序表有剩余元素的表尾元素加入结果集
while(i<L1.length){
L3.data[k++]=L1.data[i++];
}
while(j<L2.length){
L3.data[k++]=L2.data[j++];
}
//更新存放结果集的表长
L3.length=k;
return true;
}
//打印顺序表
void PrintList(SqlList &L){
for(int i=0;i<L.length;i++){
printf("%d\t",L.data[i]);
}
printf("\n");
}
//测试
int main(){
SqlList L1,L2,L3;
InitList(L1);
InitList(L2);
InitList(L3);
for(int i=0;i<4;i++){
ListInsert(L1,i+1,2*(i+1));
}
for(int j=0;j<6;j++){
ListInsert(L2,j+1,3*(j+1));
}
printf("有序表L1中的元素如下:\n");
PrintList(L1);
printf("有序表L2中的元素如下:\n");
PrintList(L2);
printf("将L1,L2合并后存入L3,结果如下:\n");
Merge(L1,L2,L3);
PrintList(L3);
return 0;
}