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}, ...
随机推荐
- Problem E
Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计 ...
- Code Lock
Code Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Su ...
- 软硬链接、文件删除原理、linux中的三种时间、chkconfig优化
第1章 软硬链接 1.1 硬链接 1.1.1 含义 多个文件拥有相同的inode号码 硬链接即文件的多个入口 1.1.2 作用 防止你误删除文件 1.1.3 如何创建硬链接 ln 命令,前面是源文件 ...
- 注销/etc/passwd带来的系统登陆不上
今天在修改虚拟机密码上的时候,将/etc/passwd中root所在的哪行注销掉了,想象是注销了,root登陆时应该不要输入密码,结果是系统进度条走到最后的时候 进入不了系统了. 结果去普及了下/et ...
- Sqlserver将数据从一个表插入到另一个表
.如果是整个表复制表达如下: insert into table1 select * from table2 .如果是有选择性的复制数据表达如下: insert into table1(column1 ...
- Python学习--语句
一.print 和 import print 打印多个表达式,用逗号隔开 >>> print 'ab','cd' ab cd import import somemodule fro ...
- 一、VueJs 填坑日记之基础概念知识解释
概述在最开始听说vuejs这个词是在2016年,当时天真的认为自己是个后端开发工程师不需要学习太多的前端知识,不过紧接着在2017年在公司就用到了vuejs.对于初学者(尤其是干后端的初学者)来说,刚 ...
- 原生JS—实现图片循环切换的两种方法
今天我们主要讲讲如何使用原生JS实现图片的循环切换的方法.多余的话我们就不多说了,我们一个一个开始讲吧. 1 原生JS实现图片循环切换 -- 方法一 在上栗子之前我们先简单介绍一下所用的一些知识点. ...
- 【解决方案】纯js动态克隆表一行元素
1 m = 0 ;// 用于区分input // 新增一条录入 function AddTR(){ m += 1; var tableObject = document.getElementById( ...
- Java 中实现方法重试的一种机制
有这样一个需求,当调用某个方法抛出异常,比如通过 HttpClient 调用远程接口时由于网络原因报 TimeOut 异常:或者所请求的接口返回类似于"处理中"这样的信息,需要重复 ...