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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)