归并线性表。
请按以下要求编程实现:
①从键盘输入两个升序排列的整数序列linka和linkb,每个序列以输入0为
结束标记。
②将链表linka和linkb归并为linkc,linkc仍然为升序排列。归并完成后,
linka和linkb为空表。输出linkc。
例如:linka输入为:10 20 30 40 50 0
linkb输入为:15 20 25 30 35 40 45 50 0
归并后的linkc为:10 15 20 20 25 30 30 35 40 40 45 50 50
- MergeList
Status ListMerge(SqList linka, SqList linkb, SqList& linkc) {
if (ListEmpty(linka)) {
printf("Linka为空");
return ERROR;
}
if (ListEmpty(linka)) {
printf("Linka为空");
return ERROR;
}
linkc.lenth = linka.lenth + linkb.lenth;
linkc.listsize = linkc.lenth;
ElemType* pa, * pb, *pc;
pa = linka.elem; pb = linkb.elem;
linkc.elem = (ElemType*)malloc(linkc.listsize * sizeof(ElemType));
pc = linkc.elem;
if (!linkc.elem) {
printf("存储分配失败");
exit(OVERFLOW);
}
while (pa <= linka.elem + linka.lenth - 1 && pb <= linkb.elem + linkb.lenth - 1) {
if (*pa <= *pb) *pc++ = *pa++;
else *pc++ = *pb++;
}
while (pa <= linka.elem + linka.lenth - 1) *pc++ = *pa++;
while (pb <= linkb.elem + linkb.lenth - 1) *pc++ = *pb++;
return OK;
}
- main函数
#include "List.h"
#pragma warning(disable:4996);//如果用VC2019则需要屏蔽一个关于scanf的报错,DevC++则可以删掉此行
int main() {
SqList linka, linkb, linkc;
int n, i;
ElemType e;
InitList(linka);//初始化
InitList(linkb);//初始化
printf("请输入Linka:");
for (i = 0; ; i++) {
scanf("%d", &e);
if (e == 0) break;
ListInsert(linka, i + 1, e);
}
printf("请输入Linkb:");
for (i = 0; ; i++) {
scanf("%d", &e);
if (e == 0) break;
ListInsert(linkb, i + 1, e);
}//读入linka和linkb
printf("This is linka:");
ListTraverse(linka, out);
printf("\n");
printf("This is linkb:");
ListTraverse(linkb, out);
printf("\n");
ListMerge(linka, linkb, linkc);
printf("This is linkc:");
ListTraverse(linkc, out);
printf("\n");
return 0;
}