题目:将两个有序顺序表合并为一个 新的有序顺序表,并由函数返回结果顺序表。
思路:用i,j分别代表L,S表的下标,k代表新表R的下标。因为是有序数组,又没要求取值唯一,我们直接对两表的值依次进行大小比较,每次取小,然后对应下标+1,以此类推,最终,有一个表被我们取完了,推出while循环,此时,还有一个表的值可能没取完,所以我们再进行一次判断,对剩下那个表的值进行读取。最终R里的内容就是合并后的全部内容。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define InitSize 10
typedef struct {
int* data;
int length;
int MaxSize;
}SeqList;
void InitList(SeqList* L) {
L->data = (int*)malloc(sizeof(int) * InitSize);
L->length = 0;
L->MaxSize = InitSize;
}
void InitList2(SeqList* L) {
L->data = (int*)malloc(sizeof(int) * InitSize);
L->length = 0;
L->MaxSize = InitSize*2;
}
bool MergeList(SeqList* L, SeqList* S, SeqList* R) {
if (L->length + S->length > R->MaxSize)
return false;
int i = 0, j = 0, k = 0;
while (i < L->length && j < S->length) {
if (L->data[i] <= S->data[j])
R->data[k++] = L->data[i++];
else
R->data[k++] = S->data[j++];
}
while (i < L->length)
R->data[k++] = L->data[i++];
while (j < S->length)
R->data[k++] = S->data[j++];
R->length = k;
return true;
}
int main()
{
SeqList L, S, R;
InitList(&L);
InitList(&S);
InitList2(&R);
for (int i = 0; i < L.MaxSize; i++) {
scanf("%d", &L.data[i]);
L.length++;
}
for (int i = 0; i < S.MaxSize; i++) {
scanf("%d", &S.data[i]);
S.length++;
}
if (MergeList(&L, &S, &R)) {
for (int i = 0; i < R.length; i++) {
printf("%d ", R.data[i]);
}
}
return 0;
}