集合的并交运算(C语言)

合集下载

C语言实现集合的交,并,差

C语言实现集合的交,并,差

C语言实现集合的交,并,差公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-【问题描述】编制一个能演示执行集合的并、交和差运算的程序【基本要求】(1)集合的元素限定为小写字母字符[ 'a'......'z' ](2 )演示程序以用户和计算机对话的方式执行【测试数据】【实现提示】以有序链表表示集合【代码过程】1。

先定义集合的数据类型.{ElemType data;LNode *next;}*Link, *Position;typedef struct...{Link head,tail;int len;}LinkSet;.{.{.{if(h1->data < (link->data) && h2->data > (link->data) ) .{ .{.{.{pre = h; h=h->next; j++;}if(j==0) return NULL;return pre;}Status PrintSets(LinkSet &ls)...{.{printf("%c ",h->data);h = h->next;}printf(" ] ");return OK;}Position GetHead(LinkSet &ls)...{.{.{.{.{.{.{.{.{int result = Compare(pa,pb); .{DelFirst(lsa,node);Append(lsc,node); pa =NextPos(ha); .{ .{DelFirst(lsb,node); pb = NextPos(hb);.{DelFirst(lsa,node);Append(lsc,node);}while(!Empty(lsb))...{DelFirst(lsb,node);Append(lsc,node);}return OK;}Status IntersectionSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc)...{ .{int result = Compare(pa,pb);if( result<0) ...{DelFirst(lsa,node);pa = NextPos(ha);}else if(result>0)...{DelFirst(lsb,node); pb = NextPos(hb);}else...{DelFirst(lsb,node); Append(lsc,node);pb = NextPos(hb);DelFirst(lsa,node);pa = NextPos(ha);}}while(!Empty(lsa))...{DelFirst(lsa,node);Append(lsc,node);}return OK;}Status DifferenceSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc)...{.{int result = Compare(pa,pb);if( result<0) ...{DelFirst(lsa,node);Append(lsc,node);pa = NextPos(ha); }else if(result>0)...{DelFirst(lsb,node); pb = NextPos(hb);}else...{DelFirst(lsa,node); pa = NextPos(ha);DelFirst(lsb,node); pb = NextPos(hb);}}return OK;}Status CopySets(LinkSet lsa, LinkSet lsb)...{.{Link node;CreateNode(node,la->data);lb=node;++;la = la->next;lb = lb->next;}= lb;return OK;}.{printf("************************************************************** ************** " );printf("*MakeSet1-1 MakeSet1-2 Union-u Intersection-i Difference-d Quit-q * " );printf("************************************************************** ************** " );}void main()...{LinkSet set1,set2,set3,seta,setb;InitSets(set1),InitSets(set2); .{Initialization();printf("集合Set1:");PrintSets(set1); .{case '1': //集合set1 赋值printf("请输入集合Set1的内容:");fflush(stdin);gets(setsContent);InitSets(set1);SetSets(set1,setsContent);break;case '2': //集合set1 赋值printf("请输入集合Set1的内容:");fflush(stdin);gets(setsContent);SetSets(set2,setsContent);break;case 'u':case 'U': //求并InitSets(set3);CopySets(set1,seta); //因为求并的算法是添加一个节点,删除set1,set2中对应的节点,CopySets(set2,setb); //所以要复制一份UnionSets(seta,setb,set3); //下同printf("set1 U set2=: ");PrintSets(set3);fflush(stdin);getchar();break;case 'i':case 'I': //求交InitSets(set3);CopySets(set1,seta);CopySets(set2,setb);IntersectionSets(seta,setb,set3);printf("set1 交 set2=: ");fflush(stdin);getchar();break;case 'd':case 'D': //求差 InitSets(set3);CopySets(set1,seta);CopySets(set2,setb);DifferenceSets(seta,setb,set3);printf("set1 - set2=: ");PrintSets(set3);fflush(stdin);getchar();break;case 'q':case 'Q':exit(0);break;}system("cls"); //清屏}} //~。

集合的并交差与补运算

集合的并交差与补运算

集合的并交差与补运算集合是数学中的一个重要概念,在各个领域中都有着广泛的应用。

在集合论中,有几种常见的集合运算,包括并运算、交运算、差运算和补运算。

这些运算可以帮助我们更好地理解集合之间的关系,进而推导出更多有用的结论。

本文将详细探讨集合的并交差与补运算,并展示它们在实际问题中的应用。

一、并运算在集合中,如果将两个集合A和B进行并运算,就是将它们中的所有元素合并成一个新的集合。

并运算通常用符号“∪”表示。

例如,如果集合A={1, 2, 3},集合B={3, 4, 5},那么A∪B的结果就是新的集合{1, 2, 3, 4, 5}。

并运算具有以下性质:1. 交换律:对于任意两个集合A和B,A∪B = B∪A。

即并运算满足元素的无序性。

2. 结合律:对于任意三个集合A、B和C,(A∪B)∪C = A∪(B∪C)。

即并运算满足结合性。

3. 幂等律:对于任意集合A,A∪A = A。

即并运算对于自身的幂等。

二、交运算与并运算类似,交运算是指将两个集合A和B中共有的元素提取出来构成一个新的集合。

交运算通常用符号“∩”表示。

如果集合A={1, 2, 3},集合B={3, 4, 5},那么A∩B的结果就是新的集合{3}。

交运算也具有类似的性质:1. 交换律:对于任意两个集合A和B,A∩B = B∩A。

即交运算满足元素的无序性。

2. 结合律:对于任意三个集合A、B和C,(A∩B)∩C = A∩(B∩C)。

即交运算满足结合性。

3. 幂等律:对于任意集合A,A∩A = A。

即交运算对于自身的幂等。

三、差运算差运算是指将一个集合A中与另一个集合B中相同的元素去除后得到的新集合。

差运算通常用符号“-”表示。

如果集合A={1, 2, 3},集合B={3, 4, 5},那么A-B的结果就是新的集合{1, 2}。

差运算的性质如下:1. 差集的结果只包含属于集合A但不属于集合B的元素。

2. 差运算不满足交换律,即A-B通常不等于B-A。

集合的运算律公式(二)

集合的运算律公式(二)

集合的运算律公式(二)集合的运算律公式交换律交换律指的是集合的并、交运算,在交换操作的顺序不影响最终结果。

具体公式如下:•并运算交换律:A ∪ B = B ∪ A•交运算交换律:A ∩ B = B ∩ A例如:设集合 A = {1, 2, 3},集合 B = {3, 4, 5}。

则根据并运算交换律,有A ∪ B = B ∪ A = {1, 2, 3, 4, 5}。

根据交运算交换律,有A ∩ B = B ∩ A = {3}。

结合律结合律指的是集合的并、交运算,在结合操作的顺序不影响最终结果。

具体公式如下:•并运算结合律:(A ∪ B) ∪ C = A ∪ (B ∪ C)•交运算结合律:(A ∩ B) ∩ C = A ∩ (B ∩ C)例如:设集合 A = {1, 2, 3},集合 B = {3, 4, 5},集合 C = {1, 3, 5}。

则根据并运算结合律,有(A ∪ B) ∪ C = A ∪ (B ∪C) = {1, 2, 3, 4, 5}。

根据交运算结合律,有(A ∩ B) ∩ C = A ∩ (B ∩ C) = {3}。

分配律分配律指的是集合的并、交运算之间的关系。

具体公式如下:•并运算对交运算的分配律:A ∪ (B ∩ C) = (A ∪ B) ∩ (A ∪ C)•交运算对并运算的分配律:A ∩ (B ∪ C) = (A ∩ B) ∪ (A ∩ C)例如:设集合 A = {1, 2, 3},集合 B = {3, 4, 5},集合 C = {1, 3, 5}。

根据并运算对交运算的分配律,有 A ∪ (B ∩ C) = (A ∪ B) ∩ (A ∪ C) = {1, 2, 3, 4, 5}。

根据交运算对并运算的分配律,有A ∩ (B ∪ C) = (A ∩ B) ∪ (A ∩ C) = {1, 3}。

吸收律吸收律指的是集合的并、交运算与集合的子集之间的关系。

具体公式如下:•并运算对子集的吸收律:A ⊆ (A ∪ B)•交运算对子集的吸收律:(A ∩ B) ⊆ A例如:设集合 A = {1, 2, 3},集合 B = {3, 4, 5}。

1.3.1 集合的基本运算(交并)

1.3.1 集合的基本运算(交并)

课堂练习
3 设 = {|是等腰三角形}, = {|是直角三角形},
求 ∩ 和 ∪
4 设 = {|是幸福农场的汽车}, = {|是幸福农场的货车},
求 ∪
课堂练习
5 已知集合A = {x|x > −2} B = {x|x < 3} 求A ∩ B,A ∪ B
且 ∪ = 求实数的取值范围.
课堂练习
8 设 = | 2 + + = 0 , = | 2 + + 15 = 0 ,
又 ∪ = 3,5 , ∩ = 3 ,求实数,和的值。
课堂小结
课堂小结
1
集合运算

并运算
A
A∪B
= x x A或 x B
B={x|x是新华中学今年在校的高一级同学},
C={x|x是新华中学今年在校的高一级B的所有元素组成的集
合,称为A与B的交集,记作A∩B,(读作“A交B”),即
A∩B={x|x∈A,且x∈B}
用Venn图表示:
A
A∩B
B
典例分析
例题:
3 新华中学开运动会,设
A={x|x是新华中学高一年级参加百米赛跑的同学},
B={x|x是新华中学高一年级参加跳高比赛的同学},
求A∩B.
典例分析
4 设平面内直线l1 上的点的集合为L1,直线l2上的点的集合为L2,
试用集合的运算表示l1, l2的位置关系。
解: (1)直线l1 , l2
相交于一点P可表示为
L1 ∩ L2 = {点P};
A
B
-4 -3 -2 -1 0 1 2 3 4
A∪B
新课讲授
补充:

集合的交并差运算

集合的交并差运算

#include<stdio.h>#include<malloc.h>#include<stdlib.h>struct set{int coef;struct set *next;};void createlist_p(struct set *&p,int n){int i;struct set *L;p=(struct set *)malloc(sizeof(set));p->next=NULL;for(i=n;i>0;i--){L=(struct set *)malloc(sizeof(set));牰湩晴尨请输入该集合中第%d个整数元素:,n-i+1); scanf(%d,&L->coef);L->next=p->next;p->next=L;}}//生成新链表用于存放两集合中的元素void printlist_p(struct set *&p){struct set *L;int i;L=p->next;晩??瀠楲瑮?该表为空!\n);while(L!=NULL){printf(%d ,L->coef);L=L->next;i++;}printf(\);}//打印输入的两集合中的元素void Addset(struct set *&p,struct set *&q,struct set *&r) {struct set *k,*m,*n;r=(struct set *)malloc(sizeof(set));r->next=NULL;k=p->next;for(;k;){m=(struct set *)malloc(sizeof(set));m->next=r->next;r->next=m;m->coef=k->coef;k=k->next;}//把第一个集合中的元素放在新集合中k=q->next;m=(struct set *)malloc(sizeof(set));m->next=r->next;r->next=m;m->coef=k->coef;k=k->next;for(;k;){for(n=r->next;(k->coef!=n->coef)&&n->next;){n=n->next;}//与新集合中的元素比较if((k->coef!=n->coef)&&!(n->next)){m=(struct set *)malloc(sizeof(set));m->next=r->next;r->next=m;m->coef=k->coef;}k=k->next;}//对第二个集合中的元素进行分析}//求A∪Bvoid Subset(struct set *&p,struct set *&q,struct set *&r){ struct set *k,*m,*n;r=(struct set *)malloc(sizeof(set));r->next=NULL;n=q->next;for(;n;){m=p->next;for(;(m->coef!=n->coef)&&m->next;){m=m->next;}if(m->coef==n->coef) {k=(struct set *)malloc(sizeof(set));k->next=r->next;r->next=k;k->coef=m->coef;}n=n->next;}}//求A∩Bvoid Intset(struct set *&p,struct set *&q,struct set *&r){ struct set *k,*m,*n;r=(struct set *)malloc(sizeof(set));r->next=NULL;m=p->next;for(;m;){n=q->next;for(;(m->coef!=n->coef)&&n->next;){n=n->next;}if(!n->next&&(m->coef!=n->coef)) {k=(struct set *)malloc(sizeof(set));k->next=r->next;r->next=k;k->coef=m->coef;}m=m->next;}}//求A-Bvoid bangzhu(){printf(\\t\t\t***********************************); printf(\\t\t\t* 求集合的交并差*);printf(\\t\t\t*********************************\n);}void main(){struct set *p,*q,*r;int m,n,node;bangzhu();for(;;){do{牰湩晴尨请输入您要选择操作的代码:\n);printf(:求两集合的并A∪B\n);printf(:求两集合的交A∩B\n);printf(:求两集合的差A-B\n);printf(:退出该程序\n);scanf(%d,&node);} while(node<0||node>3);if(node==0) exit(1);printf(\\t\t/*请输入集合A中元素的个数:*/\n);scanf(%d,&m);createlist_p(p,m);printf(\\t\t/*请输入集合B中元素的个数:*/\n);scanf(%d,&n);createlist_p(q,n);牰湩晴尨集合A中元素为:);printlist_p(p);牰湩晴尨集合B中元素为:);printlist_p(q);while(node<0||node>3);switch(node){case 1: Addset( p,q,r);printf(A∪B:\n);printlist_p(r);break;case 2: Subset( p,q,r);printf(A∩B:\n);printlist_p(r);break;case 3: Intset(p,q,r); printf(A-B:\n);printlist_p(r);break;}printf(\);}}可以了楼上方法是正确的,学习!把分给楼上主要原因是C程序中使用了C语言不支持的引用所致,修改如下://---------------------------------------------------------------------------#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef struct set{int coef;struct set *next;} set ;void createlist_p(struct set **p,int n){int i;struct set *L;*p=(struct set *)malloc(sizeof(set));(*p)->next=NULL;for(i=n;i>0;i--){L=(struct set *)malloc(sizeof(set));牰湩晴尨请输入该集合中第%d个整数元素:,n-i+1); scanf(%d,&L->coef);L->next=(*p)->next;(*p)->next=L;}}//生成新链表用于存放两集合中的元素void printlist_p(struct set **p){struct set *L;int i=0;L=(*p)->next;晩??瀠楲瑮?该表为空!\n);while(L!=NULL){printf(%d ,L->coef);L=L->next;i++;}printf(\);}// 打印输入的两集合中的元素void Addset(struct set **p,struct set **q,struct set **r) {struct set *k,*m,*n;*r=(struct set *)malloc(sizeof(set));(*r)->next=NULL;k=(*p)->next;for(;k;){m=(struct set *)malloc(sizeof(set));m->next=(*r)->next;(*r)->next=m;m->coef=k->coef;k=k->next;}//把第一个集合中的元素放在新集合中k=(*q)->next;m=(struct set *)malloc(sizeof(set));m->next=(*r)->next;(*r)->next=m;m->coef=k->coef;k=k->next;for(;k;){for(n=(*r)->next;(k->coef!=n->coef)&&n->next;){n=n->next;}//与新集合中的元素比较if((k->coef!=n->coef)&&!(n->next)){m=(struct set *)malloc(sizeof(set));m->next=(*r)->next;(*r)->next=m;m->coef=k->coef;}k=k->next;}//对第二个集合中的元素进行分析}//求A∪Bvoid Subset(struct set **p,struct set **q,struct set **r){ struct set *k,*m,*n;(*r)=(struct set *)malloc(sizeof(set));(*r)->next=NULL;n=(*q)->next;for(;n;){m=(*p)->next;for(;(m->coef!=n->coef)&&m->next;){m=m->next;}if(m->coef==n->coef) {k=(struct set *)malloc(sizeof(set));k->next=(*r)->next;(*r)->next=k;k->coef=m->coef;}n=n->next;}}//求A∩Bvoid Intset(struct set **p,struct set **q,struct set **r){ struct set *k,*m,*n;(*r)=(struct set *)malloc(sizeof(set));(*r)->next=NULL;m=(*p)->next;for(;m;){n=(*q)->next;for(;(m->coef!=n->coef)&&n->next;){n=n->next;}if(!n->next&&(m->coef!=n->coef)) {k=(struct set *)malloc(sizeof(set));k->next=(*r)->next;(*r)->next=k;k->coef=m->coef;}m=m->next;}}//求A-Bvoid bangzhu(void){printf(\\t\t\t***********************************);printf(\\t\t\t* 求集合的交并差*);printf(\\t\t\t*********************************\n);}void main(){struct set *p,*q,*r;int m,n,node;bangzhu();for(;;){do{牰湩晴尨请输入您要选择操作的代码:\n);printf(:求两集合的并A∪B\n);printf(:求两集合的交A∩B\n);printf(:求两集合的差A-B\n); printf(:退出该程序\n);scanf(%d,&node);}while(node<0||node>3);if(node==0) exit(1);printf(\\t\t/*请输入集合A中元素的个数:*/\n);scanf(%d,&m);createlist_p(&p,m);printf(\\t\t/*请输入集合B中元素的个数:*/\n);scanf(%d,&n);createlist_p(&q,n);牰湩晴尨集合A中元素为:);printlist_p(&p);printf( 集合B中元素为:);printlist_p(&q);//while(node<0||node>3);switch(node){case 1: Addset( &p,&q,&r);printf(A∪B:\n);printlist_p(&r);break; B:\n);printlist_p(&r);break; ∩case 2: Subset( &p,&q,&r);printf(A.case 3: Intset(&p,&q,&r); printf(A-B:\n);printlist_p(&r);break;}printf(\);}}//---------------------------------------------------------------------------。

实验 二 集合的并、交和差运算C++

实验 二  集合的并、交和差运算C++

实验二集合的并、交和差运算// 在写代码的过程中,没有注意头结点~~~ 导致出现了很多野指针~~~ ,几乎重写. 。

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>using namespace std;#define Elem Type chartypedef struct ElemNode{Elem Type elem;struct ElemNode *next;}ElemNode, *Set;//-------------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, Elem Type e);//判断元素是否存在于集合中void DelElem(Set dest, ElemType e);//删除集合中的一个元素一次void AddElem(Set dest, Elem Type 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 m ain(){Set dest=(Set)m alloc(sizeof(ElemNode));Set src1=(Set)m alloc(sizeof(ElemNode));Set src2=(Set)m alloc(sizeof(ElemNode));dest->next=NULL;cout<<"输入两个集合:"<<endl;CreateSet(src1);CreateSet(src2);cout<<endl;cout<<"Set1 =";DisplaySet(src1);cout<<"\t";cout<<"Set2 =";DisplaySet(src2);cout<<endl<<endl;int item;cout<<"1->集合并"<<" "<<"2->集合交"<<" "<<"3->集合差"<<" "<<"非零整数->错误!重输"<<" "<<"0->进入下一步演示"<<endl;while(cin>>item){if(item)switch(item){case 1: cout<<"集合并运算:Set1∪Set2 =";AddSet(dest, src1, src2);DisplaySet(dest);Em ptySet(dest);cout<<endl;break;case 2: cout<<"集合交运算:Set1∩Set2 =";MulSet(dest, src1, src2);DisplaySet(dest);Em ptySet(dest);cout<<endl;break;case 3: cout<<"集合差运算:Set1-Set2 =";SubSet(dest, src1, src2);DisplaySet(dest);Em ptySet(dest);cout<<endl;break;default: cout<<"输入错误!重输!!!"<<endl;break;}else {cout<<"进入下一步演示..."<<endl;break;} // 此处在VC++ 6.0 运行与CFree 中有点不同(在CFree中要按下回车~~~)}getchar();cout<<"输入一个集合:"<<endl;CreateSet(dest);cout<<"原集合为:";DisplaySet(dest);cout<<endl<<endl;char ch;cout<<"在链表尾部添加一个元素ch =";cin>>ch;AddElem(dest, ch);DisplaySet(dest);cout<<endl<<endl;cout<<"删除集合中的存在的某个元素ch ="; cin>>c h;DelElem(dest, ch);DisplaySet(dest);cout<<endl<<endl;cout<<"再创建一个集合src =";Set src=(Set)malloc(sizeof(ElemNode));getchar();CreateSet(src);cout<<"将src集合链接到集合dest中..."<<endl;ContactSet(dest, src);cout<<"此时dest为:";DisplaySet(dest);cout<<endl;if(ExistSubset(dest, src))cout<<"此时src是dest的子集..."<<endl;elsecout<<"此时src不是dest的子集..."<<endl;cout<<endl<<"dest =";DisplaySet(dest);cout<<endl;cout<<"dest的补集是:";Set p=(Set)m alloc(sizeof(ElemNode));p->next=NULL;NegSet(p, dest);DisplaySet(p);cout<<endl<<"演示结束!!!"<<endl;DestroySet(dest);return 0;}//---------------BasicFunctions----------------------- //------------------函数实现-------------------------- int LengthOf(Set src){//返回一个集合的长度int i=0;while(src->next!=NULL){i++;src=src->next;}return i;}//LengthOfvoid CreateSet(Set dest){//创建一个新的字母集合,限定a-zElem Type ch;Set p=dest,n;for(;;){ch=getchar();if(ch=='\n') break;if(ch<97||ch>122) continue;n=(Set)m alloc(sizeof(ElemNode)); p->next=n;n->elem=c h;n->next=NULL;p=n;}return ;}//CreateSetvoid EmptySet(Set dest){//清空一个集合,保留头结点Set p,n;while(dest->next!=NULL){p=dest;n=p->next;for(;n->next!=NULL;){p=n;n=n->next;}free(n);p->next=NULL;}}//EmptySetvoid DestroySet(Set dest){//销毁集合Em ptySet(dest);free(dest);}//DestroySetvoid SortSet(Set dest){//对一个字母集合进行从小到大的排序 int i,j,l,flag;Set p,q,n;l=LengthOf(dest);if(l<2) return;flag=1;for(i=l-1;i>0&&flag==1;i--) {flag=0;p=dest;q=p->next;n=q->next;for(j=0;j<i;j++){if(q->elem>n->elem){flag=1;p->next=n;q->next=n->next;n->next=q;q=p->next;n=q->next;}p=q;q=n;n=n->next;}}}//SortSetvoid DisplaySet(Set src) {//打印集合的所有元素Set p;if(src->next==NULL){printf("φ");return ;}p=src;dop=p->next;putchar(p->elem);} while(p->next!=NULL);}//DisplaySetint ExistElem(Set dest, Elem Type e) {//判断元素是否存在于集合中Set p=dest;if(LengthOf(p)==0)return 0;else{p=p->next;while(p->elem!=e){if(p->next==NULL)return 0;p=p->next;}return 1;}}//ExistElemvoid DelElem(Set dest, ElemType e) {//删除集合中的一个元素一次Set p=dest,q;if(LengthOf(p)==0)return ;q=p->next;if(LengthOf(p)==1){p->next=NULL;free(q);}while(q->elem!=e){p=p->next;q=q->next;if(q->next==NULL){p->next=NULL;free(q);}elsep->next=q->next;}//DelElemvoid AddElem(Set dest, Elem Type e){//在链表尾部追加一个元素Set p=dest, n;while(p->next!=NULL)p=p->next;n=(Set)m alloc(sizeof(ElemNode));p->next=n;n->elem=e;n->next=NULL;}//AddElemvoid ContactSet(Set dest, Set src){//连接一个集合到另一个集合Set p=dest;while(p->next!=NULL)p=p->next;p->next=src->next;}//ContactSetvoid AddSet(Set dest, Set src1, Set src2){//集合并运算SortSet(src1);SortSet(src2);int i=0,j=0,len1=LengthOf(src1),len2=LengthOf(src2); src1=src1->next;src2=src2->next;while(i<len1&&j<len2){if(src1->elem<=src2->elem){i++;if(!ExistElem(dest, src1->elem)) {AddElem(dest, src1->elem);src1=src1->next;}else{src1=src1->next;}}else{j++;if(!ExistElem(dest, src2->elem)) {AddElem(dest, src2->elem);src2=src2->next;}else{src2=src2->next;}}}while(i<len1){i++;if(!ExistElem(dest, src1->elem)) {AddElem(dest, src1->elem);src1=src1->next;}}while(j<len2){j++;if(!ExistElem(dest, src2->elem)){AddElem(dest, src2->elem);src2=src2->next;}}}//AddSetvoid MulSet(Set dest, Set src1, Set src2){//集合交运算SortSet(src1);SortSet(src2);int i=0,j=0,len1=LengthOf(src1),len2=LengthOf(src2);src1=src1->next;src2=src2->next;while(i<len1&&j<len2){if(src1->elem<src2->elem) {i++;src1=src1->next;}else if(src1->elem>src2->elem) {j++;src2=src2->next;} else{i++;j++;if(!ExistElem(dest, src1->elem)){AddElem(dest, src1->elem);src1=src1->next;src2=src2->next;}}}}//MulSetvoid SubSet(Set dest, Set src1, Set src2){//集合差运算SortSet(src1);SortSet(src2);int i=0,len=LengthOf(src1);src1=src1->next;while(i<len){i++;if(!ExistElem(src2, src1->elem))if(!ExistElem(dest, src1->elem)) {AddElem(dest, src1->elem);src1=src1->next;}}else{src1=src1->next;}}}//SubSetint ExistSubset(Set dest, Set src) {//子集判断int i=0,len=LengthOf(src);src=src->next;while(i<len){if(!ExistElem(dest, src->elem)) return 0;i++;src=src->next;}return 1;}//ExistSubsetvoid NegSet(Set dest, Set src) {//求补集SortSet(src);int i=0;while(i<26){if(!ExistElem(src, i+97))AddElem(dest, i+97);i++;}//NegSet 运行示意图:。

c语言的集合的交并补

c语言的集合的交并补
bianli(bing, num2);
printf("}\n");
printf("A-B={");
bianli(bu, num3);
printf("}\n");
return 0;
}
通过键盘,分别输入两个数据元素类型为正整数的集合A和B,以负数输入为结束条件,输出两个集合的交、并、差。从程序完善性上考虑,集合元素输入时,要有检查元素重复的功能。集合可以用数组也可以用链表存储。
输入: A={1,2,3,4,5} B={3,4,5,6,7}
输出 A交B={3, 4, 5}
A并B={1,2,3,4,5,6,7}
}
}
int main(){
int c;
int a[N],count1,b[N],count2;//a,b两个集合,以及数量
int jiao[N],bing[2*N],bu[N];//交并补三个集合
int num1=0,num2=0,num3=0;
printf("请输入第一个集合:\n");
for(int i=0;i<N;i++){
for(int i=0;i<=count1;i++){//用b数组遍历bing
for(int j=0;j<=count2;j++){
if(b[i]==bing[j])
break;
if(j==count2)
bing[num2++]=b[i];
}
}
//求a对b的补集
for(int i=0;i<=count1;i++){
for(int j=0;j<=count2;j++){

离散数学实验报告求集合的运算——并运算

离散数学实验报告求集合的运算——并运算

【实验目的】通过编程实现求给定集合A和B的并集C(C=A∪B)的运算。

【实验内容】已知所给集合A和B,求A与B 的并集C(C=A∪B)。

【实验原理】因为并集的定义为:C={x|x∈A∨x∈B},所以,只要将集合A与B合在一起就得到了并集C。

但是,在一个集合中,同样的元素没必要出现两次或两次以上,所以,在将集合A送入并集C后,应将集合B中与A中相同的元素删除,再将集合B送入并集C之中。

【程序代码】#include<stdio.h>int main(){int a[101],b[101],c[201]={0};int m,n;scanf("%d%d",&m,&n);for(int i=1;i<=m;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)scanf("%d",&b[i]);for(int i=1;i<=m;i++)c[i]=a[i];int i=m+1;int k;for(int j=1;j<=n;j++){int t=1;for(k=1;k<=m;k++){if(a[k]==b[j])t=0;}if(t==1){c[i]=b[j];i++;}}for(int i=1;i<=m+n;i++){if(c[i]!=0)printf("%d ",c[i]);}}【实验结果】【实验心得】首先想到的是数组,先将数组a[],赋值给c[],然后通过两层for循环来判断b[],是否与a[]重复,如若不重复,将b[]赋值给c[]。

在开始的时候由于for循环套错位置出错,后设置一flag来判断b[]和a[]是否有重复的元素。

离散数学 实验四 编程实现集合的交、并、差和补运算。

离散数学 实验四 	编程实现集合的交、并、差和补运算。

离散数学实验报告专业班级:姓名:学号:实验成绩:1.【实验题目】集合运算2.【实验目的】编程实现集合的交、并、差和补运算。

3.【实验内容】从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。

4. 【实验要求】通过以下界面提示实现相应的集合运算**************************************************************** 请分别输入集合A与集合B的元素:请选择(1—5)要进行的集合运算:1.集合的交运算(A⋂B)2.集合的并运算(A⋃B)3.集合的差运算(A-B)4.集合的补运算(~A=E-A)5.继续/退出(y/n)****************************************************************5. 【算法描述】(1)用数组A,B,C,E表示集合。

假定A={1,3,4,5,6,7,9,10}, B={2,,3,4,7,8,10}, E={1,2,3,4,5,6,7,8,9,10}, 输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。

以下每一个运算都要求先将集合C置成空集。

(2)二个集合的交运算:A⋂B={x|x∈A且x∈B}把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C 中,数组C便是集合A和集合B的交。

C语言算法:for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]= =b[j]) c[k++]=a[i];(3)二个集合的并运算:A⋃B={x|x∈A或x∈B}把数组A中各个元素先保存在数组C中。

将数组B中的元素逐一与数组B中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B 的并。

C语言算法:for(i=0;i<m;i++)c[i]=a[i];for(i=0;i<n;i++){for(j=0;j<m;j++)if(b[i]= =c[j]) break;if(j= =m){ c[m+k]=b[i];k++;}}(4)二个集合的差运算:A-B={x|x∈A且x∉B}将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。

集合的并交差运算c++

集合的并交差运算c++

集合的并交差运算c++集合的并、交、差运算是集合论中常用的操作,也是编程中常见的操作。

在c++中,可以使用STL中的set容器来实现这些操作。

set是一种有序的容器,其中每个元素都是唯一的。

在set中,插入操作和查找操作的时间复杂度均为O(logN),其中N为集合中元素的个数。

1.并集运算假设有两个set容器A和B,要求它们的并集。

可以使用STL中的set_union函数来实现:set<int> A, B, C; // 定义三个set容器// 将A和B合并为Cset_union(A.begin(), A.end(), B.begin(), B.end(), inserter(C, C.begin()));set_union函数将A和B中的元素合并到C中,并保证C中的元素是有序的且唯一的。

2.交集运算假设有两个set容器A和B,要求它们的交集。

可以使用STL中的set_intersection函数来实现:set<int> A, B, C; // 定义三个set容器// 将A和B的交集放入C中set_intersection(A.begin(), A.end(), B.begin(), B.end(), inserter(C, C.begin()));set_intersection函数将A和B中的共同元素放入C中,并保证C中的元素是有序的且唯一的。

3.差集运算假设有两个set容器A和B,要求它们的差集(即A中有但B中没有的元素)。

可以使用STL中的set_difference函数来实现:set<int> A, B, C; // 定义三个set容器// 将A和B的差集放入C中set_difference(A.begin(), A.end(), B.begin(), B.end(), inserter(C, C.begin()));set_difference函数将A中有但B中没有的元素放入C中,并保证C中的元素是有序的且唯一的。

集合的交并补运算

集合的交并补运算
作业: 课本第13页第6题.
观察集合A, B, C之间的关系 A={1, 2, 3, 4, 5}, B={1, 2, 3}, C={4, 5} A={1, 2, 3, 4, 5, 6, 7}, B={1, 2, 3} C={4, 5, 6, 7}
观察集合A,B,C之间的关系 A={1, 2, 3, 4, 5}, B={1,2,3}, C={4,5} A={1,2,3, 4,5,6, 7}, B={1,2,3} C={4,5,6, 7}
并集
交集
A A A, A A A A A, A
A∪B =B∪A
A∩B=B∩A
子集、交 集、并集 之间的关 系
(A∪B) A ,(A∪B) B (A∩B) A ,(A∩B) B
(A∩B)=A A B (A∪B)=B A B
(A∩B) (A ∪ B)
六 知识总结
本节我们学习了集合的并、交两种基本运算, 要在理解其运算本质的基础上记忆其运算性质; 在掌握概念的基础上能够熟练运用自然语言、符 号语言、图形语言来表示集合的交、并运算.
A∩B={x|x∈A且x∈B}. 可用Venn图表示:
四 知识创新
根据右图讨论一下并集 的运算性质
1A B A, A B B; 2A A A; 3A A; 4A B B A.
四 知识创新
根据右图讨论一下交集 的运算性质
1(A B) A, (A B) B; 2A A A; 3A ; 4A B B A.
2和 4都不是方程x2 ax a2 19 0的解;
3是方程x2 ax a2 19 0的解.
a2 3a 10 0, a 2或a 5. 当a 2时,经验证适合题意; 当a 5时, A {2,3}, 此时A C , a 5舍去. a 2.

c语言实现集合的交叉并运算

c语言实现集合的交叉并运算

c语言实现集合的交叉并运算集合是数学中的一个重要概念,它指的是一组具有共同特征的元素的整体。

在数学中,我们经常需要对集合进行交叉并运算,以求得集合之间的关系。

在本文中,我们将使用C语言来实现集合的交叉并运算。

我们需要定义集合的数据结构。

在C语言中,我们可以使用数组来表示集合。

假设我们要操作的集合元素类型为整数,那么我们可以定义一个整型数组来表示集合。

例如,我们可以定义一个名为set1的数组来表示集合A,一个名为set2的数组来表示集合B。

接下来,我们需要编写函数来实现集合的交叉并运算。

首先,我们来实现交集运算。

交集运算指的是找出两个集合中共有的元素。

我们可以通过遍历集合A中的每一个元素,然后与集合B中的每一个元素进行比较,如果找到相同的元素,则将该元素添加到交集的数组中。

具体代码实现如下:```cvoid intersection(int set1[], int set2[], int len1, int len2, int result[], int *len_res) {int i, j;*len_res = 0;for (i = 0; i < len1; i++) {for (j = 0; j < len2; j++) {if (set1[i] == set2[j]) {result[*len_res] = set1[i];(*len_res)++;break;}}}}```上述代码中,我们通过两个嵌套的循环来遍历集合A和集合B,如果找到相同的元素,则将其添加到交集的数组中,并更新交集数组的长度。

接下来,我们来实现并集运算。

并集运算指的是将两个集合中的所有元素合并成一个新的集合。

我们可以通过遍历集合A和集合B,将它们的所有元素依次添加到新的集合中。

具体代码实现如下:```cvoid unionSet(int set1[], int set2[], int len1, int len2, int result[], int *len_res) {int i;*len_res = 0;for (i = 0; i < len1; i++) {result[*len_res] = set1[i];(*len_res)++;}for (i = 0; i < len2; i++) {int j;for (j = 0; j < len1; j++) {if (set2[i] == set1[j]) {break;}}if (j == len1) {result[*len_res] = set2[i];(*len_res)++;}}}```上述代码中,我们首先将集合A中的所有元素添加到新的集合中,然后遍历集合B中的每一个元素,如果该元素不在集合A中,则将其添加到新的集合中。

集合的并、交运算C语言

集合的并、交运算C语言

集合的并、交运算(C语言) 在C语言中,可以使用逻辑运算符和位运算符来实现集合的并、交运算。

首先,我们需要定义两个布尔类型的数组来表示两个集合。

假设我们有两个集合A和B,它们的元素都是0或1,其中0表示该位置不属于该集合,1表示该位置属于该集合。

我们可以使用以下代码来定义两个集合:int A[10] = {0, 1, 0, 0, 1, 1, 0, 1, 0, 0}; // 集合Aint B[10] = {0, 0, 1, 0, 1, 0, 1, 1, 0, 0}; // 集合B接下来,我们可以使用逻辑运算符来实现集合的并、交运算。

1.并运算并运算即将集合A和集合B的所有元素合并成一个新的集合。

我们可以使用逻辑运算符“|”来实现并运算,代码如下:int C[10]; // 新集合Cfor (int i = 0; i < 10; i++) {C[i] = A[i] | B[i]; // 并运算}在上面的代码中,我们使用循环遍历所有元素,对于每个元素,如果它属于集合A或集合B,则将它赋值给新集合C。

这里使用了逻辑运算符“|”,表示两个集合的并运算。

2.交运算交运算即找出集合A和集合B中共有的元素组成一个新的集合。

我们可以使用逻辑运算符“&”来实现交运算,代码如下:int D[10]; // 新集合Dfor (int i = 0; i < 10; i++) {D[i] = A[i] & B[i]; // 交运算}在上面的代码中,我们同样使用循环遍历所有元素,对于每个元素,如果它既属于集合A又属于集合B,则将它赋值给新集合D。

这里使用了逻辑运算符“&”,表示两个集合的交运算。

需要注意的是,在实际应用中,我们可能需要对数组进行动态分配内存,以适应不同大小的集合。

此外,我们还需要注意数组下标从0开始计数的问题。

集合的交,并,差操作

集合的交,并,差操作

目录序言 (1)中文摘要 (2)1.采用类C语言定义相关数据类型 (3)2.各模块流程图及伪码算法 (4)3.函数的调用关系图 (12)4.调试分析 (13)5.测试结果 (14)6.设计总结 (19)参考文献 (20)致谢 (21)附录(源程序) (22)序言云计算来袭,计算机技术的飞速发展,给我们的生活带来了很大的便利,特别是对于数学运算,一些以前人工计算很麻烦的甚至做不出的问题,计算机在几秒钟就可以算出来。

毫无疑问,计算机技术的应用已是不可阻挡的。

这里我们要做的是集合的简单操作,包括集合的交、并、差。

经过分析,我们使用已经为业界所公认的成熟的稳定的开发工具VC6.0,利用其提供的简单操作,首先在短时间内建立程序原形,然后,对初始原型程序需求分析,编写源程序,不断修正和改进,直到形成满足要求的可行程序。

集合的操作是数据结构中最简单的操作,对集合的学习实践可以帮助我们加深对数据结的掌握程度。

本程序是用单链表的基本操作升华到集合上的操作,来实现集合运算。

中文摘要利用单链表的插入删除操作进一步升华到求两个集合的交、并、差,笛卡尔积等运算。

在Visual C++6.0中实现程序的编译,调试,运行,利用随机数验证并输出这个程序的结果。

通过该题目的设计过程,可以进一步理解和熟练掌握课本中所学的各种数据结构的知识,加深对链表的认识,特别是对于指针、文件的应用,有了更多的认识。

学会如何把学到的知识用于解决实际问题,培养自己的动手能力。

关键词:集合;链表;指针;随机数;文件;1.采用类C语言定义相关数据类型定义单链表typedef struct ListNode{int data; //集合中元素的值struct ListNode *next;//集合的指针域}ListNode,*LinkList;//结点,结构体指针2.各模块流程图及伪码算法建立链表模块LinkList CreateSet(LinkList L) {LinkList p = L,q = NULL;//读取产生的随机数作为集合的元素 FILE *rfile;rfile = fopen("jihe.txt","rb"); if ( rfile == NULL ) { printf("open data.txt error.");return 0;Linklist p,q从文件中读取数据成功randomm()否打开文件失败把生成的随机数读取到文件中fread ()是结束}int rs = 0;int rra[20] = {0};rs = fread(rra, sizeof(int),20,rfile);for ( int j = 0 ; j < rs; j++){q = NULL;q = (LinkList)malloc(sizeof(ListNode));q->next=NULL;q->data = rra[j]; //读取元素值p->next = q;p = p->next;}//forfclose(rfile);return L;}计算集合并的函数模块//求并集LinkList Union(LinkList A,LinkList B,LinkList C) {LinkList pa, pb, pc,tail; pa = A->next; pb = B->next; tail = C; while(pa && pb) { if((pa->data) <= (pb->data)){pc = (LinkList)malloc(sizeof(ListNode)); LinkList pa, pb, pc,tail;pa!=null &&pb!=nullpa->data<=pb->datapc->data = pa->datapc->data = pb->data结束否否是是pc->data = pa->data;pc->next=tail->next;tail->next = pc;tail = pc;pc = pc->next;pa = pa->next;}//ifelse{pc = (LinkList)malloc(sizeof(ListNode));pc->data = pb->data;pc->next=tail->next;tail->next = pc;tail = pc;pc = pc->next;pb = pb->next;}//else}if(pa == NULL){pc = pb;tail->next = pc;tail = pc;}//ifelse{pc = pa;tail->next = pc;tail = pc;}//else}//whilereturn(C);}计算集合交的函数模块//求交集LinkList Intersection(LinkList A,LinkList B,LinkList L) {ListNode *pa, *pb, *pc,*tail; tail = L; pa = A->next; pb = B->next; while (pa && pb) { if (pa->data < pb->data) {pa = pa->next;LinkList pa, pb, pc,tail;pa!=null &&pb!=nullpa->data==pb->datapc->data = pa->data释放pa,pb结束否否是是}//ifelse if (pa->data > pb->data){pb = pb->next;}//else ifelse{pc = (LinkList)malloc(sizeof(ListNode));pc->data = pa->data;pc->next=tail->next;tail->next = pc;tail = pc;pc = pc->next;pa = pa->next;pb = pb->next;}//else}//whilereturn L;}计算集合1与集合2的差 的函数模块//求差集LinkList Difference(LinkList A,LinkList B,LinkList C) {LinkList pa, pb, pc; pa = A->next; pb = B->next; pc = A;while(pa && pb) { if (pa->data != pb->data) {pc->next = pa;LinkList pa, pb, pc,tail;pa!=null &&pb!=nullpa->data !=pb->datapc->data = pa->data释放pa,pb结束否否是是pc = pa;pa = pa->next;}//ifelse{pa = pa->next;pb = pb->next;}//else}//whilereturn A;}3.函数的调用关系图main()menu_select()CreateSet CreateSet2 Difference Union Intersection PrintSet4.调试分析a.调试中遇到的问题及对问题的解决方法调试中遇到的问题中主要是内存泄露问题,指针何时分配空间何时释放空间没有搞清楚,还有随机数产生完成后不知道怎么读入到链表中,对于这些问题,我上网查阅相关的资料,来进一步的确定问题的本质,从而解决问题的每一步。

C语言实现集合的交,并,差

C语言实现集合的交,并,差
DelFirst(lsb,node);Append(lsc,node);
}
return OK;
}
Status IntersectionSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc)...{
//已知集合ls1,ls2的元素按值非递减排列
//将集合ls1,ls2的交集到ls3
ls.tail = (Link) malloc( sizeof(Link));
if(!ls.head || !ls.tail) exit(OVERFLOW); //如果分配失败
ls.head->next = ls.tail->next = NULL; //头、尾指针为空
ls.len = 0; //长度为0
int result = Compare(pa,pb);
if( result<0) ...{
DelFirst(lsa,node);pa = NextPos(ha);
}else if(result>0)...{
DelFirst(lsb,node); pb = NextPos(hb);
}else...{
}
return OK;
}
Status DifferenceSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc)...{
//已知集合ls1,ls2的元素按值非递减排列
//ls3 = ls1 - ls2
if( !InitSe h->next;
}
printf(" ] ");
return OK;
}

c语言集合的交并运算

c语言集合的交并运算

c语言集合的交并运算C语言是一种广泛应用的编程语言,它提供了丰富的数据结构和操作方法,其中集合的交并运算是C语言中常用的操作之一。

本文将围绕集合的交并运算展开,介绍相关概念、操作方法和实际应用。

一、集合的基本概念在C语言中,集合可以看作是一组具有相同类型的元素的无序集合。

集合中的元素不重复,每个元素都具有唯一的标识。

集合的交运算和并运算是两种常用的操作,下面将详细介绍这两种操作的含义和实现方法。

二、集合的交运算集合的交运算指的是求两个集合中共同存在的元素构成的新集合。

假设集合A和集合B分别为{1, 2, 3, 4}和{3, 4, 5, 6},则它们的交集为{3, 4}。

在C语言中,可以使用循环和条件判断来实现集合的交运算。

具体实现方法如下:1. 定义两个集合A和B,并初始化它们的元素。

2. 创建一个新的集合C,用于存放交集的元素。

3. 使用循环遍历集合A的每个元素,对于每个元素,判断它是否同时存在于集合B中。

4. 如果存在,则将该元素添加到集合C中。

5. 最后,集合C中存放的就是A和B的交集。

三、集合的并运算集合的并运算指的是将两个集合中的所有元素合并成一个新集合。

假设集合A和集合B分别为{1, 2, 3, 4}和{3, 4, 5, 6},则它们的并集为{1, 2, 3, 4, 5, 6}。

在C语言中,可以使用循环和条件判断来实现集合的并运算。

具体实现方法如下:1. 定义两个集合A和B,并初始化它们的元素。

2. 创建一个新的集合C,用于存放并集的元素。

3. 遍历集合A的每个元素,将它们依次添加到集合C中。

4. 遍历集合B的每个元素,对于每个元素,判断它是否已经存在于集合C中。

5. 如果不存在,则将该元素添加到集合C中。

6. 最后,集合C中存放的就是A和B的并集。

四、集合运算的应用集合的交并运算在实际应用中具有广泛的用途。

以下列举几个常见的应用场景:1. 数据去重:当需要对一组数据进行去重操作时,可以将这组数据看作是一个集合,通过求其并集得到去重后的结果。

集合间交并补的运算集合与集合之间的运算关系

集合间交并补的运算集合与集合之间的运算关系

一、集合的特性1、确定性给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。

2、互异性一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。

有时需要对同一元素出现多次的情形进行刻画,可以使用多重集,其中的元素允许出现多次。

3、无序性一个集合中,每个元素的地位都是相同的,元素之间是无序的。

集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。

但就集合本身的特性而言,元素之间没有必然的序。

集合的基本运算:交集、并集、补集、子集。

集合交换律:A∩B=B∩A、A∪B=B∪A集合结合律:(A∩B)∩C=A∩(B∩C) 、(A∪B)∪C=A∪(B∪C)集合分配律:A∩(B∪C)=(A∩B)∪(A∩C)、A∪(B∩C)=(A∪B)∩(A ∪C)二、交集概念:(1)一般地,由所有属于集合A且集合B的元素所组成的集合,叫做A与B的交集,记作A∩B,读作A交B,表达式为A∩B={x|x∈A且x∈B}。

(2)韦恩图表示为。

2、并集概念:(1)一般地,由所有属于集合A或集合B的元素所组成的集合,叫做A与B的并集,记作A∪B,读作A并B,表达式为A∪B={x|x∈A或x∈B}。

(2)韦恩图表示为。

3、全集、补集概念:(1)全集:一般地,如果一个集合含有我们所要研究的各个集合的全部元素,就称这个集合为全集,通常记作U。

补集:对于一个集合A,由全集U中所有不属于A的元素组成的集合称为集合A相对于全集U的补集,记作C U A,读作U中A的补集,表达式为C U A={x|x∈U,且x A}。

(2)韦恩图表示为。

1、交集:(1)定义:一般地,由所有属于集合A且集合B的元素所组成的集合,叫做A与B的交集,记作A∩B,读作A交B,表达式为A∩B={x|x ∈A且x∈B}。

(2)性质:(3)韦恩图表示为。

2、并集:(1)定义:一般地,由所有属于集合A或集合B的元素所组成的集合,叫做A与B的并集,记作A∪B,读作A并B,表达式为A∪B={x|x ∈A或x∈B}。

专题02集合的交、并、补运算

专题02集合的交、并、补运算

第02讲集合的交、并、补运算考纲要求:1、理解两个集合的并集与交集的含义,会求两个简单集合的并集与交集.2、理解在给定集合中一个子集的补集的含义,会求给定子集的补集.3、能使用韦恩(Venn)图表达集合的关系及运算.基础知识回顾:1、集合的基本运算集合的并集集合的交集集合的补集若全集为U,则集合A的补集为符号表示A∪B A∩B?U A图形表示意义?{x|x∈A,或x∈B} {x|x∈A,且x∈B} ?{x|x∈U,且x?A}2、集合的运算性质①A∪B=A?B?A,A∩B=A?A?B;②A∩A=A,A∩?=?;③A∪A=A,A∪?=A;④A∩?U A=?,A∪?U A=U,?U(?U A)=A,?U(A∪B)=?U A∩?U B,?U(A∩B)=?U A∪?U B应用举例:类型一:已知集合中的元素,求其交集、并集或补集【例1】【2017河南省洛阳市一中高三入学考试】若集合A={i,i2,i3,i4}(i是虚数单位),B={1,-1},则A∩B等于( )A.{-1}B.{1}C.{1,-1}D.【例2】【2017湖南省长沙市长郡中学高三摸底】已知集合2{|230}A x x x =--≤,{|ln(2)}B x y x ==-,则A B =()A .(1,3)B .(1,3]C .[1,2)-D .(1,2)-【例3】【2017东北四市高三联考】设集合M ={x|-2<x<3},N ={x|2x +1≤1},则M ∩(?R N)=类型二:已知集合交集、并集或补集中的元素,求其集合中的元素【例4】【2017浙江省温州市高三月考试题】设全集{}()1,2,3,4,5,U UC A B =={}(){}1,A 3U C B =, 则集合B =()A .{}1,2,4,5B .{}2,4,5C .{}2,3,4D .{}3,4,5【例5】【2017河北省温邯郸市高三月考试题】已知全集{1,2,3,4,5}U =,集合{1,2,3}A =,{3,4,5}B =,则U A C B ( )A .{3}B .{1,2,4,5}C .{1,2}D .{1,3,5} 类型三:已知集合关系求参数的值或范围【例6】【2017年长郡中学高三入学考试】已知集合2{|4}A x y x ==-,{|1}B x a x a =≤≤+,若A B A =,则实数a 的取值范围为()A .(,3][2,)-∞-+∞B .[1,2]-C .[2,1]-D .[2,)+∞【例7】【2017江苏省南通市如东县一中高三月考】【已知A ={x |x 2-3x +2=0},B ={x |ax -2=0},若A ∩B =B ,则实数a 的值为( )A .0或1或2B .1或2C .0D .0或1【例8】【2017西藏林芝市高三月考】已知集合A ={x |x 2-2x -3≤0},B ={x |x 2-2mx +m 2-4≤0,x ∈R ,m ∈R}.(1)若A ∩B =[0,3],求实数m 的值;(2)若A ??R B ,求实数m 的取值范围.类型四:新定义集合运算问题【例9】【2017江西省新余市第一中学高三开学考试】设,A B 是非空集合,定义{}|,AB x x A x B =∈∉且,已知{}{}2|20,|2x A x x x B y y =--≤==,则A B =()A .∅B .[]1,0-C .[)1,0-D .(]1,2【例10】【浙江省温州市2017届高三8月模拟考试数学(理)试题】设集合0123{,,,}S A A A A =,在S 上定义运算⊕为:i j k A A A ⊕=,其中k 为i j +被4除的余数,i ,j =0,1,2,3.若230()m A A A A ⊕⊕=,则m 的值为( )A .0B .1C .2D .3方法、规律归纳:1、一个性质:要注意应用A ?B 、A ∩B =A 、A ∪B =B 、?U A ??U B 、A ∩(?U B )=?这五个关系式的等价性. 两种方法2、两种方法:韦恩图示法和数轴图示法是进行集合交、并、补运算的常用方法,其中运用数轴图示法要特别注意端点是实心还是空心.实战演练:1.【2017河南省天一大联考高三阶段性考试】已知集合{1,2,3,4}A =,2{|log (31),}B n n k k A ==-∈,则A B =()A .{3}B .{1}C .{1,3}D .{1,2,3}2.【2017广东省珠海市高三摸底考试】设集合{}{}11,3<<-=∈==x x B R x y y A x,,则A B =A.()11-, B.()10,C.()∞+,1- D.()+∞0, 3.【2017青岛一中高三质检】2.已知数集A ={a 1,a 2,…,a n }(1≤a 1<a 2<…<a n ,n ≥2)具有性质P :对任意的i ,j (1≤i ≤j ≤n ),a i a j 与两数中至少有一个属于A ,则称集合A 为“权集”,则( )A .{1,3,4}为“权集”B .{1,2,3,6}为“权集”C .“权集”中元素可以有0D .“权集”中一定有元素14.【2017北京市高三入学定位考试】已知集合{|11}A x R x =∈-<<,{|03}B x R x =∈≤≤,则A B =()A .{|01}x x ≤<B .{|13}x x <≤C .{|13}x x -<≤D .{|1,}x x x <-≥或05.【2017广东省惠州市高三第一次调研考试】已知{1,2,4,8,16}A =,2{|log ,}B y y x x A ==∈,则A B =()A .{1,2}B .{2,4,8}C .{1,2,4}D .{1,2,4,8}6.【2017新疆兵团农二师华山中学2高三试题】已知集合{|21}A x x =-<<,2{|20}B x x x =-≤,则A B =()A .{|01}x x <<B .{|01}x x ≤<C .{|11}x x -<≤D .{|21}x x -<≤7.【2017湖北省襄阳市第四中学高三月考试题】已知集合1|,,11M y y x x R x x ⎧⎫==+∈≠⎨⎬-⎩⎭,集合{}2|230N x x x =--≤,则()A .M N =∅B .R MC N ⊆C .R M C M ⊆D .M N R ⋃=8.【2017江西吉安一中高三月考】已知集合M ={x |≤0},N ={x |y =},在集合M 中任取一个元素x ,则“x ∈M ∩N ”的概率是.9.【2017湖北省襄阳市第四中学高三周考】已知集合A ={-1,1},B ={x |x 2-2ax +b =0},若∅≠B 且A ∪B =A ,求a ,b 的值.10.【2017江苏省南通市如东县一中高三月考】设A={x|x 2+4x=0},B={x|x 2+2(a+1)x+a 2-1=0},其中x ∈R,如果A ∩B=B,求实数a 的取值范围.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目一:集合的并、交运算首先,建立两个带头结点的有序单链表表示集合A和B。

须注意的是:利用尾插入法建立有序单链表,输入数值是升序排列。

其次,根据集合的运算规则,利用单链表的有序性,设计交、并和差运算。

根据集合的运算规则,集合AAB中包含所有既属于集合A又属于集合B的元素。

因此,须查找单链表A和B中的相同兀素并建立一个链表存于此链表中。

根据集合的运算规则,集合AUB中包含所有或属于集合A或属于集合B 的元素。

因此,中,遍历两链表的同时若元素相同时只将集合A中的元素存于链表若集合A中的下一个元素小于B中的元素就将A中的元素存于新建的链表中。

反之将B中的兀素存于链表中。

2所用数据结构线性结构利用链式存储结构实现集合的基本运算。

3源代码分析#i ncludevstdio.h>#in clude<stdlib.h>#defi ne ERROR 0#defi ne OK 1typ edef int Status;typ edef char Elemt ype;typ edef struct LNode{ 线性表的链式存储结构Elemt ype data;struct LNode *n ext;}Lno de,*Li nklist;#i nclude"text.h"LNode* Greatlist(i nt *N,i nt n) 〃建立一个带有头结点的单链表{Lin klist p,q,L;L=p=(LNode *)malloc(sizeof(LNode));L-> next=NULL;if(n !=0){for(i nt i=0;i vn ;i++){q=(LNode *)malloc(sizeof(LNode));//尾部插入结点建立带有头结点单链表q->data=N[i]; p->next=q; p=q;}} p->next=NULL; // 对于非空表,最后结点的指针域放空指针 return L;}LNode* jiaoji(Linklist la,Linklist lb) //求两集合的交集{Linklist pa,pb,pc,Lc;pa=la->next;pb=lb->next;Lc=(Linklist)malloc(sizeof(LNode));Lc->next=NULL;pc=Lc; while(pa&&pb){if(pa->data==pb->data){pc->next=(Linklist)malloc(sizeof(LNode));// 若相等就申请存储空间链到 Lc 上pc=pc->next; pc->data=pa->data;pa=pa->next; //la ,lb 的指针后移pb=pb->next;}else if(pa->data>pb->data)//若pa 所指的元素大于 pb 所指的元素 pb 指针 后移{ pb=pb->next;} else{ pa=pa->next;} }pc->next=NULL;// 最后给 pc 的 next 赋 NULL return Lc;}LNode* bingji(Linklist la,Linklist lb) // 求两集合的并集{Linklist pa,pb,pc,lc;pa=la->next;pb=lb->next;lc=(Linklist)malloc(sizeof(LNode)); lc->next=NULL;pc=lc;//指针后移//申请存储空间while(pa&&pb){if(pa->data==pb->data){pc->next=(Linklist)malloc(sizeof(LNode));//若所指的元素申请空间将值存入链表lc,pa,pb 指针后移pc=pc->next;pc->data=pa->data;pa=pa->next;pb=pb->next;}else if(pa->data>pb->data){pc->next=(Linklist)malloc(sizeof(LNode));// 若所指的元素申请空间将值存入链表lc,pb 指针后移pc=pc->next;pc->data=pb->data;pb=pb->next;}else{pc->next=(Linklist)malloc(sizeof(LNode));//若所指的元素申请空间将值存入链表Ic, pa指针后移pc=pc->next;pc->data=pa->data; pa=pa->next;}}pc->next=pa?pa:pb;return Ic;}void Print_LinkList(LinkIist L) //输出元素{LinkIist p=L->next;while( P)//链表不为空时输出链表中的值{printf(" %3c" ,p->data);p=p->next;}printf(" \n" ); papapa所指的元素等于所指的元素大于所指的元素小于pbpbpb}void main() {Linklist L1,L2,La,Lb;int A[4]={'a','b','c','f'};int B[4]={'c','d','e','f'};printf("1)含多个结点的顺序表[‘ a' , ' b'和'cc', ' '''n' e' , ' f'] printf("建立链表L1为\n");L1=Greatlist(A,4);Print_LinkList(L1);printf("建立链表L2为\n");L2=Greatlist(B,4);Print_LinkList(L2);printf(" 两链表的交集为:\n");La=jiaoji(L1,L2);Print_LinkList(La);printf(" 两链表的并集为:\n");Lb=bingji(L1,L2);Print_LinkList(Lb);printf("2)含一个结点的顺序表[‘ a和空表[]\n");int A1[1]={'a'};int B1[1]={'0'};printf("建立链表L1为\n");L1=Greatlist(A1,1);Print_LinkList(L1);printf("建立链表L2为\n");L2=Greatlist(B1,0);Print_LinkList(L2);printf(" 两链表的交集为:\n");La=jiaoji(L1,L2);Print_LinkList(La);printf("两链表的并集为:\n");Lb=bingji(L1,L2);Print_LinkList(Lb);printf("3)2 个空表\n");int A2[1]={'0'};int B2[1]={'0'};printf("建立链表L1为\n");L1=Greatlist(A2,0);Print_LinkList(L1);printf("建立链表L2为\n");L2=Greatlist(B2,0);Print_LinkList(L2);printf("两链表的交集为:\n");La=jiaoji(L1,L2);Print_LinkList(La);printf(" 两链表的并集为:\n");Lb=bingji(L1,L2);3)Print_LinkList(Lb);free(L1);free(L2);free(La);free(Lb);}4 测试数据及运行结果(1) 含多个结点的顺序表[‘a ' , ' b '和t Cc ', : 'd ' , ' e ' , ' f '](2) 含一个结点的顺序表[‘ a 和空表[](3)2个空表5 算法分析LNode* Greatlist()// 尾插法建立链表 算法的时间复杂度为0 (n ), n 为输入元素个数。

LNode* jiaoji(Linklist la,Linklist lb) 算法时间复杂度为0 (m+n ), m 为集合A 元素个数,n 为集合B 元素个数。

LNode* bingji(Linklist la,Linklist lb)算法时间复杂度为0 (m+n ), m 为集合A 元素个数,n 为集合B 元素个数。

4) void Print_LinkList(Linklist L)算法时间复杂度为0 (n ) n 为集合元素个数。

1)2)。

相关文档
最新文档