• 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]!=''){
    			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;
    } 
    
     
    
    
     
    
      
    
    
    
     
    
  • 相关阅读:
    【汇编程序】出地址为BUF的5个字符数组的内容之和
    Ugly Number
    Best Time to Buy and Sell Stock IV****
    Best Time to Buy and Sell Stock III
    Best Time to Buy and Sell Stock
    Best Time to Buy and Sell Stock II
    House Robber II
    Contain Duplicate III*******
    Contain Duplicate II
    Contain Duplicate
  • 原文地址:https://www.cnblogs.com/zuoting-haoxue/p/6618265.html
Copyright © 2020-2023  润新知