eg:順序表A:1 3 5 7
順序表B:2 4 6 8
合併後的表C:8 7 6 5 4 3 2 1
**思路:**從後往前遍歷順序表A和B,如果當前A表的數大於等於B表的數,則將A表的數存入C,A的元素下標往前移一位,否則,將B表的數存入C表,B的元素下標往前移一位B;最後再把其中一個未遍歷完的表存入C表。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100 // 線性表存儲空間的初始分配量
#define LISTINCREMENT 10 // 線性表存儲空間的初分配增量
#define OVERFLOW -1
#define OK 1
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType *elem; // 存儲空間基址
int length; // 當前長度
int listsize; // 當前分配的存儲容量
}SqList;
//初始化線性表
Status InitList_Sq(SqList *L) {
L -> elem = (ElemType *) malloc (LIST_INIT_SIZE * sizeof(ElemType));
if (!L -> elem) exit(OVERFLOW); // 存儲分配失敗
L -> length = 0; // 空表長度爲0
L -> listsize = LIST_INIT_SIZE; // 初始存儲容量
return OK;
}
//創建有序表並賦值
void Create_Sq(SqList *L) {
int n;
printf("\n輸入該有序表元素的個數:");
scanf("%d", &n);
while (n <= 0 || n > 100) {
printf("\n非法輸入,請輸入大於0且小於100的數:");
scanf("%d", &n);
}
L -> length = n; // 創建長度爲n的順序表
printf("\n依次輸入這%d個數(從小到大輸入):\n", n);
for (int i = 0; i < n; i++) { // 輸入該順序表的元素
scanf("%d", &L -> elem[i]);
}
}
//輸出有序表
void Print_Sq(SqList L) {
for (int i = 0; i < L.length; i++) {
if(!i) printf("%d", L.elem[i]);
else printf(" %d", L.elem[i]);
}
printf("\n");
}
//將兩個有序遞增的順序表合併爲一個有序遞減的順序表
void Merge_Sq(SqList *la, SqList *lb, SqList *lc) {
InitList_Sq(lc); // 初始化線性表lc
lc -> length = la -> length + lb -> length; // lc表的長度爲la表和lb表的長度和
int i = la -> length - 1, j = lb -> length - 1, k = 0; // 找出兩表的末位置並定義新表元素的開始
while (i >= 0 && j >= 0) {
if (la -> elem[i] >= lb -> elem[j]) { // 如果當前la表的元素大於等於lb表的元素,將la的元素賦給lc,同時la的元素往前挪一位
lc -> elem[k++] = la -> elem[i];
i--;
} else { // 如果當前lb表的元素大於la表的元素,將lb的元素賦給lc,同時lb的元素往前挪一位
lc -> elem[k++] = lb -> elem[j];
j--;
}
}
while (i >= 0) { // 如果la表中還有元素,依次賦值給lc
lc -> elem[k++] = la -> elem[i];
i--;
}
while (j >= 0) { // 如果lb表中還有元素,依次賦值給lc
lc -> elem[k++] = lb -> elem[j];
j--;
}
}
int Check_Sq(SqList *la) { // 判斷順序表是否爲遞增
int flag = 0;
for (int i = 1; i < la -> length; i++) {
if(la -> elem[i] < la -> elem[i-1]) flag = 1;
}
return flag;
}
int main() {
SqList la, lb, lc;
InitList_Sq(&la); // 初始化線性表la
InitList_Sq(&lb); // 初始化線性表lb
InitList_Sq(&lc); // 初始化線性表lc
printf("\n創建一個有序表A\n");
Create_Sq(&la); // 創建線性表la
int ans = Check_Sq(&la);
while (ans == 1) {
printf("\n非法順序輸入,該序列爲非遞增!請重新輸入該有序表\n");
Create_Sq(&la); // 創建線性表la
ans = Check_Sq(&la);
}
printf("\n創建成功!\n");
printf("\n創建一個有序表B\n");
Create_Sq(&lb); // 創建線性表lb
int ans1 = Check_Sq(&lb);
while (ans1 == 1) {
printf("\n非法順序輸入,該序列爲非遞增!請重新輸入該有序表\n");
Create_Sq(&lb); // 創建線性表lb
ans1 = Check_Sq(&lb);
}
printf("\n創建成功!\n");
printf("\n順序表A的數據:\n");
Print_Sq(la); // 輸出線性表la
printf("\n順序表B的數據:\n");
Print_Sq(lb); // 輸出線性表lb
Merge_Sq(&la, &lb, &lc); //將la順序表和lb順序表合併爲一個有序遞減的順序表lc
printf("\n順序表C的數據:\n");
Print_Sq(lc); // 輸出線性表lc
return 0;
}