#include <iostream>
using namespace std;
#define MaxSize 100
typedef char ElemType;
//定义顺序表结构体类型
typedef struct
{
ElemType data[MaxSize];
int length;
} SqList;
//建立一个顺序表
void CreateList(SqList*& L, ElemType a[], int n)
{
for (int i = 0; i < n; i++)
L->data[i] = a[i];
L->length = n;
}
//分配存放线性表的空间
void InitList(SqList*& L)
{
L = new SqList;
L->length = 0;
}
//判定是否为空表
bool ListEmpty(SqList* L)
{
return(0 == L->length);
}
//销毁线性表
void DestroyList(SqList*& L)
{
delete L;
}
//输出线性表
void DispList(SqList* L)
{
if (ListEmpty(L))
return;
for (int i = 0; i < L->length; i++)
cout << L->data[i] << " ";
cout << endl;
}
//按元素值查找
int LocateElem(SqList* L, ElemType e)
{
int i = 0;
while (i < L->length && L->data[i] != e)
i++;
if (i >= L->length)
return 0;
else
return i + 1;
}
//删除数据元素
bool ListDelete(SqList*& L, int i, ElemType& e)
{
int j;
if (i<1 || i>L->length)
return false;
i--; /*将顺序表逻辑位序转化为elem下标即物理位序*/
e = L->data[i];
for (j = i; j < L->length - 1; j++)
L->data[j] = L->data[j + 1];
/*将data[i]之后的元素前移一个位置*/
L->length--; /*顺序表长度减1*/
return true;
}
//插入数据元素
bool ListInsert(SqList*& L, int i, ElemType e)
{
if (i<1 || i>L->length + 1)
return false;
i--;
for (int j = L->length; j > i; j--)
L->data[j] = L->data[j - 1];
L->data[i] = e;
L->length++;
return true;
}
//求并集 A ∪B
void UnionList(SqList* L1, SqList* L2, SqList*& L)
{
int len = L1->length;
//将L1元素拷贝到L
for (int i = 0; i < len; i++)
ListInsert(L, i + 1, L1->data[i]);
//遍历L2,查找未出现在L的元素
for (int i = 0; i < L2->length; i++)
if (!LocateElem(L, L2->data[i]))
ListInsert(L, ++len, L2->data[i]);
DispList(L);
}
//求交集 A ∩B
void PublicList(SqList* L1, SqList* L2, SqList*& L)
{
//遍历L1,查询在L2中有无此元素
int k = 1, len = L1->length;
for (int i = 0; i < len; i++)
if (LocateElem(L2, L1->data[i])) //查询成功,插入L
ListInsert(L, k++, L1->data[i]);
DispList(L);
}
//求差集 A-B or B-A
void DiffList(SqList* L1, SqList* L2, SqList*& L)
{
//其实求差集就是用被减数L1 与L1和L2的交集 再取一次差就可以了,这里直接采用
SqList* L3;
InitList(L3);
/*----------------------------------------------------------------------------*/
//遍历L1,查询在L2中有无此元素
int k = 1, len = L1->length;
for (int i = 0; i < len; i++)
if (LocateElem(L2, L1->data[i])) //查询成功,插入L3
ListInsert(L3, k++, L1->data[i]);
// 现在L3中存储的是 L1 ∩L2
/*----------------------------------------------------------------------------*/
//遍历L1,查询在L3中有无此元素
k = 1, len = L1->length;
for (int i = 0; i < len; i++)
if (!LocateElem(L3, L1->data[i])) //查询失败,插入L
ListInsert(L, k++, L1->data[i]);
DispList(L);
}
int main()
{
SqList* A, * B, * C;
InitList(A);
InitList(B);
InitList(C);
ElemType a[4] = { 'A','B','C','D' };
ElemType b[5] = { 'B','C','E','F','G' };
CreateList(A, a, 4);
cout << endl << "线性表A的元素为:";
DispList(A);
CreateList(B, b, 5);
cout << endl << "线性表B的元素为:";
DispList(B);
cout << endl << "A ∪B 为: ";
UnionList(A, B, C);
InitList(C);
cout << endl << "A ∩B 为: ";
PublicList(A, B, C);
InitList(C);
cout << endl << "A - B 为: ";
DiffList(A, B, C);
InitList(C);
cout << endl << "B - A 为: ";
DiffList(B, A, C);
return 0;
}
数据结构作业:求交并补集
最新推荐文章于 2024-08-21 21:59:29 发布