集合的并交差

#include<iostream>
using namespace std;
#include<stdlib.h>
typedef struct LNode//定义结构体类型指针
{
char data;
struct LNode *next; 
}*linklist;
void  in_put(linklist &L)//定义输入集合函数
{
    linklist p;
    char tmp=cin.get();
    while(tmp!='\n')
  {    p=(linklist)malloc(sizeof(struct LNode));
    p->data=tmp;
    p->next=L->next;//函数调用完后不会改变指针L的值,只会改变指针L所指向的内容(即L->next的值) 
    L->next=p;
    tmp=cin.get();
  }
}
void out_put(linklist L)//定义输出集合函数
{
linklist p;
p=L->next;
while(p!=NULL)
{
cout<<p->data;
p=p->next;
}
cout<<"\n";
}
void bingji(linklist L1,linklist L2,linklist L3)//定义并集,L3为L1和L2的并集 
{
    linklist p1;
    linklist p2;
    linklist p3;
    p1=L1->next;
 while(p1!=NULL)//将L1中的数据传给L3
 {
   p3=(linklist)malloc(sizeof(struct LNode));
   p3->data=p1->data;
   p3->next=L3->next;
   L3->next=p3;
   p1=p1->next;
 }
   p2=L2->next;
 while(p2!=NULL)//循环处理L2中数据
 {
   p1=L1->next;
   while((p1!=NULL)&&(p1->data!=p2->data))
   p1=p1->next;
  if (p1==NULL)//L1中的所有节点的数据都与L2中的第i(i=1,2...)个数据不相等,那么将L1中的第n个数据传给L3 

p3=(linklist)malloc(sizeof(struct LNode));
p3->data=p2->data;
p3->next=L3->next;
L3->next=p3;
}
p2=p2->next;
}
}
void jiaoji(linklist L1,linklist L2,linklist L3)//定义交集,L3为L1和L2交集
{
linklist p1,p2,p3;
p1=L1->next;
while(p1!=NULL)//同样的循环处理L2中的数据 
{
p2=L2->next;
while((p2!=NULL)&&(p2->data!=p1->data))
p2=p2->next;
if((p2!=NULL)&&(p2->data==p1->data))//存在L2中的数据与L1中的第n个数据相等
{
p3=(linklist)malloc(sizeof(struct LNode));
p3->data=p1->data;//这里就将 L1与L2相等的数据传给L3 
p3->next=L3->next;
L3->next=p3;
}
p1=p1->next;
}
}
void chaji(linklist L1,linklist L2,linklist L3)//同上面相同的定义差集,L3为L1和L2差集 
{
linklist p1,p2,p3;
p1=L1->next;
while(p1!=NULL)//循环处理L1中的数据 
{
p2=L2->next;//从第一个节点开始处理 
while((p2!=NULL)&&(p2->data!=p1->data))
p2=p2->next; 
if(p2==NULL)//在L2中没有找到数据与L1中第n个数据相等
{
p3=(linklist)malloc(sizeof(struct LNode));
p3->data=p1->data;
p3->next=L3->next;
L3->next=p3;//将L1中数据传给L3(与L2不相等)
}
p1=p1->next;
}
}
bool judge(linklist L,char n)//判断n是否在集合A中
{
int t=0;
linklist p=L->next;
while(p!=NULL)
{
if(p->data==n)
t=1;
p=p->next;
}
if(t==0) return false;
else return true;
}
int main()//主函数
{
int x;
char m;
linklist L1,L2,L3;
L1=(linklist)malloc(sizeof(struct LNode));
L1->next=NULL;
L2=(linklist)malloc(sizeof(struct LNode));
L2->next=NULL;
L3=(linklist)malloc(sizeof(struct LNode));
L3->next=NULL;
cout<<"请输入集合A:";
in_put(L1);
cout<<"请输入集合B:";
in_put(L2);
do
{cout<<"1.求两集合的并集\n";
 cout<<"2.求两集合的交集\n";
 cout<<"3.求两集合的差集\n";
 cout<<"4.输入一个数n,查找n是否属于集合A\n";
 cout<<"0.退出程序\n";
 cin>>x;
 switch(x)
 {case 1:
      cout<<"两集合的并是";
      bingji(L1,L2,L3);//并集
      out_put(L3);
      L3->next=NULL;
      break;
  case 2:
      cout<<"两集合的交是";
      jiaoji(L1,L2,L3);//交集
      out_put(L3);
      L3->next=NULL;
      break;
  case 3:
      cout<<"两集合的差是";
      chaji(L1,L2,L3);//差集
      out_put(L3);
      L3->next=NULL;
      break;
  case 4:
cout<<"请输入一个元素n:"<<"\n";
cin>>m;
if(judge(L1,m))
cout<<"n这个元素属于集合A"<<"\n";
else
cout<<"n这个元素不属于集合A"<<"\n";
break;
  case 5:
      break;
  default:
    cout<<"选择错误,请重新输入\n";
    break;}
}
while(5!=0);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值