集合的基本运算ppt差运算的特殊之处

Hench Hansen【寒】Study小站~
实验 二& 集合的并、交和差运算
//&在写代码的过程中,没有注意头结点~~~& 导致出现了很多野指针~~~ ,几乎重写. 。o 0& ~~~
// 经同学检查,发现有错误~~~& 红色部分代码已经修正
&//集合的并、交和差运算
/*选作内容(1)集合元素的判定和子集判定运算(2)求集合的补集(3)集合的混合式运算表达求值(4)集合的元素类型推广到其他类型,甚至任意类型
/*测试数据:
&(1)Set1 = "magazine",Set2 = "paper",&Set1&Set2 = "aegimnpra",Set1&Set2 = "ae",Set1 - Set2 = "gimnz"&(2)Set1 = 012oper4a6tion89",Set2 = "error date",&Set1&Set2 = "adeinoprt",Set1&Set2 = "aeort",Set1 - Set2 = "inp"*/
#include&iostream&#include&cstdlib&#include&cstdio&
#define ElemType char
typedef struct ElemNode{&ElemT&struct ElemNode *}ElemNode, *S
//-------------FunctionList------------------------------//---------------函数原型--------------------------------int LengthOf(Set src);//返回一个集合的长度void CreateSet(Set dest);//创建一个新的字母集合,限定a-zvoid EmptySet(Set dest);//清空一个集合,保留头结点void DestroySet(Set dest);//销毁集合void SortSet(Set dest);//对一个集合进行从小到大的排序void DisplaySet(Set src);//打印集合的所有元素
int ExistElem(Set dest, ElemType e);//判断元素是否存在于集合中void DelElem(Set dest, ElemType e);//删除集合中的一个元素一次void AddElem(Set dest, ElemType e);//在链表尾部追加一个元素void ContactSet(Set dest, Set src);//连接一个集合到另一个集合void AddSet(Set dest, Set src1, Set src2);//集合并运算void MulSet(Set dest, Set src1, Set src2);//集合交运算void SubSet(Set dest, Set src1, Set src2);//集合差运算int ExistSubset(Set dest, Set src);//子集判断void NegSet(Set dest, Set src);//求补集
int main(){&Set dest=(Set)malloc(sizeof(ElemNode));&Set src1=(Set)malloc(sizeof(ElemNode));&Set src2=(Set)malloc(sizeof(ElemNode));&dest-&next=NULL;&cout&&"输入两个集合:"&&&CreateSet(src1);CreateSet(src2);&cout&&&cout&&"Set1 = ";DisplaySet(src1);&cout&&"\t";&cout&&"Set2 = ";DisplaySet(src2);&cout&&endl&&&&cout&&"1-&集合并"&&"&& "&&"2-&集合交"&&"& "&&"3-&集合差"&&"&& "&&"非零整数-&错误!重输"&&"&& "&&"0-&进入下一步演示"&&&while(cin&&item)&{&&if(item)&&&switch(item)&&&{&&&case 1:&cout&&"集合并运算:Set1&Set2 = ";&&&&&AddSet(dest, src1, src2);&&&&&DisplaySet(dest);&&&&&EmptySet(dest);&&&&&cout&&&&&case 2:&cout&&"集合交运算:Set1&Set2 = ";&&&&&MulSet(dest, src1, src2);&&&&&DisplaySet(dest);&&&&&EmptySet(dest);&&&&&cout&&&&&case 3:&cout&&"集合差运算:Set1-Set2 = ";&&&&&SubSet(dest, src1, src2);&&&&&DisplaySet(dest);&&&&&EmptySet(dest);&&&&&cout&&&&&default:& cout&&"输入错误!重输!!!"&&&&&&&&&}&&else {cout&&"进入下一步演示..."&&} // 此处在VC++ 6.0 运行与CFree中有点不同(在CFree中要按下回车~~~)
&}&&getchar();&cout&&"输入一个集合:"&&&CreateSet(dest);&cout&&"原集合为:";&DisplaySet(dest);&cout&&endl&&&&cout&&"在链表尾部添加一个元素ch = ";&cin&&&AddElem(dest, ch);&DisplaySet(dest);&cout&&endl&&&cout&&"删除集合中的存在的某个元素ch = ";& cin&&&DelElem(dest, ch);&DisplaySet(dest);cout&&endl&&&cout&&"再创建一个集合src = ";&Set src=(Set)malloc(sizeof(ElemNode));&getchar();&CreateSet(src);&cout&&"将src集合链接到集合dest中..."&&&ContactSet(dest, src);&cout&&"此时dest为:";&DisplaySet(dest);&cout&&&if(ExistSubset(dest, src))&&cout&&"此时src是dest的子集..."&&&else&&cout&&"此时src不是dest的子集..."&&&cout&&endl&&"dest = ";&DisplaySet(dest);&cout&&&cout&&"dest的补集是:";&Set p=(Set)malloc(sizeof(ElemNode));&p-&next=NULL;&NegSet(p, dest);&DisplaySet(p);&cout&&endl&&"演示结束!!!"&&&DestroySet(dest);&return 0;}
//---------------BasicFunctions-----------------------//------------------函数实现--------------------------int LengthOf(Set src){&//返回一个集合的长度&int i=0;&while(src-&next!=NULL)&{&&i++;&&src=src-&&}&}//LengthOf
void CreateSet(Set dest){&//创建一个新的字母集合,限定a-z&ElemT&Set p=dest,n;&for(;;)&{&&ch=getchar();&&if(ch=='\n')&&if(ch&97||ch&122)&&n=(Set)malloc(sizeof(ElemNode));&&p-&next=n;&&n-&elem=&&n-&next=NULL;&&p=n;&}&}//CreateSet
void EmptySet(Set dest){&//清空一个集合,保留头结点&Set p,n;&while(dest-&next!=NULL)&{&&p=&&n=p-&&&for(;n-&next!=NULL;)&&{&&&p=n;&&&n=n-&&&}&&free(n);&&p-&next=NULL;&}}//EmptySet
void DestroySet(Set dest){&//销毁集合&EmptySet(dest);&free(dest);}//DestroySet
void SortSet(Set dest){&//对一个字母集合进行从小到大的排序&int i,j,l,&Set p,q,n;&l=LengthOf(dest);&if(l&2)&flag=1;&for(i=l-1;i&0&&flag==1;i--)&{&&flag=0;&&p=&&q=p-&&&n=q-&&&for(j=0;j&i;j++)&&{&&&if(q-&elem&n-&elem)&&&{&&&&flag=1;&&&&p-&next=n;&&&&q-&next=n-&&&&&n-&next=q;&&&&q=p-&&&&&n=q-&&&&}&&&p=q;&&&q=n;&&&n=n-&&&}&}}//SortSet
void DisplaySet(Set src){&//打印集合的所有元素&S&if(src-&next==NULL)&{&&printf("&");&&&}&p=&do &{&&p=p-&&&putchar(p-&elem);&} while(p-&next!=NULL);}//DisplaySet
int ExistElem(Set dest, ElemType e){&//判断元素是否存在于集合中&Set p=&if(LengthOf(p)==0)&&return 0;&else{&p=p-&&while(p-&elem!=e)&{&&if(p-&next==NULL)&&&return 0;&&p=p-&&}&return 1;&}}//ExistElem
void DelElem(Set dest, ElemType e){&//删除集合中的一个元素一次&Set p=dest,q;&if(LengthOf(p)==0)&&&q=p-&&if(LengthOf(p)==1)&{&&p-&next=NULL;&&free(q);&}&while(q-&elem!=e)&{&&p=p-&&&q=q-&&}&if(q-&next==NULL)&&{&&p-&next=NULL;&&free(q);&}&else&&p-&next=q-&}//DelElem
void AddElem(Set dest, ElemType e){&//在链表尾部追加一个元素&Set p=dest,&while(p-&next!=NULL)&&p=p-&&n=(Set)malloc(sizeof(ElemNode));&p-&next=n;&n-&elem=e;&n-&next=NULL;}//AddElem
void ContactSet(Set dest, Set src){&//连接一个集合到另一个集合&Set p=&while(p-&next!=NULL)&&p=p-&&p-&next=src-&}//ContactSet
void AddSet(Set dest, Set src1, Set src2){&//集合并运算&SortSet(src1);SortSet(src2);&int i=0,j=0,len1=LengthOf(src1),len2=LengthOf(src2);&src1=src1-&src2=src2-&&while(i&len1&&j&len2)&{&&if(src1-&elem&=src2-&elem)&&{&&&i++;&&&if(!ExistElem(dest, src1-&elem))&&&{&&&&AddElem(dest, src1-&elem);&&&&src1=src1-&&&&}&&&else&&&{&&&&src1=src1-&&&&}&&}&&else&&{&&&j++;&&&if(!ExistElem(dest, src2-&elem))&&&{&&&&AddElem(dest, src2-&elem);&&&&src2=src2-&&&&}&&&else&&&{&&&&src2=src2-&&&&}&&}&}&while(i&len1)&{&&i++;&&if(!ExistElem(dest, src1-&elem))&&{&&&AddElem(dest, src1-&elem);&&&&src1=src1-&&&}&}&while(j&len2)&{&&j++;&&if(!ExistElem(dest, src2-&elem))&&{&&&AddElem(dest, src2-&elem);&&&src2=src2-&&&}&}}//AddSet
void MulSet(Set dest, Set src1, Set src2){&//集合交运算&SortSet(src1);SortSet(src2);&int i=0,j=0,len1=LengthOf(src1),len2=LengthOf(src2);&src1=src1-&src2=src2-&&while(i&len1&&j&len2)&{&&if(src1-&elem&src2-&elem) {i++;src1=src1-&}&&else if(src1-&elem&src2-&elem) {j++;src2=src2-&}&&else&&{&&&i++;j++;&&&if(!ExistElem(dest, src1-&elem))&&&{&&&&AddElem(dest, src1-&elem);&&&&src1=src1-&&&&&src2=src2-&&&&}&&}&}}//MulSet
void SubSet(Set dest, Set src1, Set src2){&//集合差运算&SortSet(src1);SortSet(src2);&int i=0,len=LengthOf(src1);&src1=src1-&&while(i&len)&{&&i++;&&if(!ExistElem(src2, src1-&elem))&&{&&&if(!ExistElem(dest, src1-&elem))&&&{&&&&AddElem(dest, src1-&elem);&&&&src1=src1-&&&&}&&}&&else&&{&&&src1=src1-&&&}&}}//SubSet
int ExistSubset(Set dest, Set src){&//子集判断&int i=0,len=LengthOf(src);&src=src-&&while(i&len)&{&&if(!ExistElem(dest, src-&elem))&&&return 0;&&i++;&&src=src-&&}&return 1;}//ExistSubset
void NegSet(Set dest, Set src){&//求补集&SortSet(src);&int i=0;&while(i&26)&{&&if(!ExistElem(src, i+97))&&&AddElem(dest, i+97);&&i++;&}}//NegSet
运行示意图:
阅读(...) 评论()
Hench Hansen【寒】Study小站~集合的并、交和差运算(c#)_百度知道集合的并、交和差运算_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
集合的并、交和差运算
上传于||暂无简介
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩13页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢关于集合差的运算编程中集合差的运算法则是什么?
设A,B是两个集合,则A-B={x|(x属于A)并且(x不属于B)}A-A=空集;A-B=A-(A∩B);(A-B)-C=A-(B∪C);A∪(B-A)=A∪B;A-B=A∩(B补) .
为您推荐:
其他类似问题
扫描下载二维码java集合运算:求交集,并集,集合差 - 为程序员服务
为程序员服务
java集合运算:求交集,并集,集合差
java集合运算:求交集,并集,集合差
[Java]代码
import java.util.HashS
import java.util.S
public class Test {
public static void main(String[] args) {
Set&Integer& result = new HashSet&Integer&();
Set&Integer& set1 = new HashSet&Integer&(){{
Set&Integer& set2 = new HashSet&Integer&(){{
result.clear();
result.addAll(set1);
result.retainAll(set2);
System.out.println(&交集:&+result);
result.clear();
result.addAll(set1);
result.removeAll(set2);
System.out.println(&差集:&+result);
result.clear();
result.addAll(set1);
result.addAll(set2);
System.out.println(&并集:&+result);
您可能的代码
相关聚客文章
相关专栏文章}

我要回帖

更多关于 集合的并交差运算 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信