记录顺序表表示集合的几种操作
1.求两个集合的交集
算法要求:交集运算,求L3=L1∩L2
算法思想:用两次循环,依次抽取L1中的元素,检查L2是否有与之相等的元素,若有则//插入L3中
void intersectList(list *L1,list *L2,list *L3){
int i,j;
for(i=0;i<L1->length;i++){
for(j=0;j<L2->length;j++){
if(L1->data[i]==L2->data[j]){
//若是L1和L2都含有的元素
listInsert(L3,L3->length++,L1->data[i]); //插入L3的最后
}
}
}
}
算法分析:两次循环,插入L3的最后只需要进行一次操作,执行次数为|L1|×|L2|,所以
时间复杂度:O(|L1|×|L2|)
2.求两个集合的并集
算法要求:并集运算,求L3=L1∪L2
算法思想:循环取出L1中的元素,直接插入L3的最后,然后取出L2的元素,判断L1中//是否含有相等的元素,若存在则跳过,不含则插入L3最后
void unionList(list *L1,list *L2,list *L3){
int i,L2_len=L2->length,L1_len=L1->length;
elementType e;
for(i=0;i<L1_len;i++){
//L1中的元素插入L3的最后
listInsert(L3,i+1 ,L1->data[i]);
}
for(i=1;i<=L2_len;i++){
getElem(L2,i,&e);
if(!locateElem(L1,e)) //L1和L2重复的元素不能插入L3中
listInsert(L3,++L1_len,e); //不重复的元素插入L3的最后
}
}
算法分析:时间性能主要看第二次循环,locateElem(L1,e)需要遍历L1,执行次数为|L1|×|L2|,因此时间复杂度:O(|L1|×|L2|)
3.求差集
算法要求:求差集,L3=L1-L2
算法思想:依次抽取L1中的元素,检查L2中是否含有相同元素,若不在L2中则插入L3最后;相同地,依次抽取L2中的元素检查是否在L1中,若不在则插入L3的最后
void differenceList(list *L1,list *L2,list *L3){
int i=