1.一般线性表的合并
- 问题描述:假设利用两个线性表La和Lb分别表示两个集合A和B,现要求一个新的集合 A=A∪B。
- La=(7, 5, 3, 11)
- Lb=(2, 6, 3)
- La=(7, 5, 3, 11, 2, 6)
- 算法步骤:
- 依次取出Lb中的每个元素,执行以下操作:
- 在La中查找该元素
- 如果找不到,则将其插入La的最后
2.顺序表实现
//合并
void Combine(SqList &A, SqList &B)
{
for (int i = 0; i < B.length; i++)
{
int count = 0;
for (int j = 0; j < A.length; j++)
{
if (A.elem[j] == B.elem[i])
{
count += 1;
}
}
if (count == 0)
{
A.elem[A.length++] = B.elem[i];
}
}
}
- main.cpp
#include<iostream>
using namespace std;
#define MAX 100
typedef struct
{
int *elem;
int length;
}SqList;
//初始化
int InitSqList(SqList &L)
{
L.elem = new int[MAX]; // 为顺序表分配一个大小为MAX的存储空间
if (!L.elem)
{
return 0; // 初始化失败
}
else
{
L.length = 0;
return 1; // 初始化成功
}
}
//获取表长
int ListLength(SqList L)
{
return L.length;
}
//遍历
void TraveList(SqList &L)
{
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.elem[i]);
}
printf("\n");
}
//创建线性表
void CreateList(SqList &L)
{
printf("请输入线性表的长度:");
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
printf("请输入第%d个元素的值:", i + 1);
int e;
scanf("%d", &e);
L.elem[i] = e;
L.length = i + 1;
}
}
//合并
void Combine(SqList &A, SqList &B)
{
for (int i = 0; i < B.length; i++)
{
int count = 0;
for (int j = 0; j < A.length; j++)
{
if (A.elem[j] == B.elem[i])
{
count += 1;
}
}
if (count == 0)
{
A.elem[A.length++] = B.elem[i];
}
}
}
int main()
{
SqList A, B;
if (InitSqList(A))
{
printf("线性表A初始化成功!\n");
}
else
{
printf("线性表A初始化失败!\n");
}
if (InitSqList(B))
{
printf("线性表B初始化成功!\n");
}
else
{
printf("线性表B初始化成功!\n");
}
CreateList(A);
printf("A表长度:%d\n", A.length);
TraveList(A);
CreateList(B);
printf("B表长度:%d\n", B.length);
TraveList(B);
printf("合并后的线性表:\n");
Combine(A, B);
printf("合并后表长度:%d\n", A.length);
TraveList(A);
system("pause");
return 0;
}
- 运行结果
3.数组实现
- main.cpp
#include <iostream>
using namespace std;
#define MAX 100
int main()
{
int a[MAX];
int b[MAX];
int len1 = 0, len2 = 0;
int m, n;
printf("请输入A表的长度:");
scanf("%d", &m);
for (int i = 0; i < m; i++)
{
printf("请输入第%d个元素的值:", i + 1);
scanf("%d",&a[i]);
len1++;
}
printf("请输入B表的长度:");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
printf("请输入第%d个元素的值:", i + 1);
scanf("%d", &b[i]);
len2++;
}
printf("合并前两个表的长度:%d %d\n", len1, len2);
// 合并A、B数组
for (int i = 0; i < len2; i++)
{
int count = 0;
for (int j = 0; j < len1; j++)
{
if (a[j] == b[i])
{
count++;
}
}
if (count == 0)
{
a[len1++] = b[i];
}
}
for (int i = 0; i < len1; i++)
{
printf("%d ", a[i]);
}
printf("\n");
printf("合并后新表的长度:%d\n", len1);
system("pause");
return 0;
}
- 运行结果