1.有序表合并
- 问题描述:已知线性表La 和Lb中的数据元素按值非递减有序排列,现要求将La和Lb归并为一个新的线性表Lc,且Lc中的数据元素仍按值非递减有序排列。
- 例如:
- La=(1 ,7, 8)
- Lb=(2, 4, 6, 8, 10, 11)
- Lc=(1, 2, 4, 6, 7 , 8, 8, 10, 11)
2.有序的顺序表合并
- 算法步骤
- 创建一个空表Lc
- 依次从La或Lb中“摘取”元素值较小的结点插入到Lc表的最后,直至其中一个表变空为止
- 继续将La或Lb其中一个表的剩余结点插入在Lc表的最后
- 算法描述
void Combine(SqList A, SqList B, SqList &C)
{
int *pa, *pb, *pc, *pa_last, *pb_last;
pa = A.elem; // //指针pa和pb的初值分别指向两个表的第一个元素
pb = B.elem;
C.length = A.length + B.length; // 新表长度为待合并两表的长度之和
C.elem = new int[C.length]; // 为合并后的新表分配一个数组空间
pc = C.elem; // 指针pc指向新表的第一个元素
pa_last = A.elem + A.length - 1; // 指针pa_last指向LA表的最后一个元素
pb_last = B.elem + B.length - 1; // 指针pb_last指向LB表的最后一个元素
while (pa <= pa_last && pb <= pb_last) // 两个表都非空
{
if (*pa <= *pb)
{
*pc++ = *pa++;
}
else
{
*pc++ = *pb++;
}
}
while (pa <= pa_last)
{
*pc++ = *pa++;
}
while (pb <= pb_last)
{
*pc++ = *pb++;
}
}
- 代码实现
- main.cpp
#include<iostream>
using namespace std;
#define MAX 100
typedef struct
{
int *elem;//存储空间基地址
int length;
}SqList;
int InitList(SqList &L)
{
L.elem = new int[MAX];
if (!L.elem)
{
return 0;
}
L.length = 0;
return 1;
}
void TraveList(SqList L)
{
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.elem[i]);
}
printf("\n");
}
void CreateList(SqList &L, int n)
{
printf("请输入表的元素:\n");
for (int i = 0; i < n; i++)
{
printf("请输入第%d个元素值:", i + 1);
int e;
scanf("%d", &e);
L.elem[i] = e;
L.length += 1;
}
}
void Combine(SqList A, SqList B, SqList &C)
{
int *pa, *pb, *pc, *pa_last, *pb_last;
pa = A.elem; // //指针pa和pb的初值分别指向两个表的第一个元素
pb = B.elem;
C.length = A.length + B.length; // 新表长度为待合并两表的长度之和
C.elem = new int[C.length]; // 为合并后的新表分配一个数组空间
pc = C.elem; // 指针pc指向新表的第一个元素
pa_last = A.elem + A.length - 1; // 指针pa_last指向LA表的最后一个元素
pb_last = B.elem + B.length - 1; // 指针pb_last指向LB表的最后一个元素
while (pa <= pa_last && pb <= pb_last) // 两个表都非空
{
if (*pa <= *pb)
{
*pc++ = *pa++;
}
else
{
*pc++ = *pb++;
}
}
while (pa <= pa_last)
{
*pc++ = *pa++;
}
while (pb <= pb_last)
{
*pc++ = *pb++;
}
}
int main()
{
SqList L1, L2;
if (InitList(L1))
{
printf("L1初始化成功.\n");
}
else
{
printf("L2初始化失败!\n");
}
if (InitList(L2))
{
printf("L2初始化成功!\n");
}
else
{
printf("L2初始化失败!\n");
}
printf("请输入L1的长度:");
int len1;
scanf("%d", &len1);
CreateList(L1, len1);
printf("遍历L1:\n");
TraveList(L1);
printf("请输入L2的长度:");
int len2;
scanf("%d", &len2);
CreateList(L2, len2);
printf("遍历表L2:\n");
TraveList(L2);
SqList L3;
Combine(L1, L2, L3);
printf("合并后的表:\n");
TraveList(L3);
system("pause");
return 0;
}
- 运行结果
3.链式有序表合并
- 算法步骤
- Lc指向La
- 依次从La或Lb中“摘取”元素值较小的结点插入到Lc表的最后,直至其中一个表变空为止
- 继续将La或Lb其中一个表的剩余结点插入在LC表的最后
- 释放Lb表的表头结点
- 算法描述
void Combine(LinkList &L1, LinkList &L2, LinkList &L3)
{
LNode *pa, *pb, *pc;
pa = L1->next;
pb = L2->next;
pc = L3 = L1; // //用L1的头结点作为L3的头结点
while (pa&&pb)
{
if (pa->data <= pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb; // 插入剩余段
delete L2; // 释放L2的头结点
}
- 代码实现
- main.cpp
#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX 100
typedef struct LNode
{
int data;
struct LNode *next;
}LNode, *LinkList;
int InitList(LinkList &L)
{
L = new LNode;
L->next = NULL;
return 1;
}
void TraveList(LinkList L)
{
struct LNode *p;
p = L->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void CreateList(LinkList &L, int n)
{
L = new LNode;
L->next = NULL;
LNode *r;
r = L;
printf("请输入链表的元素:\n");
for (int i = 0; i < n; i++)
{
LNode *p;
p = new LNode;
printf("请输入第%d个元素的值:", i+1);
scanf("%d", &p->data);
p->next = NULL;
r->next = p;
r = p;
}
}
void Combine(LinkList &L1, LinkList &L2, LinkList &L3)
{
LNode *pa, *pb, *pc;
pa = L1->next;
pb = L2->next;
pc = L3 = L1; // //用L1的头结点作为L3的头结点
while (pa&&pb)
{
if (pa->data <= pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb; // 插入剩余段
delete L2; // 释放L2的头结点
}
int main()
{
LinkList L1, L2, L3;
if (InitList(L1))
{
printf("L1初始化成功!\n");
}
else
{
printf("L1初始化失败!\n");
}
if (InitList(L2))
{
printf("L2初始化成功!\n");
}
else {
printf("L2初始化失败!\n");
}
if (InitList(L3))
{
printf("L3初始化成功!\n");
}
else
{
printf("L3初始化失败!");
}
printf("请输入L1的长度:");
int n1;
scanf("%d", &n1);
CreateList(L1, n1);
printf("遍历L1:\n");
TraveList(L1);
printf("请输入L2的长度:");
int n2;
scanf("%d", &n2);
CreateList(L2, n2);
printf("遍历L2:\n");
TraveList(L2);
Combine(L1, L2, L3);
printf("合并后的表:\n");
TraveList(L3);
system("pause");
return 0;
}
- 运行结果