将两个有序顺序表合并为一个新的有序顺序表,并由函数返回合并后的顺序表
思路1:遍历两个顺序表L0,L1,把L1中的元素依次插入到L0中。(插入每次都要把后面的元素后移,时间复杂度高)
思路2:同时遍历两个元素并比较,依次存放到第三个顺序表L2中。这里要注意的是:最后有表会有剩余元素,要将所有的剩余元素想办法全部加到新表最后。
思路2代码
//将两个有序顺序表合并为一个新的有序顺序表,并由函数返回合并后的顺序表
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 5
typedef struct {
int* data;
int length;
}SqList;
// ---------------------------- 初始化-----------------------------
bool InitList0(SqList& L) {
L.data = (int*)malloc(sizeof(int) * (Maxsize));
L.length = Maxsize;
for (int i = 0; i < L.length; i++) {
L.data[i] = i + 1;
}
return true;
}
bool InitList1(SqList& L) {
L.data = (int*)malloc(sizeof(int) * (Maxsize));
L.length = Maxsize;
for (int i = 0; i < L.length; i++) {
L.data[i] = i * i;
}
return true;
}
bool InitList2(SqList& L) {
L.data = (int*)malloc(sizeof(int) * (Maxsize));
L.length = Maxsize * 2;
/* for (int i = 0; i < L.length; i++) {
L.data[i] = i * i;
}*/
return true;
}
void Merge(SqList& L0, SqList& L1, SqList& L2) {
int i = 0, j = 0;
for (int k = 0; k < L2.length; k++) {
if(i < L0.length && j < L1.length) {
if (L0.data[i] < L1.data[j]) {
L2.data[k] = L0.data[i];
i++;
}
else if (L0.data[i] >= L1.data[j]) {
L2.data[k] = L1.data[j];
j++;
}
}
else if(i == L0.length) {
L2.data[k] = L1.data[j++];
}
else if(j == L1.length) {
L2.data[k] = L0.data[i++];
}
}
}
void print(SqList& L) {
int j = L.length;
int i = 0;
for (i = 0; i < j; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
int main() {
SqList L0, L1, L2;
InitList0(L0);
InitList1(L1);
InitList2(L2);
printf("第一个有序顺序表:");
print(L0);
printf("\n");
printf("第二个有序顺序表:");
print(L1);
printf("\n");
Merge(L0, L1, L2);
printf("合并为:");
print(L2);
}
虽然答案是对的
但是一直会运行报错说“无可用源”,试了很多方法也没办法。