#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]!=' '){ 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; }