【数据结构】顺序表 求并集

【数据结构】顺序表 求并集

思想

  • 在第二个表中取某数据(取值操作)
  • 不在顺序表中(定位操作)
  • 就在后面(插入操作)

时间复杂度(O(LA.length*LB.length))

  • 取值操作与执行时间与表长无关
  • 定位操作执行时间与表长无关
  • 插入操作的执行时间和表长成正比

代码

计算并集union.cpp

/*==============
 * 求并集
 *
 * 包含算法: 2.1
 ===============*/

#include "Union.h"      //**▲02 线性表**//

/*
 * ████████ 算法2.1 ████████
 *
 * A=A∪B
 *
 * 计算La与Lb的并集并返回。
 * 由于生成的并集会拼接在La上,所以La的入参为指针类型。
 */
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++) {
        // 取Lb中第i个元素赋给e
        GetElem(Lb, i, &e);

        // 若e不在La中则插入
        if(!LocateElem(*La, e, equal)) {
            ListInsert(La, ++La_len, e);
        }
    }
}

/*
 * 判等
 *
 * 判断两元素是否相等。
 * 如果相等,则返回TRUE,否则,返回FALSE。
 */
Status equal(ElemType e1, ElemType e2) {
    return e1 == e2 ? TRUE : FALSE;
}

计算并集union.h

/*==============
 * 求并集
 *
 * 包含算法: 2.1
 ===============*/

#ifndef UNION_H
#define UNION_H

#include <stdio.h>
#include "Status.h"     //**▲01 绪论**//
#include "SqList.h"   //**▲02 线性表**//


/*
 * ████████ 算法2.1 ████████
 *
 * A=A∪B
 *
 * 计算La与Lb的并集并返回。
 * 由于生成的并集会拼接在La上,所以La的入参为指针类型。
 */
void Union(SqList* La, SqList Lb);

/*
 * 判等
 *
 * 判断两元素是否相等。
 * 如果相等,则返回TRUE,否则,返回FALSE。
 */
Status equal(ElemType e1, ElemType e2);

#endif

测试并集union_main.cpp

#include <stdio.h>
#include "Union.h"      //**▲02 线性表**//
#include "SqList.h"     //**▲02 线性表**//

// 测试函数,打印元素
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;

    // 初始化La
    InitList(&La);
    for(i = 1; i <= 5; i++) {
        ListInsert(&La, i, a[i - 1]);
    }

    // 初始化Lb
    InitList(&Lb);
    for(i = 1; i <= 7; i++) {
        ListInsert(&Lb, i, b[i - 1]);
    }

    // 输出La
    printf("La = ");
    ListTraverse(La, PrintElem);

    // 输出Lb
    printf("Lb = ");
    ListTraverse(Lb, PrintElem);

    // 输出新表La的内容
    printf("La = La∪Lb = ");
    Union(&La, Lb);
    ListTraverse(La, PrintElem);

    return 0;
}

posted @ 2019-12-09 00:59  嗨Sirius  阅读(390)  评论(0编辑  收藏  举报