左边啊

不努力,哪有光明

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;
} 

 


 

  



 

 

posted on 2017-03-25 20:10  左佐佐  阅读(672)  评论(0编辑  收藏  举报

导航