【数据结构】顺序表 求并集
思想
- 在第二个表中取某数据(取值操作)
- 不在顺序表中(定位操作)
- 就在后面(插入操作)
时间复杂度(O(LA.length*LB.length))
- 取值操作与执行时间与表长无关
- 定位操作执行时间与表长无关
- 插入操作的执行时间和表长成正比
代码
计算并集union.cpp
#include "Union.h"
void Union(SqList* La, SqList Lb) {
int La_len, Lb_len;
int i;
ElemType e;
La_len = ListLength(*La);
Lb_len = ListLength(Lb);
for(i = 1; i <= Lb_len; i++) {
GetElem(Lb, i, &e);
if(!LocateElem(*La, e, equal)) {
ListInsert(La, ++La_len, e);
}
}
}
Status equal(ElemType e1, ElemType e2) {
return e1 == e2 ? TRUE : FALSE;
}
计算并集union.h
#ifndef UNION_H
#define UNION_H
#include <stdio.h>
#include "Status.h"
#include "SqList.h"
void Union(SqList* La, SqList Lb);
Status equal(ElemType e1, ElemType e2);
#endif
测试并集union_main.cpp
#include <stdio.h>
#include "Union.h"
#include "SqList.h"
void PrintElem(ElemType e) {
printf("%d ", e);
}
int main(int argc, char** argv) {
ElemType a[5] = {5, 2, 1, 3, 9};
ElemType b[7] = {7, 2, 6, 9, 11, 3, 10};
SqList La, Lb;
int i;
InitList(&La);
for(i = 1; i <= 5; i++) {
ListInsert(&La, i, a[i - 1]);
}
InitList(&Lb);
for(i = 1; i <= 7; i++) {
ListInsert(&Lb, i, b[i - 1]);
}
printf("La = ");
ListTraverse(La, PrintElem);
printf("Lb = ");
ListTraverse(Lb, PrintElem);
printf("La = La∪Lb = ");
Union(&La, Lb);
ListTraverse(La, PrintElem);
return 0;
}