c++ 求集合的交并补
#include<iostream.h>
#include<windows.h>
#include<iomanip.h>
#include<stdio.h>
#include<fstream.h>
#include<string.h> //线性表的单链表存储结构
typedef struct LNode{
char data;
LNode *next;
}LNode,*LinkList; void CreateList_L(LinkList &L,int n);
void Bing(LinkList La,LinkList Lb,LinkList &Lc); //求并集
void Jiao(LinkList La,LinkList Lb,LinkList &Lc); //求交集
void Cha(LinkList La,LinkList Lb,LinkList &Lc);//求补集
void output(LinkList L);//输出元素 void CreateList_L(LinkList &L,int n)
{
int k,i,flag=1;
char filename[20];
ifstream in; //文件输入流
L=new LNode;
L->next=NULL; //先建立一个带头结点的单链表
while(flag)
{
cout<<"1.自定义输入 2.文件导入"<<endl;
cout<<"请输入集合创建方式:"<<endl;
cin>>k;
switch(k)
{
case 1:
cout<<"请从键盘输入元素(空格隔开)";
for(i=0;i<n;i++)
{
LNode *p=new LNode; //生成新结点
cin>>p->data; //输入元素值
p->next=L->next; //插入到表头
L->next=p;
}flag=0;
break;
case 2:
cout<<"请输入文件名:";
cin>>filename;
in.open(filename);
if(!in)
{
cout<<"打开文件出错!"<<endl;
exit(0);
}
for(i=0;i<n;i++)
{
LNode *p=new LNode; //生成新结点
if(!in.eof())
{
in.read(&p->data,1);
cout<<p->data<<endl;
}
p->next=L->next;//插入到表头
L->next=p;
}in.close();
flag=0;
break;
default :
cout<<"输入错误,请重新输入!"<<endl;
}
}
}
void Bing(LinkList La,LinkList Lb,LinkList &Lc)//求并集
{
//把La与Lb的并集放在链表Lc中 Lc=new LNode;
Lc->next=NULL;
LNode *pa=La->next; while(pa)//把集合La中的元素复制到集合Lc中
{
LNode *q=new LNode;
q->data=pa->data;
q->next=Lc->next;
Lc->next=q;
pa=pa->next;//指向La的指针pa后移
}
LNode *pb=Lb->next;
while(pb) //如果集合b中元素不同于集合a中元素,就添加到集合c中
{
bool flag=true;//flag用来标记a,b中是否有相同元素
pa=La->next;
while(pa)
{
if(pa->data==pb->data)
{
flag=false;
break;
}
else pa=pa->next;
}
if(flag) { //元素不同
LNode *p=new LNode;
p->data=pb->data;
p->next=Lc->next;
Lc->next=p;
}
pb=pb->next;
} }
void Jiao(LinkList La,LinkList Lb,LinkList &Lc)//求交集
{ Lc=new LNode;
Lc->next=NULL;
LNode *pb=Lb->next;
while(pb) //如果元素即属于集合a又属于集合b,则把该元素放到集合c中
{
LNode *pa=La->next;
while(pa)
{
if(pa->data==pb->data) //有相同元素
{
LNode *p=new LNode;
p->data=pb->data;
p->next=Lc->next;
Lc->next=p;
break;
}
else pa=pa->next;//没有继续后移
}
pb=pb->next;
}
} void Cha(LinkList La,LinkList Lb,LinkList &Lc) //求补集
{
Lc=new LNode;
Lc->next=NULL;
LNode *pa=La->next;
while(pa)//如果元素属于集合a不属于集合b,则把该元素放到集合c中
{
bool flag=true;
LNode *pb=Lb->next;
while(pb)
{
if(pb->data==pa->data)
{
flag=false;
break;
}
else pb=pb->next;
}
if(flag) { //元素不属于b
LNode *p=new LNode;
p->data=pa->data;
p->next=Lc->next;
Lc->next=p;
}
pa=pa->next;
}
}
void output(LinkList L) //输出元素
{
LNode *p=L->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
} //判断输入元素个数是否有效
int isnumber(){
char n[20];
gets(n);
int p=0,m;
while(n[p]!='\0'){
if(n[p]<48||n[p]>57||p>2){
cout<<"输入有误,重新输入:"<<endl;
fflush(stdin);
gets(n);
p=0;
}else{
p++;
} }
m=atoi(n);
return m;
} int main()
{
system("color f0");
LinkList L,La,Lb,Lc;
int i,b,a;
cout<<"请输入集合a的元素个数:"<<endl;
a = isnumber(); if(a==0){
cout<<"集合a为空"<<endl;
}
else{
cout<<"请输入集合a中的元素(空格隔开):"; }
CreateList_L(La,a);
cout<<"请输入集合b的元素个数(空格隔开):"<<endl;
b= isnumber();
if(b==0){
cout<<"集合b为空"<<endl;
}
else{
cout<<"请输入集合b中的元素:"; }
CreateList_L(Lb,b);
cout<<"**************集合的并、交、补运算****************"<<endl;
cout<<"1. 计算a 并b "<<endl;
cout<<"2. 计算a 交b "<<endl;
cout<<"3. 计算a 的补 "<<endl;
cout<<"4. 计算b 的补 "<<endl;
cout<<"5. 退出"<<endl;
while(1)
{
cout<<"请选择操作:";
cin>>i;
switch(i)
{
case 1: cout<<" a并b:";
Bing(La,Lb,Lc);
if(Lc->next==NULL){
cout<<"并集为空";
}
else{
output(Lc);}
break;
case 2: cout<<" a 交b :";
Jiao(La,Lb,Lc);
if(Lc->next==NULL){
cout<<"交集为空";
}else{
output(Lc);}
break;
case 3: cout<<" a的补:";
L=Lb;
Cha(L,La,Lc);
if(Lc->next==NULL){
cout<<"a的补为空";
}
else{
output(Lc);}
break;
case 4: cout<<" b的补:";
L=La;
Cha(L,Lb,Lc);
if(Lc->next==NULL){
cout<<"b的补为空";
}
else{
output(Lc);}
break;
case 5: exit(0);
}
cout<<endl;
}
return 0;
}
c++ 求集合的交并补的更多相关文章
- Help with Intervals(集合的交并补,线段树)
很早以前做过这题,早就没印象了,估计当时也是照着某大神的代码抄过的,现在是连题意都看了好长时间. 刚开始的S集合是空集,给你一些操作和一个T集合,把操作的结果再赋给S集合. 解法:因为会有开区间和闭区 ...
- java 集合交并补
通过使用泛型方法和Set来表达数学中的表达式:集合的交并补.在下面三个方法中都将第一个參数Set复制了一份,并未直接改动參数中Set. package Set; import java.util.Ha ...
- 求集合中选一个数与当前值进行位运算的max
求集合中选一个数与当前值进行位运算的max 这是一个听来的神仙东西. 先确定一下值域把,大概\(2^{16}\),再大点也可以,但是这里就只是写写,所以无所谓啦. 我们先看看如果暴力求怎么做,位运算需 ...
- hdu 1856 求集合里元素的个数 输出最大的个数是多少
求集合里元素的个数 输出最大的个数是多少 Sample Input41 23 45 61 641 23 45 67 8 Sample Output42 # include <iostream&g ...
- SQL_求集合中每天最大时间记录的总和
--问题求 集合中每天最大时间的总和 表中的数据 列: 用户 分数 时间 A 2 2014-01-01 01:00:00 A 2 2014-01-01 02:00:00 A 2 2014-01-01 ...
- 【数据结构】c语言实现集合的交并差运算
待改写:存储数据类型int-->char 重复的元素可存储 功能上不完善 #include <stdio.h> #include <stdlib.h> typedef s ...
- DFS算法-求集合的所有子集
目录 1. 题目来源 2. 普通方法 1. 思路 2. 代码 3. 运行结果 3. DFS算法 1. 概念 2. 解题思路 3. 代码 4. 运行结果 4. 对比 1. 题目来源 牛客网,集合的所有子 ...
- 两个ArrayList之间求交并补
class ArraylistCalculate{ // 两个整数集求差集 public ArrayList<Integer> integerArrayListDifference( Ar ...
- 傻瓜方法求集合的全部子集问题(java版)
给定随意长度的一个集合.用一个数组表示,如{"a", "b","c"},求它的全部子集.结果是{ {a}, {b}, {c}, {a,b}, ...
随机推荐
- Travel
Travel Time Limit: 10000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- web前端优化--DOM性能优化
1.DOM访问与修改的优化: DOM访问是有代价的,修改DOM则会引起DOM的重绘与重排,而这两种操作会消耗性能. (1)缓存DOM:将频繁访问的对象或属性使用变量缓存起来,每次访问的时候,直接使用变 ...
- arrow functions 箭头函数
ES6里新增加的,与普通方法不同的地方 1.this 的对象在定义函数的时候确定了,而不是在使用的时候才决定 2.不可以使用 new ,也就不能当构造函数 3.this 的值一旦确定无法修改 ...
- 基于webpack搭建的vue+element-ui框架
花了1天多的时间, 终于把这个框架搭建起来了. 好了, 不多说了, 直接进入主题了.前提是安装了nodejs,至于怎么安装, 网上都有教程. 这里就不多说了, 这边使用的IDE是idea.1.在E:/ ...
- Robotframework自动化系统:筛选结果数量统计
Robotframework自动化系统:筛选结果数量统计 上一个节点已经可以随机选中某一个下拉框的值,我们在使用evaluate随机数的时候需要计算下拉选项总数,这时候我们是手工计算输入的:这时候如果 ...
- 使用NPOI导出图片到EXCEL
1.首先引用NPOI 2.本例用到的引用 3.在Controller里面添加导出方法 public ActionResult ExportMsgData(string term) { //为list赋 ...
- salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
- Maven中settings.xml的配置项说明精讲
1.Maven的配置文件(Maven的安装目录/conf/settings.xml ) 和 Maven仓库下(默认的Maven仓库的是用户家目录下的.m2文件,可以另行制定)的settings.xml ...
- http下载网页
//http.c #include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/ ...
- concurrent.futures
concurrent.futures concurrent.futures提供高层次的接口,用来实现异步调用. 这个异步执行可以使用threads(ThreadPoolExecutor)或者proce ...