/*
*Copyright(c) 2017,YTU CS
*All right reserved.
*作 者:王铭泽.
*完成日期:2017,9,10.
*版 本 号: v1.0
*
*问题描述: 假设有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即线性表中的数据元素即为集合中的成员。
设计算法,用函数unionList(List LA, List LB, List &LC )函数实现该算法,求一个新的集合C=A∪B,即将两个集合的
并集放在线性表LC中。
*输 入: 无
*输 出: 两个顺序表并集为一个顺序表的结果。
*/
问题观察分析:这个问题里充分利用了顺序表的 多个算法,让我们体会了自己写算法用算法的过程。
首先解题思路基本上问:1.在基本算法基础上添加一个函数unionList,其作用是完成LA与LB顺序表的并集,其中函数用到的顺序表算法有初始化线性表、求线性表长度、获取单个字符元素、判断元素是否存在、插入元素这几大算法。2.函数内部先进行把A线性表完全传递给C的过程,此过程无需判断重复元素。之后进行B元素传递给C元素的过程,此过程要求判断是否与A中的元素重复。若不重复则添加。
代码如下:
#include <iostream>
#include "shunxuList.h"//对头文件的声明,头文件里包含有函数的声明。
using namespace std;
void unionList(SqList *LA, SqList *LB, SqList *&LC)
{
int l,i; //新线性表长度的存放为l。
ElemType e;
InitList(LC);
//先将A传递给新线性表。
for(i=1;i<=ListLength(LA);i++)
{
GetElem(LA,i,e);
ListInsert(LC,i,e);
}
l=ListLength(LA);//纪录长度为下一步做准备。
for(i=1;i<=ListLength(LB);i++)
{
GetElem(LB,i,e);
//判断是否与A线性表重复
if(!LocateElem(LA,e))
ListInsert(LC,++l,e);
}
LC->length=l;
}
int main()
{
//建立A表
SqList *L1;
ElemType a[5]={1,3,5,7,9};
CreatList(L1,a,5);
cout<<"线性表L1的内容为:"<<" ";
DispList(L1);
cout<<endl;
//建立B表
SqList *L2;
ElemType b[5]={3,4,6,7,5};
CreatList(L2,b,5);
cout<<"线性表L2的内容为:"<<" ";
DispList(L2);
cout<<endl;
//新表 不用建立在函数内完成建立。
SqList *L3;
unionList(L1,L2,L3);
cout<<"线性表L3的内容为:"<<" ";
DispList(L3);
cout<<endl;
return 0;
}
以上运行结果为:
总结及经验:
1.线性表以至于后来的链表需要注意第一个元素和最后一个元素的逻辑位置与物理位置的转换。
2.注意LocateList函数的算法。