#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++ 求集合的交并补的更多相关文章

  1. Help with Intervals(集合的交并补,线段树)

    很早以前做过这题,早就没印象了,估计当时也是照着某大神的代码抄过的,现在是连题意都看了好长时间. 刚开始的S集合是空集,给你一些操作和一个T集合,把操作的结果再赋给S集合. 解法:因为会有开区间和闭区 ...

  2. java 集合交并补

    通过使用泛型方法和Set来表达数学中的表达式:集合的交并补.在下面三个方法中都将第一个參数Set复制了一份,并未直接改动參数中Set. package Set; import java.util.Ha ...

  3. 求集合中选一个数与当前值进行位运算的max

    求集合中选一个数与当前值进行位运算的max 这是一个听来的神仙东西. 先确定一下值域把,大概\(2^{16}\),再大点也可以,但是这里就只是写写,所以无所谓啦. 我们先看看如果暴力求怎么做,位运算需 ...

  4. hdu 1856 求集合里元素的个数 输出最大的个数是多少

    求集合里元素的个数 输出最大的个数是多少 Sample Input41 23 45 61 641 23 45 67 8 Sample Output42 # include <iostream&g ...

  5. SQL_求集合中每天最大时间记录的总和

    --问题求 集合中每天最大时间的总和 表中的数据 列: 用户 分数 时间 A 2 2014-01-01 01:00:00 A 2 2014-01-01 02:00:00 A 2 2014-01-01 ...

  6. 【数据结构】c语言实现集合的交并差运算

    待改写:存储数据类型int-->char 重复的元素可存储 功能上不完善 #include <stdio.h> #include <stdlib.h> typedef s ...

  7. DFS算法-求集合的所有子集

    目录 1. 题目来源 2. 普通方法 1. 思路 2. 代码 3. 运行结果 3. DFS算法 1. 概念 2. 解题思路 3. 代码 4. 运行结果 4. 对比 1. 题目来源 牛客网,集合的所有子 ...

  8. 两个ArrayList之间求交并补

    class ArraylistCalculate{ // 两个整数集求差集 public ArrayList<Integer> integerArrayListDifference( Ar ...

  9. 傻瓜方法求集合的全部子集问题(java版)

    给定随意长度的一个集合.用一个数组表示,如{"a", "b","c"},求它的全部子集.结果是{ {a}, {b}, {c}, {a,b}, ...

随机推荐

  1. #define is unsafe

    #define is unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

  2. document.body.scrollTop 值总为0

    http://www.jb51.net/article/21168.htm 页面具有 DTD(或者说指定了 DOCTYPE)时,使用 document.documentElement.     做页面 ...

  3. JS是按值传递还是按引用传递?【转载】

    最近遇到个有趣的问题:“JS中的值是按值传递,还是按引用传递呢?” 在分析这个问题之前,我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference). ...

  4. DOM 对象

    DOM  ==  document object model   document 对象是唯一同时属于  BOM 和 DOM  的   rows 是一种DOM集合,不是数组,所以没有sort() 函数 ...

  5. centos命令自动补全增强

    CentOS默认没有像Ubuntu系统一样命令参数补全功能,例如yum install无法补全.通过安装bash-completion安装命令参数补全增强. CentOS6 默认情况下,CentOS6 ...

  6. bash脚本条件测试总结

    一.if语句的结构 分为以下三种:单分支.双分支.多分支 单分支if语句 if CONDITION is True: then 分支 fi 双分支if语句 if CONDITION is True: ...

  7. Java Enum用法详解

    Java Enum用法详解 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举 ...

  8. StringBulider与StringBuffer的异同

    相同点:两者的功能都是相同的,没有任何差别. 不同点:StringBulider 不是同步的,也是线程不安全的,当使用多线程处理缓冲区时,不能使用.但是单线程访问的时候效率高,如果是单线程处理缓冲区资 ...

  9. 在为知笔记中使用Markdown和思维导图

    为知笔记Wiz是一款很好的网摘和笔记工具,作为为知的忠实用户,我在为知收费后第一时间就购买了两年的授权,毕竟这么多年积累的资料都在为知上,我也习惯了使用Wiz来做些工作相关的笔记.为知笔记自带Mark ...

  10. 快速搭建Japser Report

    下列步骤是快速搭建一个Jasper Report,开发中遇到的坑会在下一个博客中提及,如有任何问题,欢迎留言评论 第一步,打开Jaspersoft Studio,界面跟eclispse一样 创建项目: ...