#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;
}
05-11 15:25
查看更多