C++集合类
- 格式:doc
- 大小:58.00 KB
- 文档页数:8
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"); //清屏}} //~。
c语言有集合类型和逻辑类型一、集合类型集合类型是指能够存储多个数据元素的数据结构。
在C语言中,集合类型主要有数组和结构体。
1. 数组数组是一种由相同类型的元素组成的集合类型。
通过下标来访问数组中的元素,下标从0开始。
例如,int型数组intArray可以定义为:int intArray[10],表示可以存储10个整数的数组。
数组的优点是可以快速访问元素,但缺点是其大小固定,不易扩展。
此外,数组中的元素必须具有相同的数据类型。
2. 结构体结构体是一种由不同类型的元素组成的集合类型。
通过成员运算符"."来访问结构体中的元素。
例如,可以定义一个表示学生信息的结构体student,包含学生的姓名、年龄和成绩等信息。
结构体的优点是可以存储不同类型的数据,方便表示复杂的数据结构。
但结构体的缺点是访问元素相对较慢,需要通过成员运算符来访问。
二、逻辑类型逻辑类型是指能够表示真假或是非零和零的数据类型。
在C语言中,逻辑类型主要有布尔类型bool。
1. 布尔类型布尔类型是一种逻辑类型,用来表示真假或是非零和零。
在C语言中,布尔类型用关键字bool表示,true表示真,false表示假。
布尔类型在条件判断和循环中经常使用,例如if语句可以根据条件的真假执行不同的代码块。
逻辑类型的优点是可以方便地表示真假和非零和零,简化了条件判断和循环的编写。
但逻辑类型的取值只有两个,不适合表示更复杂的逻辑关系。
集合类型和逻辑类型是C语言中重要的数据类型。
集合类型可以用来存储多个相同或不同类型的数据,方便表示复杂的数据结构;逻辑类型可以表示真假或非零和零,简化了条件判断和循环的编写。
在实际编程中,我们可以根据需要选择合适的数据类型来处理数据。
C++基础class、struct、union详细⽬录1、类class2、结构体struct3、共⽤体union1、类class类是⾯向对象中的特性,在c中是没有类的概念。
通常⽤class来表⽰,cpp中有抽象类,但是没有接⼝这种说法,cpp⽀持多继承。
⼀个普通的类:class Fruit{private:public:Fruit();~Fruit();};Fruit::Fruit(){}Fruit::~Fruit(){}构造函数和析构函数:其中Fruit()表⽰构造函数,~Fruit()表⽰析构函数。
构造函数⽤来创建对象,设置初始化参数。
析构函数在对象销毁的时候执⾏。
修饰符:private:表⽰私有成员,外部不可访问,只有⾃⾝类和友元函数可以访问。
public:表⽰公共成员,外部可以访问。
protected:表⽰保护成员,保护成员和私有成员相似,但是⼦类可以访问保护成员。
类中的成员函数:我们在类中创建函数的时候,可以直接初始化,或者在类外部实现:class Fruit{private:int count;public:Fruit();~Fruit();void add(int i);//直接初始化int getCount(){return count;}};Fruit::Fruit(){cout << "create fruit" << endl;}Fruit::~Fruit(){cout <<"fruit deleted"<<endl;}//在类外部实现void Fruit::add(int i){count = count + i;}友元函数:友元函数虽然可以在类中定义,但是它不属于类的成员函数,必须在类外部实现。
它可以访问定义类中的private和protected成员。
友元类:友元类中的所有函数都是该类的友元。
C++简单集合类的实现⽅法来⾃于C++程序设计的⼀个题⽬。
实现⼀个集合类,要求实现以下4个操作。
1.向集合中添加元素,如果集合中已存在元素则不添加2.从集合中移除元素,移除之前需要先判断集合中元素是否存在3.重载+运算符,⽤以实现集合的求并集运算4.重载*运算符,⽤以实现集合的求交集运算1.类的整体设计该问题需要模拟实现集合类,我们可以使⽤数组来模拟集合,于是使⽤int items[100]⽤来存放集合中的数据。
为了实现数组的遍历,这就需要⼀个整数⽤来表⽰数组中元素的个数,于是使⽤int number来表⽰数组中元素的个数;此外,为了实现题⽬的需求,设计以下四个函数:1).使⽤add_item(int item)成员函数向数组中添加元素2).使⽤remove_item(int item)成员函数向数组中移除元素3).重载operator+表⽰集合的求并集运算4).重载operator*表⽰集合的求交集运算由于向集合添加元素之前,必须确保集合中不存在该元素;在从集合中移除元素之前,必须确保集合中存在该元素,因此添加is_exist(int item)⽅法⽤以判断集合中是否存在这个元素;此外为了显⽰集合,添加display()⽅法, 基本设计如下:class Set{public:int items[100]; //定义⼀个数组作为容器存放100个集合元素int number; //定义数字i表⽰集合中元素的个数//构造函数和析构函数Set() {this->number = 0;memset(this->items,0,sizeof(items));}//初始化⽅法int init(int items[], int num);//添加元素bool add_item(int item);//删除元素bool remove_item(int item);//求集合的并集Set operator+ (Set set2);//求集合的交集Set operator* (Set set2);//显⽰集合元素int display();//判断集合当中是否存在item,返回元素在集合中的位置,不存在返回-1int is_exist(int item);};2.构造函数Set() {this->number = 0;memset(this->items,0,sizeof(items));}在构造函数中,我们对数组进⾏初始化,声明完数组之后,如果不进⾏初始化,数组元素是随机值,在C语⾔中,变量不进⾏初始化都会被分配随机值。
集合的概念在数学中,我们把具有某些共同特征的元素构成的一个整体称为集合.一个集合就是由同一种有序类型的一组数据元素所组成的,这一种有序类型称为该集合的基类型.课堂练习:设计一个集合类numSet,存放有序的整型数序,其中的元素按从小到大的顺序排列并且不包含相同的元素,要求:1)向数序中添加元素(过滤重复数据)并保持有序2)从数序中查找数据元素并删除分析:数据成员: int count; //数序中元素的个数int a[MAX]; //存放数序的数组成员函数: void addnum(int n); //向有序数组中添加元素v0id delenum(int n); //从有序数组中查找元素并删除numSet( ) {count=0;} //构造函数void disp ( ); //输出有序数组测试数据:numSet set1,set2;set1.addnum(3);set1.addnum(2);set1.addnum(1);set1.disp( );set1.delenum(2);set1.disp( );3)求两个整数数序的合并数序分析:增加友元函数:friend numSet unionset(numSet &s1, numSet &s2);返回s1与s2合并的结果即:S={ s1,s2}s1: i=0 i<count i++s2: j=0 j<count j++s1.a[i] 与 s2.a[j] 比较确定添加顺序例:set3=unionset(set1,set2);set1: {1,2,3}set2: {2,4,5,6}set3: {1,2,3,4,5,6}#include <iostream>using namespace std;const int MAX=20;class Numset{friend Numset unionset(Numset &s1,Numset &s2); //合并数序s1和s2 int count;int a[MAX];public:Numset(){count=0;}void addnum(int n){int i=0,j;while(i<count)if(n>a[i]) i++;else break;//条件合并可简化逻辑 while(i<count&&n>a[i]) i++;if(n==a[i]) return;for(j=count;j>i;j--)a[j]=a[j-1];a[i]=n;count++;}void disp(){for(int i=0;i<count;i++)cout<<a[i]<<" ";cout<<endl;}int geti(int i) {return a[i];}};Numset unionset(Numset &s1,Numset &s2){Numset s;int i=0,j=0;while(i<s1.count&&j<s2.count){int v1=s1.a[i];int v2=s2.a[j];if(v1<v2) {s.addnum(v1); i++;}else if(v1>v2){s.addnum(v2);j++;}else {s.addnum(v1);i++;j++;}}while(i<s1.count){int v1=s1.a[i];s.addnum(v1);i++;}while(j<s2.count){int v2=s2.a[j];s.addnum(v2);j++;}return s;}int main(){Numset set1,set2,set3;set1.addnum(1);set1.addnum(3);set1.addnum(2);set1.addnum(6);cout<<"数序一为:"<<endl;set1.disp();set2.addnum(3);set2.addnum(5);set2.addnum(7);set2.addnum(4);cout<<"数序二为:"<<endl;set2.disp();set3=unionset(set1,set2);cout<<"数序一与数序二合并为:";set3.disp();return 0;}练习1、要求:定义一个集合类,要求:(1) 集合中的元素可用数组存放,也可用链表存放,参考提示:用数组存放时,集合中数据成员①元素个数②数组(定义时用最大值) 用链表存放时,集合中数据成员①元素个数②*指针(定义时指向结点类型)(2) 构造函数要求:能够通过从键盘上输入数据的形式,给集合中各元素赋值(3) 要求能实现显示集合中元素个数(4) 能显示集合中的元素(5) 能向集合中增加元素(6) 能从集合中删除元素(7) 能实现两个集合的+(U)相并(8) 能实现两个集合的×( )相交(8) 能实现两个集合的(差集)(9)在主函数中实现上述功能(创建对象,输入集合中元素,显示元素及个数,能增、删元素,实现集合并、交、差)练习2要求:设计一个集合类Set,并重载运算符+、-以分别实现集合的并、差操作。
C语言是一种广泛应用的计算机程序设计语言,它具有高效、灵活、可移植等特点,因此在计算机科学领域被广泛应用。
本篇文章将探讨在C语言中如何求集合的并集、交集和差集运算。
一、集合的概念集合是数学中重要的概念,它是由元素组成的无序的集合体。
在计算机科学中,我们常常需要对集合进行各种操作,比如求并集、交集、差集等。
二、集合的表示方法在C语言中,我们可以使用数组来表示集合。
数组是一种非常基础的数据结构,它由相同类型的元素组成的有序集合。
我们可以通过定义数组来表示一个集合,并通过遍历数组来进行各种集合运算。
三、集合的并集运算集合A和集合B的并集运算是指将A和B中的所有元素放在一起组成一个新的集合。
在C语言中,我们可以通过遍历两个数组,将它们的元素放在一个新的数组中即可实现并集运算。
下面是C语言中求两个集合的并集运算的示例代码:```#include <stdio.h>int m本人n() {int setA[] = {1, 2, 3, 4, 5};int setB[] = {3, 4, 5, 6, 7};int setSize = 5;int setUnion[10];int unionSize = 0;for (int i = 0; i < setSize; i++) {setUnion[unionSize++] = setA[i]; }for (int i = 0; i < setSize; i++) {int found = 0;for (int j = 0; j < setSize; j++) {if (setB[i] == setA[j]) {found = 1;break;}}if (!found) {setUnion[unionSize++] = setB[i];}}// 输出并集for (int i = 0; i < unionSize; i++) {printf("d ", setUnion[i]);}return 0;}```以上代码中,我们定义了两个集合setA和setB,分别表示集合A和集合B,然后通过遍历这两个数组,将它们的元素放入一个新的数组setUnion中。
C语言集合的实现C语言是一种通用的程序设计语言,提供了丰富的数据结构和算法库。
在C语言中,集合是一种存储不重复元素的数据结构,常用于需要存储、查询和操作一组不同元素的场景。
本文将介绍C语言中集合的实现方式,并详细解释其原理和应用。
1.集合的定义集合是一种不包含重复元素的容器,没有特定的顺序。
在C语言中,可以使用数组或链表等数据结构来实现集合。
集合通常有以下几个基本操作:插入元素、删除元素、判断元素是否存在、求并集、求交集、求差集等。
2.集合的实现方式2.1使用数组实现集合使用数组实现集合比较简单,只需要定义一个固定大小的数组,然后使用元素的值作为下标来标记元素是否存在。
例如,要存储范围在0-9之间的整数集合,可以定义一个大小为10的数组,数组下标代表元素值,数组元素的值用于表示元素是否存在。
下面是使用数组实现集合的示例代码:```c#define SIZE 10//初始化集合void initSet(int set[])for (int i = 0; i < SIZE; i++)set[i] = 0;}//插入元素void insertElement(int set[], int element) if (element >= 0 && element < SIZE)set[element] = 1;}//删除元素void deleteElement(int set[], int element) if (element >= 0 && element < SIZE)set[element] = 0;}//判断元素是否存在int isElementExist(int set[], int element) if (element >= 0 && element < SIZE)return set[element];} elsereturn 0;}//打印集合void printSet(int set[])for (int i = 0; i < SIZE; i++) if (set[i] == 1)printf("%d ", i);}}int maiint set[SIZE];initSet(set);insertElement(set, 1); insertElement(set, 3); insertElement(set, 5); deleteElement(set, 3);printf("集合中的元素为:"); printSet(set);return 0;```这段代码中,先定义了一个大小为10的数组作为集合的存储空间。
c++set用法在C语言中,set是一个常用的数据结构,用于存储不重复元素的无序集合。
它提供了许多有用的操作,如插入、删除和查找元素。
本文将详细介绍c语言的set数据结构及其用法。
一、set数据结构set是一个集合类型,由一组不同的元素组成。
它提供了以下特点:*无序:set中的元素存储在内存中,没有特定的顺序。
*不重复:set中的元素是唯一的,即一个元素只能出现一次。
set可以存储各种类型的数据,如整数、浮点数、字符等。
在使用set之前,需要先定义一个set类型变量或使用标准库中的set类型。
二、set变量定义和初始化要使用set数据结构,需要先定义一个set变量。
可以使用关键字“set”来定义一个set变量,例如:```cset<int>mySet;```上述代码定义了一个名为mySet的set变量,用于存储整数类型的数据。
可以使用以下方式初始化set变量:```cset<int>mySet={1,2,3,4,5};```上述代码将整数1到5依次插入mySet中。
需要注意的是,插入元素时不需要指定类型,因为set会自动将元素转换为相应类型。
三、set操作方法set提供了多种操作方法,包括插入、删除和查找元素等。
以下是常见的set 操作方法及其用法:1.insert()方法:用于向set中插入元素。
语法为“set<int>::insert(value)”,其中value是要插入的元素值。
例如:```cmySet.insert(3);//将整数3插入mySet中```2.erase()方法:用于从set中删除元素。
语法为“set<int>::erase(value)”,其中value是要删除的元素值。
例如:```cmySet.erase(2);//从mySet中删除整数2```3.find()方法:用于查找set中是否存在指定元素。
语法为“set<int>::find(value)”,其中value是要查找的元素值。
1、常⽤C++STL--------集合集合⼀、集合中常见操作函数1、集合的组成集合是由不重复元素组成的,例如{1,2,3},就是由数据1、2、3组成的集合2、集合头⽂件#include<set>using namespace std;3、集合的定义C++定义⼀个集合的语句是:set<T> s,定义了⼀个名为s,存储数据类型为T的集合,初始是空集合,我们可以定义set<int> a,set<string> aa等等4、集合插⼊元素set 使⽤insert向集合中插⼊⼀个新元素,如果元素已经存在,那么这个插⼊是⽆效的,因为集合中不存在重复元素;#include<set>using namespace std;int main(){set<string> country; //{}country.insert("china"); //{"china"}country.insert("American"); //{"china","American"}country.insert("china"); {"china","American"}; //“China”插⼊⽆效return0;}5、集合删除元素集合set使⽤erase从集合中删除⼀个元素,如果集合中不存在这个元素,则不进⾏任何操作#include<set>using namespace std;int main(){set<string> country; //{}country.insert("china"); //{"china"}country.insert("American"); //{"china","American"}country.erase("china"); //{"American";country.erase("china"); //删除“china”⽆效,因为集合中不存在这样的元素return0;}6、集合判断元素是否存在C++如果你想判断⼀个元素是否在集合中存在,可以使⽤count函数,存在返回1,不存在返回0#include<set>using namespace std;int main(){set<string> country; //{}country.insert("china"); //{"china"}country.insert("American"); //{"china","American"}if(country.count("china")){ //判断“china”是否属于countrycout << "china belong to country " << endl;}return0;}7、集合迭代器C++可以通过迭代器来访问各个元素,迭代器的写法是:set<T>::iterator it定义了⼀个指向set<T>的迭代器it,其中T是任意数据类型,::iterator是固定类型begin函数返回容器中起始元素的迭代值,end函数返回容器中尾部元素的迭代值通过*操作可以获取指定的元素,通过++可以获取下⼀个元素,--可以获取上⼀个元素注意:使⽤集合内部是⼀个按照从⼩到⼤有序的状态,所以迭代器在输出的时候是⼀个有序序列#include<set>#include<string>#include<iostream>using namespace std;int main(){set<string> country; //{}country.insert("china"); //{"china"}country.insert("American"); // {"china","American"}for(set<string>::iterator it = country.begin();it != country.end();it++){cout << *it << endl; //通过迭代器输出对象}return0;}8、清空集合内存和元素C++中调⽤clear()函数就可以清空集合元素,同时清空set占⽤的内存C++中调⽤size()函数就可以获取集合元素的个数9、定义重载⼩于的结构体1struct Node{2int x,y;3bool operator<(const Node &rhs) const{ //函数名:operator< rhs:右操作数,定义为⼀个const引⽤运算符重载定义在结构体内部,左操作数就调⽤operator<的对象最后的const函数表⽰不能对其数据成员进⾏修改,同时const对象只能调⽤const成员函数4if(x == rhs.x){5return y < rhs.y;6 }else{7return x < rhs.x;8 }9 }//上⾯重载定义的排序函数,按照x从⼩到⼤排,x相等的时候,按照y从⼩到⼤排。
C#集合交、并、差、去重,对象集合交并差关键词:C# List 集合交集、并集、差集、去重,对象集合、对象、引⽤类型、交并差、List<T>有时候看官⽹⽂档是最⾼效的学习⽅式!⼀、简单集合Intersect 交集,Except 差集,Union 并集int[] oldArray = { 1, 2, 3, 4, 5 };int[] newArray = { 2, 4, 5, 7, 8, 9 };var jiaoJi = oldArray.Intersect(newArray).ToList();//2,4,5var oldChaJi = oldArray.Except(newArray).ToList();//1,3var newChaJi = newArray.Except(oldArray).ToList();//7,8,9var bingJi = oldArray.Union(newArray).ToList();//1,2,3,4,5,7,8,9⼆、对象集合Product[] store1 = {new Product { Name = "apple", Code = 9 },new Product { Name = "orange", Code = 4 }};Product[] store2 = {new Product { Name = "apple", Code = 9 },new Product { Name = "lemon", Code = 12 }};IEnumerable<Product> union =store1.Union(store2,new ProductComparer());IEnumerable<Product> except=store1.Except(store2,new ProductComparer());IEnumerable<Product> intersect=store1.Intersect(store2,new ProductComparer());IEnumerable<Product> distinct=store1.Distinct(store2,new ProductComparer());⼩提⽰:1:IEnumerable<Product> 可以简化为匿名类型 var对⾃⼰去重:var distinct=store1.Distinct(new ProductComparer());相对于别⼈去重var distinct=store1.Distinct(store2,new ProductComparer());2:可以继续进⾏⼀些linq或拉姆达操作var distinct=store1.Distinct(store2,new ProductComparer()).OrderBy(c=>c.Code);原因是引⽤了linq组件:using System.Linq;三、⽐较类的实现public class Product{public string Id {get;set}public string Name { get; set; }public int Code { get; set; }} 1只有⼀个⽐较条件//如果对象存在唯⼀主键,例如:从数据库⾥查询出来的数据存在 IDclass ProductComparer : IEqualityComparer<Product>{// Products are equal if their names and product numbers are equal.public bool Equals(Product x, Product y){//Check whether the compared objects reference the same data.if (Object.ReferenceEquals(x, y)) return true;//Check whether any of the compared objects is null.if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))return false;//Check whether the products' properties are equal.return x.ID == y.ID;// If Equals() returns true for a pair of objects// then GetHashCode() must return the same value for these objects.public int GetHashCode(Product product){//Check whether the object is nullif (Object.ReferenceEquals(product, null)) return0;//Get hash code for the Code field.int hashID = product.ID.GetHashCode();//Calculate the hash code for the product.return hashID;}}2 多个⽐较条件// 如果存在组合主键或组合唯⼀索引,即多个字段组合才能确定唯⼀性。
集合的概念在数学中,我们把具有某些共同特征的元素构成的一个整体称为集合.一个集合就是由同一种有序类型的一组数据元素所组成的,这一种有序类型称为该集合的基类型.课堂练习:设计一个集合类numSet,存放有序的整型数序,其中的元素按从小到大的顺序排列并且不包含相同的元素,要求:1)向数序中添加元素(过滤重复数据)并保持有序2)从数序中查找数据元素并删除分析:数据成员: int count; //数序中元素的个数int a[MAX]; //存放数序的数组成员函数: void addnum(int n); //向有序数组中添加元素v0id delenum(int n); //从有序数组中查找元素并删除numSet( ) {count=0;} //构造函数void disp ( ); //输出有序数组测试数据:numSet set1,set2;set1.addnum(3);set1.addnum(2);set1.addnum(1);set1.disp( );set1.delenum(2);set1.disp( );3)求两个整数数序的合并数序分析:增加友元函数:friend numSet unionset(numSet &s1, numSet &s2);返回s1与s2合并的结果即:S={ s1,s2}s1: i=0 i<count i++s2: j=0 j<count j++s1.a[i] 与 s2.a[j] 比较确定添加顺序例:set3=unionset(set1,set2);set1: {1,2,3}set2: {2,4,5,6}set3: {1,2,3,4,5,6}#include <iostream>using namespace std;const int MAX=20;class Numset{friend Numset unionset(Numset &s1,Numset &s2); //合并数序s1和s2int count;int a[MAX];public:Numset(){count=0;}void addnum(int n){int i=0,j;while(i<count)if(n>a[i]) i++;else break;//条件合并可简化逻辑 while(i<count&&n>a[i]) i++;if(n==a[i]) return;for(j=count;j>i;j--)a[j]=a[j-1];a[i]=n;count++;}void disp(){for(int i=0;i<count;i++)cout<<a[i]<<" ";cout<<endl;}int geti(int i) {return a[i];}};Numset unionset(Numset &s1,Numset &s2){Numset s;int i=0,j=0;while(i<s1.count&&j<s2.count){int v1=s1.a[i];int v2=s2.a[j];if(v1<v2) {s.addnum(v1); i++;}else if(v1>v2){s.addnum(v2);j++;}else {s.addnum(v1);i++;j++;}}while(i<s1.count){int v1=s1.a[i];s.addnum(v1);i++;}while(j<s2.count){int v2=s2.a[j];s.addnum(v2);j++;}return s;}int main(){Numset set1,set2,set3;set1.addnum(1);set1.addnum(3);set1.addnum(2);set1.addnum(6);cout<<"数序一为:"<<endl;set1.disp();set2.addnum(3);set2.addnum(5);set2.addnum(7);set2.addnum(4);cout<<"数序二为:"<<endl;set2.disp();set3=unionset(set1,set2);cout<<"数序一与数序二合并为:";set3.disp();return 0;}练习1、要求:定义一个集合类,要求:(1) 集合中的元素可用数组存放,也可用链表存放,参考提示:用数组存放时,集合中数据成员①元素个数②数组(定义时用最大值) 用链表存放时,集合中数据成员①元素个数②*指针(定义时指向结点类型) (2) 构造函数要求:能够通过从键盘上输入数据的形式,给集合中各元素赋值(3) 要求能实现显示集合中元素个数(4) 能显示集合中的元素(5) 能向集合中增加元素(6) 能从集合中删除元素(7) 能实现两个集合的+(U)相并(8) 能实现两个集合的×( )相交(8) 能实现两个集合的(差集)(9)在主函数中实现上述功能(创建对象,输入集合中元素,显示元素及个数,能增、删元素,实现集合并、交、差)练习2要求:设计一个集合类Set,并重载运算符+、-以分别实现集合的并、差操作。
另外设计一个主函数演示Set的使用。
练习3:设计一个集合类Set,包括将集合置空、添加元素、判断元素是否在集合中、输出集合,以及将集合中元素逆置,另外还有一个拷贝构造函数,并使用一些数据进行测试。
解:Set类包括私有数据成员elems(存放集合元素)、pc(当前元素指针),一个默认构造函数和拷贝构造函数Set(Set &s),另有成员函数empty()(将集合置空)、isempty()(判断集合是否为空)、ismemberof()(判断元素是否在集合中)、add()(添加元素)、print()(输出集合)、reverse(将集合中元素置逆)。
#include<iostream.h>#define Max 100class Set{public:Set(){pc=0;}Set(Set &s); // 对象引用作为参数void empty(){pc=0;}int isempty(){return pc==0;}int ismemberof(int n);int add(int n);void print();void reverse();private:int elems[Max];int pc;};int Set::ismemberof(int n){for(int i=0;i<pc;i++)if(elems[i]==n)return 1;return 0;}int Set::add(int n){if(ismemberof(n))return 1;else if(pc>Max)return 0;else{elems[pc++]=n;return 1;}}Set::Set(Set &p){pc=p.pc;for(int i=0;i<pc;i++)elems[i]=p.elems[i];}void Set::print(){cout<<"{";for(int i=0;i<pc-1;i++)cout<<elems[i]<<",";if(pc>0)cout<<elems[pc-1];cout<<"}"<<endl;}void Set::reverse(){int n=pc/2;for(int i=0;i<n;i++){int temp;temp=elems[i];elems[i]=elems[pc-i-1];elems[pc-i-1]=temp;}}void main(){Set A;cout<<"A是否为空:"; cout<<A.isempty()<<endl;cout<<"A:"; A.print();Set B;for(int i=1;i<=8;i++)B.add(i);cout<<"B:"; B.print();cout<<"5是否在B中:"; cout<<B.ismemberof(5)<<endl;B.empty();for(int j=11;j<20;j++)B.add(j);Set C(B);cout<<"C:"; C.print();C.reverse();cout<<"C逆置"<<endl;cout<<"C:"; C.print();}练习4:要求:输入两个数组,并对元素过滤,实现交,并,差(还可以用混合运算)1.程序中,集合的元素限定为小写字母字符[‘a’..’z’],。
集合输入的形式为一个以“回车符”为结束标志的字符串,串中字符顺序不限,且允许出现重复字符或非法字符,程序应能自动滤去。
输出的运算结果字符串中将不含重复字符或非法字符。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入中的非法字符)和运算结果显示在其后。
3.测试数据(1) L1=”magazine”, L2= “paper”,L1∪L2=”aegimnprz”,L1∩L2=”ae”,L1-L2=”gimnz”;(2) L1=”012oper4a6tion89”,L2=”error data”,L1∪L2=”adeinoprt”,L1∩L2=”aeort”,L1-L2=”inp”。
程序1:struct SET //定义结构{char ch;SET * next;};void display(SET * phead) //phead为链首指针{if(phead==NULL)cout << "空集";elsewhile(phead){cout << phead->ch;phead=phead->next;}cout << endl;};/*———————————————建立链表—————————————————*/SET * build(){SET * ps; //当前节点指针SET * pend; //链尾指针SET * pd; //中间指针SET * head;char tem[20]; //输入存放变量int i;ps=new SET; //开辟堆内存cin.getline(tem,sizeof(tem)); //接收字符串head=NULL;pend=ps;for(i=0;i<20;i++) //输入链表元素{if(tem[i]>='A'&&tem[i]<='z') //过滤非字母元素ps->ch=tem[i];if(head==NULL) //判断链首是否为空{head=ps; //为空则将元素做为链首ps->next=NULL;goto onemore;}pd=head;while(pd){if(pd->ch==ps->ch) goto again; //删除重复的元素,重复则进入下一次循环,不插入pd=pd->next;}{if(head->ch>ps->ch) //插入一个结点{ //若结点比链首小,则该结点成为新链首ps->next=head;head=ps;goto onemore;}else if(pend->chch) //若结点比链尾大,则该结点成为新链尾{pend->next=ps;pend=ps;pend->next=NULL;}else //若比链首大,比链尾小,则与中间元素比较排列{pd=head;while(pd->next&&pd->next->chch)pd=pd->next;ps->next=pd->next;pd->next=ps;}}onemore:ps=new SET;again: continue;}delete ps; //删除psreturn head; //返回链首地址};/*————————————————————建立链表————————————*/。