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}, ...
随机推荐
- Xilinx ISE 14.1利用Verilog产生clock
<一>建立如下的Verilog Module module myClock( input clock ); endmodule <二>建立 Verilog Test Fixtu ...
- NFS启动时报错Linux NFS:could not open connection for tcp6
1.1 启动时出现的错误 [root@znix ~]#/etc/init.d/nfs start Shutting down NFS daemon: ...
- Elasticsearch集群调优
系统调优 禁用swap 使用swapoff命令可以暂时关闭swap.永久关闭需要编辑/etc/fstab,注释掉swap设备的挂载项. swapoff -a 如果完全关闭swap不可行,可以试着降低s ...
- 还原NuGet程序包
官网:https://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 在获取团队中的项目或者下载他人的项目Demo后,运行项目有时会提示某些dll找不到 ...
- redhat7 邮件服务搭建
一.先搭建DNS服务,在正向和反向区域文件分别添加以下配置 cd /var/named 目录下 ① vi abc.com.zone 正向区域文件,添加以下内容 @ MX 5 mail.test.cn ...
- Python爬虫入门:爬虫基础了解
有粉丝私信我想让我出更基础一些的,我就把之前平台的copy下来了,可以粗略看一下,之后都会慢慢出. 1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫 ...
- 初学者最易懂的git教程在这里!
一.git简介: Linux创建了Linux,但是Linux的发展壮大是由世界各地的热心志愿者参与编写的?那么那么多份的代码是怎么合并的呢?之前是在2002年以前,世界各地的志愿者把源代码文件通过di ...
- js同时使用多个分隔符分割字符串.
利用正则分割,str.split(/reg/);如果有这样一个字符串: "jb51.net,google.com,baidu.com_weibo.com_haotu.net", 我 ...
- 【1】maven来管理我的SSM项目
新建个maven项目,第一步当然是配置好自己需要的jar包,maven使用pom.xml管理 并不是每一个都有用,但是都是常见jar,方便以后自己调用来查找 <project xmlns=&qu ...
- 全新的.NET解释器 - Mono已经到来
Mono通过新的运行代码方式,完善了自己的即时编译器和静态编译器. 2001年,Mono项目正式开始,Mono开发团队为.NET指令集编写了一个解释器,用于在Linux上引导一个自托管的.NET开发环 ...