集合的交并差
- 格式:doc
- 大小:45.50 KB
- 文档页数:11
班级:计算机11-3班学号:姓名:曲玉昆成绩:_________实验四集合的交、并和差运算的实现1. 问题描述用有序单链表表示集合,实现集合的交、并和差运算。
2. 基本要求⑴对集合中的元素,用有序单链表进行存储;⑵实现交、并、差运算时,不另外申请存储空间;⑶充分利用单链表的有序性,算法有较好的时间性能。
3. 设计思想首先,建立两个带头结点的有序单链表表示集合A和B。
单链表的结点结构和建立算法请参见教材,需要注意的是:利用头插法建立有序单链表,实参数组应该是降序排列。
其次,根据集合的运算规则,利用单链表的有序性,设计交、并和差运算。
⑴根据集合的运算规则,集合BA 中包含所有既属于集合A又属于集合B的元素。
因此,需查找单链表A和B中的相同元素并保留在单链表A中。
算法如下:Array⑵根据集合的运算规则,集合BA 中包含所有或属于集合A或属于集合B的元素。
因此,对单链表B中的每个元素x,在单链表A中进行查找,若存在和x不相同的元素,则将该结点插入到单链表A中。
算法请参照求集合的交集自行设计。
⑶根据集合的运算规则,集合A-B中包含所有属于集合A而不属于集合B的元素。
因此,对单链表B中的每个元素x,在单链表A中进行查找,若存在和x相同的结点,则将该结点从单链表A中删除。
算法请参照求集合的交集自行设计。
template<class T>struct Node{T data;N ode<T>*next;};template <class T>class LinkList{public:L inkList(T a[],int n);//建立有n个元素的单链表~LinkList();v oid Interest(Node<T> *A, Node<T> *B);//求交集v oid Sum(Node<T> *A,Node<T> *B);/v oid Subtraction(Node<T> *A,Node<T> *B);v oid PrintList();v oid Show(int i);N ode<T> *first;};template<class T>LinkList<T>::LinkList(T a[],int n){N ode<T>*s;f irst = new Node<T>;f irst->next=NULL;f or(int i=0;i<n;i++){s = new Node<T>;s->data=a[i];s->next=first->next;first->next=s; }}template <class T>LinkList<T>::~LinkList(){N ode<T> *p,*q;p = first;//工作指针p初始化w hile(p) //释放单链表的每一个结点的存储空间{q = p;//暂存被释放结点p = p->next;//工作指针p指向被释放结点的下一个结点,使单链表不断开delete q; }}template<class T>void LinkList<T>::Interest(Node<T> *A,Node<T> *B){N ode<T> *pre,*p,*q;p re = A;p =A ->next;q = B->next;w hile(p&&q){if(p->data < q->data){pre->next = p->next;p = pre->next;}else if(p->data > q->data){q = q->next;}else{pre = p;p = p->next;q = q->next;} }}//求并集template<class T>void LinkList<T>::Sum(Node<T> *A,Node<T> *B{N ode<T> *pre,*p,*q;p re = A; p = A->next;q = B->next;w hile(p&&q){if(p->data < q->data){pre = p;p = p->next;}else if(p->data > q->data){q = q->next;}else{pre->next = p->next;p = p->next;q = q->next;}}}template<class T>void LinkList<T>::Subtraction(Node<T> *A,Node<T> *B){N ode<T> *pre,*p,*q,*pra;p re = A; pra = B; p = A->next; q = B->next;w hile(p&&q){if(p->data < q->data){pre = p;p = p->next; }else if(p->data > q->data){q = q->next;}else{pre->next = p->next;p = pre->next;q = q->next;}}}template<class T>void LinkList<T>::PrintList(){N ode<T> *p;p=first->next;//工作指针p初始化w hile(p != NULL)//遍历输出所有元素{cout<<p->data;p = p->next; }c out<<endl;}//菜单函数int meun(){i nt m;d o {c out<<"请输入对应数字(1、求交集2、求并集3、求差集4、结束运行)"<<endl;c in>>m;}while(m<1||m>4);return m;}int a[]={5,4,3,2,1},b[]={6,4,2};i nt n = 5,m = 3;L inkList<int> SL(a,n);L inkList<int> sl(b,m);L inkList<int> s(a,n);L inkList<int> S(b,m);L inkList<int> l(a,n);L inkList<int> L(b,m);static bool bl = true;template<class T>void LinkList<T>::Show(int i){s witch(i) {c ase 1:{Node<T> *p,*q;p = ;q = ;();();(p,q);();cout<<endl;cout<<"已求交集"<<endl;}break;c ase 2:{Node<T> *p,*q;p = ;q = ;();();(p,q);();();cout<<"已求并集"<<endl;}break;c ase 3:{Node<T> *p,*q;p = ;q = ;();();(p,q);();cout<<"已求差集"<<endl;}break;c ase 4:{bl = false; } break; }} void main(){w hile(bl == true){int i=meun();(i);}}。
#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(\);}}//---------------------------------------------------------------------------。
集合运算交并差集合是数学中常见的一个概念,它是由一组无序的元素所组成的。
在集合理论中,常常需要进行集合的交、并、差等运算。
本文将详细介绍集合运算的概念和常见的操作方法。
一、交集运算交集是指给定两个或多个集合时,由两个或多个集合中共有的元素所组成的新的集合。
交集运算可以用符号"∩"来表示。
例如,有集合A={1, 2, 3, 4, 5}和集合B={4, 5, 6, 7, 8},则A和B的交集为A∩B={4, 5}。
交集运算即将A和B中共有的元素4和5提取出来。
二、并集运算并集是指给定两个或多个集合时,由这些集合中所有元素所组成的新的集合。
并集运算可以用符号"∪"来表示。
例如,有集合C={1, 2, 3}和集合D={3, 4, 5},则C和D的并集为C∪D={1, 2, 3, 4, 5}。
并集运算即将C和D中的所有元素合并到一个新的集合中。
三、差集运算差集是指给定两个集合A和B时,由属于A但不属于B的元素所组成的新的集合。
差集运算可以用符号"-"来表示。
例如,有集合E={1, 2, 3, 4, 5}和集合F={4, 5, 6, 7, 8},则E和F的差集为E-F={1, 2, 3}。
差集运算即从E中去掉属于F的元素。
总结起来,集合运算交并差是在集合理论中常见的操作方法。
交集提取出两个或多个集合中共有的元素,而并集合并了所有集合中的元素,差集则从一个集合中去掉了与另一个集合相同的元素。
在实际应用中,集合运算经常用于数据分析、数据库查询等领域。
例如,在数据库查询中,可以使用交集运算找出两个表格中共有的数据,使用并集运算将两个表格中的数据合并,使用差集运算将两个表格中不同的数据分开。
需要注意的是,在进行集合运算时,要保证操作的对象是集合,即元素无重复且无序。
一般情况下,集合运算允许空集的存在,即不含任何元素的集合。
最后,集合运算交并差是集合理论中重要的概念,它们在数学和计算机科学中都有广泛的应用。
实验报告实验课程:数据结构实验项目:实验一集合的并交差运算专业:计算机科学与技术班级:姓名:学号:指导教师:目录一、问题定义及需求分析(1)实验目的(2)实验任务(3)需求分析二、概要设计:(1)抽象数据类型定义(2)主程序流程(3) 模块关系三、详细设计(1)数据类型及存储结构(2)模块设计四、调试分析(1)调试分析(2)算法时空分析(3)经验体会五、使用说明(1)程序使用说明六、测试结果(1)运行测试结果截图七、附录(1)源代码一、问题定义及需求分析(1)实验目的设计一个能演示集合的并、交、差运算程序。
(2)实验任务1)采用顺序表或链表等数据结构。
2)集合的元素限定为数字和小写英文字母。
(3)需求分析:输入形式为:外部输入字符串;输入值限定范围为:数字和小写英文字母;输出形式为:字符集;程序功能:计算两个集合的交、并、差以及重新输入集合功能;二、概要设计:(1)抽象数据类型定义:线性表(2)主程序流程:调用主菜单函数初始化两个线性表作为集合给两个集合输入数据输出集合数据元素信息另初始化两个线性表创建选择功能菜单界面通过不同选项调用不同功能函数在每个功能函数里面加结束选择功能,实现循环调用功能菜单计算完毕退出程序;(3)模块关系:差运算并运算交运算新建集合结束/返回结束三、详细设计抽象数据类型定义:typedef struct{ElemType *elem;int length;int listsize;}SqList;存储结构:顺序表;模块1-在顺序表的逻辑为i的位置插入新元素e的函数;算法如下:/**在顺序表的逻辑为i的位置插入新元素e的函数**/Status ListInsert_Sq(SqList &L,int i,ElemType e){ElemType *newbase,*p,*q;if(i < 1 || i > L.length + 1) return 0; //i的合法值为(1 <= i <= L.length_Sq(L) + 1)if(L.length >= L.listsize){ //当前储存空间已满,增加分配newbase = (ElemType *)realloc(L.elem,(L.listsize + LISTINCREMENT) * sizeof(ElemType));if(!newbase) exit(-1); //储存分配失败L.elem = newbase; //新基址L.listsize += LISTINCREMENT; //增加储存容量}q = &(L.elem[i - 1]); //q为插入位置for(p = &(L.elem[L.length - 1]); p >= q; --p)(p + 1) = p; //插入位置及之后的元素往右移q = e; //插入e++L.length; //表长加1return 1;}模块二在顺序线性表L中查找第1个与e满足compare()的元素位序,若找到,则返回其在L中的位序,否则返回0算法如下:/**在顺序线性表L中查找第1个与e满足compare()的元素位序,若找到,则返回其在L中的位序,否则返回0**/int LocateElem_Sq(SqList L,ElemType e,Status(* compare)(ElemType,ElemType)){ElemType *p;int i;i = 1; //i的初值为第1个元素的位序p = L.elem; //p的初值为第1个元素的储存位置while(i <= L.length && !(* compare)(*p++,e))++i; //从表L中的第一个元素开始与e比较,直到找到L中与e相等的元素时返回该元素的位置if(i <= L.length) return i; //若i的大小小于表长,则满足条件返回ielsereturn 0; //否则,i值不满足条件,返回0}模块三集合交运算算法如下:/**求集合的交集的函数**/void Mix_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length = 0; //将表Lc的长度设为0for(i = 1; i <= La.length; i++){ //依次查看表La的所有元素elem = La.elem[i-1]; //将表La中i位置的元素赋值给elemif(LocateElem_Sq(Lb,elem,Equal)) //在表Lb中查找是否有与elem相等的元素ListInsert_Sq(Lc,Lc.length+1,elem); //将表La与Lb 中共同的元素放在Lc中}}模块四集合并运算算法如下:/**求集合的并集的函数**/void Union_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length=0; //将表Lc的长度初设为0for(i = 0; i < La.length; i++) //先将表La 的元素全部复制到表Lc中Lc.elem[Lc.length++]=La.elem[i];for(i = 1; i <= Lb.length; i++){elem = Lb.elem[i-1]; //依次将表Lb 的值赋给elemif(!LocateElem_Sq(La,elem,Equal)) //判断表La 中是否有与elem相同的值ListInsert_Sq(Lc,Lc.length+1,elem); //若有的话将elem放入表Lc中}}模块五集合的差运算算法如下:/**求集合的差集函数**/void Differ_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length = 0;for(i = 1; i <= La.length; i++){elem = La.elem[i-1]; //把表La 中第i个元素赋值给elemif(!LocateElem_Sq(Lb,elem,Equal)) //判断elem在表Lb中是否有相同的元素ListInsert_Sq(Lc,Lc.length+1,elem); //若有,则把elem放入表Lc中,否则,就不存放}for(i = 1; i <= Lb.length; i++){elem = Lb.elem[i-1]; //把表Lb 中第i个元素赋值给elemif(!LocateElem_Sq(La,elem,Equal)) //判断elem在表La中是否有相同的元素ListInsert_Sq(Lc,Lc.length+1,elem); //若有,则把elem放入表Lc中,否则,就不存放}}四、调试分析问题分析及解决:首先,在编写程序时没有设置线性表的初始长度,导致集合元素输入错误;然后通过#define LIST_INIT_SIZE 100和#define LISTINCREMENT 10解决;时空分析:int LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))时间复杂度为O(n);Status ListInsert_Sq(SqList &L,int i,ElemType e) 时间复杂度为O(n);void Union_Sq(SqList La,SqList Lb,SqList &Lc) 时间复杂度为O(m*n);void Mix_Sq(SqList La,SqList Lb,SqList &Lc) 时间复杂度为O(m*n);void Differ_Sq(SqList La,SqList Lb,SqList &Lc) 时间复杂度为O(2*m*n);改进设想:当同时求两个以上的结合间的运算是需要先进性两个集合间的运算,然后在于另外的集合进行运算;若要同事进行多个集合的运算需要建立多个顺序表;经验体会:顺序表使用起来比较简单,但长度不可随意变化,适用于大量访问元素,而不适用于大量增添和删除元素;在内存中存储地址连续;五、使用说明第一步:点击运行按钮;第二步: 根据提示输入集合A(可以连续输入,只限输入小写字母和数字);第三步:程序自动显示输入结果;第四步:输入集合B(同第二步);第五步:跳出主菜单界面;第六步:根据选项输入对应运算项的数字序号;第七步:显示运算结果,并可继续进行选择运算还是退出;第八步:若继续运算则返回主菜单,否则退出;第九步:循环第六、七、八步,直至选择退出;六、测试结果输入界面:并运算结果:交运算结果:差运算结果:重新建立集合并运算:七、附录#include<stdio.h>#include<stdlib.h>#define LIST_INIT_SIZE 100//初始表空间大小#define LISTINCREMENT 10//表长增量typedef int Status; /**Status是函数类型**/typedef char ElemType;/*ElemType类型根据实际情况而定,这里假设为char*/typedef struct{ElemType *elem; /**储存空间基地址**/int length; /**当前长度**/int listsize;/**当前分配的储存容量(以sizeof(Elemtype)为单位)**/}SqList;SqList La,Lb,Lc,Ld;/**定义全局变量**//**构造一个空的线性表L**/Status InitList_Sq(SqList &L){L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));if(!L.elem) exit(-1); /**储存分配失败**/L.length = 0;L.listsize = LIST_INIT_SIZE;/**初始储存容量**/return 1;}/**在顺序表的逻辑为i的位置插入新元素e的函数**/Status ListInsert_Sq(SqList &L,int i,ElemType e){ElemType *newbase,*p,*q;if(i < 1 || i > L.length + 1)return 0;if(L.length >= L.listsize)//当前储存空间已满,增加分配{newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT )*sizeof(ElemType));if(!newbase) exit(-1);//储存分配失败L.elem = newbase;L.listsize += LISTINCREMENT;//增加储存容量}q = &(L.elem[i - 1]);//q为插入位置for(p = &(L.elem[L.length - 1]); p >= q; --p)*(p + 1) = *p;//插入位置及之后的元素往右移*q = e;//插入e++L.length;return 1;}/**创建一个线性表,输入数据**/void CreateList_Sq(SqList &L){ElemType ch='\0';int inlist =0,j;while((ch) != '\n'){scanf("%c",&ch);//输入数据for(j = 0; j < L.length; j++)if(ch == L.elem[j])//判断表L中是否有与ch相等的元素 {inlist = 1; //若有,则inlist置1break; //跳出本轮循环}elseinlist =0; //否则inlist为0if(!inlist && ch != '\n')//若inlist为0且ch不为”\n” ListInsert_Sq(L,L.length+1,ch);//则将ch存入表L中 }}/*判断两元素是否相等,若相等则返回1;否则返回0*/Status Equal(ElemType a,ElemType b){if(a == b)return 1;//相等,返回1elsereturn 0;//否则,返回0}/*在顺序线性表L中查找第1个与e满足compare()的元素位序,若找到,则返回其在L中的位序,否则返回0*/int LocateElem_Sq(SqList L,ElemType e,Status(* compare)(ElemType,ElemType)){ElemType *p;int i;i = 1;p = L.elem;//p的初值为第1个元素的储存位置while(i <= L.length && !(* compare)(*p++,e))//循环查找表L 找出其中与e相等的元素的位置++i;if(i <= L.length)//若i小于表长return i;//则i满足条件,返回i的值elsereturn 0;//否则返回0}/*销毁线性表的函数*/Status Clear_Sq(SqList &L){ElemType elem;free(L.elem);L.elem = NULL;return 1;}/*打印顺序表函数*/void Print_Sq(SqList L){int i;for(i = 0; i < L.length; i++)printf("%2c",L.elem[i]);//通过for循环将表元素全部输出 if(L.length == 0) printf("空集");//若表长为0,则输出空表 printf("\n\t\t\t此集合中的个数 n = %d\n\n",L.length);}/*求集合的并集的函数*/void Union_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length=0; //将表Lc的长度初设为0for(i = 0; i < La.length; i++) //先将表La的元素全部复制到表Lc中Lc.elem[Lc.length++]=La.elem[i];for(i = 1; i <= Lb.length; i++){elem = Lb.elem[i-1]; //依次将表Lb 的值赋给elemif(!LocateElem_Sq(La,elem,Equal)) //判断表La 中是否有与elem相同的值ListInsert_Sq(Lc,Lc.length+1,elem); //若有的话将elem放入表Lc中}}/*求集合的交集的函数*/void Mix_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length = 0; //将表Lc的长度设为0for(i = 1; i <= La.length; i++){ //依次查看表La的所有元素elem = La.elem[i-1]; //将表La中i位置的元素赋值给elemif(LocateElem_Sq(Lb,elem,Equal)) //在表La中查找是否有与elem相等的元素ListInsert_Sq(Lc,Lc.length+1,elem); //将表La与Lb中共同的元素放在Lc中}}/*求集合的差集函数*/void Differ_Sq(SqList La,SqList Lb,SqList &Lc){int i;ElemType elem;Lc.length = 0;for(i = 1; i <= La.length; i++){elem = La.elem[i-1]; //把表La中第i个元素赋值给elemif(!LocateElem_Sq(Lb,elem,Equal)) //判断elem在表Lb中是否有相同的元素ListInsert_Sq(Lc,Lc.length+1,elem);//若有,则把elem放入表Lc中,否则,就不存放}for(i = 1; i <= Lb.length; i++){elem = Lb.elem[i-1]; //把表Lb中第i个元素赋值给elem if(!LocateElem_Sq(La,elem,Equal)) //判断elem在表La中是否有相同的元素ListInsert_Sq(Lc,Lc.length+1,elem); //若有,则把elem放入表Lc中,否则,就不存放}}void Index_Sq(){//主菜单函数char s;int l=1;InitList_Sq(La);//初始化表Laprintf("\n\t\t 请输入集合A:");CreateList_Sq(La);//创建表Laprintf("\t\t\t集合A为");Print_Sq(La);printf("\n\n");InitList_Sq(Lb);//初始化表Lbprintf("\t\t 请输入集合B:");CreateList_Sq(Lb);//创建表Lbprintf("\t\t\t集合B为");Print_Sq(Lb);printf("\n\n");InitList_Sq(Lc);//初始化表LcInitList_Sq(Ld);//初始化表Ldwhile(l){printf("\t\t ******* 请输入您的操作选项 1、2、3、4. ****** \n\n");printf("\t\t 1、进行集合的并运算\n");printf("\t\t 2、进行集合的交运算\n");printf("\t\t 3、进行集合的差运算\n");printf("\t\t 4、重新建立两个集合\n");printf("\t\t\t");scanf("%c",&s);switch(s){case '1' : system("cls");Union_Sq(La,Lb,Lc);//调用集合的并运算函数printf("\t\t\t集合A与集合B的并集为:");print_Sq(Lc);printf("\n");break;case '2' :system("cls");Mix_Sq(La,Lb,Lc);//调用集合的交集运算函数printf("\t\t\t集合A与集合B的交集为:");print_Sq(Lc);printf("\n");break;case '3' : system("cls");Differ_Sq(La,Lb,Lc);//调用集合的差集运算函数 printf("\t\t\t集合A与集合B的差集为:");print_Sq(Lc);printf("\n");break;case '4' :system("cls");Clear_Sq(La);//销毁表LaClear_Sq(Lb);//销毁表LbClear_Sq(Lc);//销毁表LcClear_Sq(Ld);//销毁表Ldgetchar();Index_Sq();//递归调用此函数break;default : printf("\t\t\t#\tenter data error!\n");printf("\n");}printf("\t\t 继续计算请输入1,停止计算请输入0 \n");printf("\t\t\t");scanf("%d",&l);getchar();system("cls");}printf("\n\t\t**************** 谢谢使用!*****************\n");}int main(){printf("\t\t************* 欢迎使用集合操作运算器************\n");Index_Sq();//调用主菜单函数return 0;}。
集合的并、交和差运算题目:编制一个演示集合的并、交和差运算的程序班级:姓名:学号:完成日期:一、需求分析1.本演示程序中,集合的元素限制在小写字母‘a’-‘z’之间。
集合的大小不限制,集合的输入形式为一个以“回车符”为结束标志的字符串,串中字符顺序不限,且允许出现重复字符或非法字符,程序运用时自动过滤去,输出的运算结果中将不含重复字符和非法字符。
2.演示程序以用户和计算机对话的形式进行,即在计算机终端中显示提示信息之后,有用户自行选择下一步命令,相应输入数据和运算结果在其后显示。
3.程序的执行命令有:1)选择操作2)任意键清屏4.数据测试(1)Set1=”magazine”, Set2=’paper”,Set1∪Set2=”aegimnprz”,Set1∩Set2=”ae”,Set1-Set2=”gimnz”;(2) Set1=”012oper4a6tion89”,Set2=”error data”,Set1∪Set2=”adeinoprt”,Set1∩Set2=”aeort”, Set1-Set2=”inp”.二、概要设计为实现上述功能,需要顺序表这个抽象数据类型。
1.顺序表抽象数据类型定义ADT sqlist{数据对象:D={ai|a i∈Elemset,i=1,2,3,…n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2, … n}基本操作:InitList(&l)操作结果:构造一个空的顺序表l。
ListLength(l)初始条件:顺序表l已存在。
操作结果:返回l中的元素个数。
ListInsert_Sq(&L, i, e)初始条件:顺序表l已存在。
操作结果:在l中第i个元素前面插入元素e。
CreatSqList(&l, a[],n)初始条件:顺序表l已存在。
操作结果:将数组a[n]每个元素赋给顺序表l。
GetElem(L, i, &e)初始条件:顺序表l已存在。
集合的交并集速算口诀(不含参数型)
集合的交集速算口诀:
1.相同元素的交集是该元素本身。
2.集合中不相同元素的交集为空集。
示例1:求集合{1,2,3}和{2,3,4}的交集。
解:根据口诀1,2是交集的元素,3是交集的元素,因此交集为
{2,3}。
示例2:求集合{1,2,3}和{4,5,6}的交集。
解:根据口诀2,集合中没有相同元素,因此交集为空集。
集合的并集速算口诀:
1.相同元素的并集是该元素本身。
2.集合中不相同元素的并集是集合的并。
示例1:求集合{1,2,3}和{2,3,4}的并集。
解:根据口诀1,1是并集的元素,2是并集的元素,3是并集的元素,4是并集的元素,因此并集为{1,2,3,4}。
示例2:求集合{1,2,3}和{4,5,6}的并集。
解:根据口诀2,集合中没有相同元素,因此并集为{1,2,3,4,5,6}。
综合示例:求集合{1,2,3}、{2,3,4}和{3,4,5}的交集和并集。
解:首先求交集。
根据交集速算口诀,3是交集的元素,因此交集为{3}。
然后求并集。
根据并集速算口诀,1是并集的元素,2是并集的元素,3是并集的元素,4是并集的元素,5是并集的元素,因此并集为
{1,2,3,4,5}。
集合的交集与并集运算集合是数学中的一种基本概念,用于表示一组具有共同特征的对象的结合体。
在集合的运算中,交集与并集是两个重要的操作。
本文将围绕集合的交集与并集运算展开讨论。
1. 交集运算交集运算是指将多个集合中共同拥有的元素提取出来形成一个新的集合。
记作A∩B,表示集合A与集合B的交集。
例如,设有集合A={1,2,3,4},集合B={3,4,5,6},则A∩B={3,4}。
这意味着集合A与集合B中,只有元素3和元素4同时存在于两个集合中。
交集运算的特点:(1)交换律:A∩B = B∩A。
即,两个集合的交集不受集合的顺序影响。
(2)结合律:(A∩B)∩C = A∩(B∩C)。
即,多个集合的交集按任意顺序进行运算,结果不变。
(3)分配律:A∩(B∪C) = (A∩B)∪(A∩C)。
即,集合的交集与并集的运算可以相互分配。
2. 并集运算并集运算是指将多个集合中的所有元素合并到一个新的集合中。
记作A∪B,表示集合A与集合B的并集。
例如,设有集合A={1,2,3},集合B={3,4,5},则A∪B={1,2,3,4,5}。
这意味着集合A与集合B中的所有元素组成了一个新的集合。
并集运算的特点:(1)交换律:A∪B = B∪A。
即,两个集合的并集不受集合的顺序影响。
(2)结合律:(A∪B)∪C = A∪(B∪C)。
即,多个集合的并集按任意顺序进行运算,结果不变。
(3)分配律:A∪(B∩C) = (A∪B)∩(A∪C)。
即,集合的并集与交集的运算可以相互分配。
需要注意的是,交集与并集运算的结果仍然是一个集合,并且不重复计算元素。
例如,在集合A={1,2,3},集合B={2,3,4}的交集运算中,元素2和元素3只会计算一次。
综上所述,交集与并集运算是集合运算中的两个重要操作。
它们在解决实际问题中具有广泛的应用,能够帮助我们准确描述集合中的共同元素或合并多个集合的元素。
在数学推理和逻辑推演中,交集与并集的概念也是不可或缺的。
集合的并交差集运算的设计青岛理工大学C++面向对象课程设计报告院(系): 计算机工程学院专业: 计算机科学与技术学生姓名: 刘文泽班级计算133 学号: 201207091 题目: 集合的并、交、差集运算的设计,,,,,起迄日期: ,2015.6.29,2015.7.10设计地点: 计算机学院机房指导教师: 巩玉玺、林孟达完成日期: 2015 年7月 10 日目录一、需求分析1. 选做此课题或项的目的2. 程序所实现的功能3. 问题解决方案二、内容设计1. 根据所选题目,给出模块图2. 编写程序关键代码三、调试分析1. 实际完成的情况说明2. 程序的性能分析。
3. 上机过程中出现的问题及其解决方案4. 程序中可以改进的地方说明。
四、用户手册五、设计总结六、参考文献七、附录一、需求分析1.选做此课题或项的目的用c++实现集合的并、交、差集运算。
2.程序所实现的功能(1)用户能够输入两个集合元素;(2)能够额按成集合的交、并、差运算; (3)集合的元素类型可以为整数、字符串和小数。
(4)输入运算结果。
(5)使用链表来表示集合,完成集合的合并,求交集等。
3、问题解决方案根据系统功能需求,可以将问题解决分为以下步骤: (1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;(2)分析系统中的各个实体及他们之间的关系; (3)根据问题描述,设计系统的类层次; (4)完成类层次中各个类的描述;(5)完成类中各个成员函数的定义;1二、内容设计1.根据所选题目,给出模块图通过对系统功能的分析,集合交并差系统功能如图所示:(一) 集合的交集运算:分析:首先输出集合1与集合2的元素,然后输出集合1与集合2中相同的元素。
流程图如图所示:(二) 集合的并集运算:分析:首先输出集合1与集合2的元素,然后输出集合1与集合2中的全部元素。
流程图如图所示:2(三)差集的运算首先输出集合1减去集合2的结果,然后输出集合2减去集合1中的结果。
集合的交并差班级:网工一班姓名:陈小龙学号:14051113题目:编写一个演示集合的交并差运算的计算机程序一、需求分析1. 本次实验中要求输入的集合的元素类型为小写字母a到z,集合输入结束的标志是以“回车符”为标志的,集合的输入不限字符输入的顺序且允许重复输入和输入非法字符。
2. 本次实验中输出的集合中不包含重复的元素,集合中的元素按ASCII从小到大排列输出且将自动过滤输入的非法字符。
3. 本次实验的程序可以计算用户输入的两个集合的交集、并集和补集;4. 本次实验的测试数据有:输入的集合为Set1=“magazine”,Set2=“paper”,输出的集合为并集为“aegimnprz”, 交集为“ae”, 差集为“gimnz”;输入的集合为 Set1=“012oper4a6tion89”,Set2=”error data”,输出的集合为并集为“adeinoprt”,并集为“aeort”,差集为“inp”。
二、概要设计为实现上述程序的功能,用有序链表表示集合。
因此,需要有两个抽象数据类型:有序表和集合。
1. 有序表的抽象数据类型定义:ADT OrderedList{数据对象:D={ai|ai∈CharSet,i=1,2...,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,ai-1<ai,i=2...n}基本操作:void shuru(jihe head)操作结果:建立一个链表,把集合的元素储存在链表中。
void shuchu(jihe head)操作结果:链表head已存在,把链表的元素按照顺序输出来。
void bing(jihe head1, jihe head2, jihe head3)操作结果:已知链表head1,head2,head3,用head1,head2比较,把head1,head2中所有的元素用head3输出来,去掉重复的数。
void jiao(jihe head1, jihe head2, jihe head3)操作结果:已知链表head1,head2,head3,用head3输出head1,head2中共有的元素。
void cha(jihe head1, jihe head2, jihe head3)操作结果:已知链表head1,head2,head3,用head3输出head1中有的但head2中没有元素。
}ADT OrderedList2.程序包含两个模块One:函数模块,用于操作链表,进行链表的初始化,集合的交,并,差运算。
Two:主程序Int main{空链表的建立,选择变量的建立do{接受命令处理命令}while(命令或退出)}三.详细设计1.元素类型,结点类型和指针类型typedef struct LNode //定义结构体类型指针{char data;struct LNode*next; //结点类型,指针类型}*jihe;void shuru(jihe head) //定义输入集合函数{jihe p; //定义一个结点char tmp; //定义一个字符型变量用于输入集合元素scanf("%c",&tmp);while(tmp!='\n') //直到输入不是回车键为止{p=(jihe)malloc(sizeof(struct LNode)); //分配空间p->data=tmp;p->next=head->next;head->next=p;scanf("%c",&tmp);}}void shuchu(jihe head) //定义输出集合函数{jihe p; //定义一个结点p用于输出集合head里的元素p=head->next;while(p!=NULL){printf("%c",p->data);p=p->next;}printf("\n");}void bing(jihe head1, jihe head2, jihe head3) //定义集合的并集函数//{jihe p1,p2,p3; //p1用于遍历第一个集合,p2用于遍历第二个集合,p3用于生成第三个集合的元素p1=head1->next;while(p1!=NULL) //遍历第一个集合,把第一个集合的元素放入第三个集合里{p3=(jihe)malloc(sizeof(struct LNode));p3->data=p1->data;p3->next=head3->next;head3->next=p3;p1=p1->next;}p2=head2->next;while(p2!=NULL) //遍历第二个集合,用第一个集合比较,把第二个集合里没有的元素放在第三个集合里{p1=head1->next;while((p1!=NULL)&&(p1->data!=p2->data)) //p1不为空且不等于p2的数据执行p1=p1->next;if(p1==NULL){p3=(jihe)malloc(sizeof(struct LNode));p3->data=p2->data;p3->next=head3->next;head3->next=p3;}p2=p2->next;}}void jiao(jihe head1, jihe head2, jihe head3) //定义集合的交集函数//{jihe p1,p2,p3;p1=head1->next;while(p1!=NULL) //遍历第一个集合第二个集合{p2=head2->next;while((p2!=NULL)&&(p2->data!=p1->data)) //查找两者共有的元素放入第三个链表里p2=p2->next;if((p2!=NULL)&&(p2->data==p1->data)){p3=(jihe)malloc(sizeof(struct LNode));p3->data=p1->data;p3->next=head3->next;head3->next=p3;}p1=p1->next;}}void cha(jihe head1, jihe head2, jihe head3) //定义集合的差集函数{jihe p1,p2,p3;p1=head1->next;while(p1!=NULL) //遍历第一个集合和第二个集合{p2=head2->next;while((p2!=NULL)&&(p2->data!=p1->data))p2=p2->next; //行第二个集合得下个元素if(p2==NULL){p3=(jihe)malloc(sizeof(struct LNode));p3->data=p1->data; //把查找出来的第一个集合里的元素放入第三个链表中p3->next=head3->next;head3->next=p3;}p1=p1->next;}}int main() //主函数{int x;printf("(输入数据,按回车键结束,第一个集合大于第二个集合)\n");jihe head1,head2,head3; //建立三个头结点创建三个空链表两个输入初始链表第三个用于储存操作过后的新链表head1=(jihe)malloc(sizeof(struct LNode));head1->next=NULL;head2=(jihe)malloc(sizeof(struct LNode));head2->next=NULL;head3=(jihe)malloc(sizeof(struct LNode));head3->next=NULL;printf("请输入集合1:\n");shuru(head1); //调用输入集合函数printf("请输入集合2:\n");shuru(head2); //调用输入集合函数A:printf("1.并集2.交集3.差集4.结束\n"); //选择语句do{printf("请选择序号\n"); //选择语句的循环scanf("%d",&x);switch(x){case 1:printf("两集合的并是\n");bing(head1,head2,head3); //调用并集函数shuchu(head3);head3->next=NULL;break;case 2:printf("两集合的交是\n");jiao(head1,head2,head3); //调用交集函数shuchu(head3);head3->next=NULL;break;case 3:printf("两集合的差是\n");cha(head1,head2,head3); //调用差集函数shuchu(head3);head3->next=NULL;break;case 4:break;default:goto A;}}while(x!=4); //x=4 循坏结束程序执行完}。