⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jh.c

📁 集合运算系统
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(Node)

typedef struct Elemtype{                 //设定集合链表的元素节点属性
     char letter;
     struct Elemtype *next;
}Node;


Node * Initset(void)                     //创建集合链表
{
	Node * head;
	Node * p1,* p2;
	int n=0;
	p1=p2=(Node *)malloc(LEN);
	head=NULL;
	
	do{                                  //先接受输入元素再判断,因为后续处理以非集合元素‘#’为标记
		p1->letter=getchar();
	    n=n+1;
	    if(n==1)head=p1;	
	    else p2->next=p1;
	    p2=p1;
	    p1=(Node *)malloc(LEN);
	}
	while(p2->letter!='#');
	p2->next=NULL;
    getchar();
	free(p1);
	return(head);
}


void intersection(Node * set1,Node * set2)            //求交集运算
{
	Node * p1,* p2,* p3;
	printf("交集为:\n");
	for(p1=set1 ;p1->letter!='#';p1=p1->next)
	{
		for(p2=set2;p2->letter!='#'&&p1->letter!=p2->letter;p2=p2->next)         //遍历寻找公共元素
			;
		if(p2->letter=='#')
			p1->letter='*';                                                      //非公共元素置其值为‘*’
	}
	p1=set1;
	for(;p1->letter=='*';p1=p1->next)
		;
	if(p1->letter=='#')printf("空集!");
	for(;p1->letter!='#';p1=p1->next)                   //打印值不为‘*’且第一次出现的字符
	{
		if(p1->letter!='*')
		{
			for(p3=set1;p3!=p1&&p3->letter!=p1->letter;p3=p3->next)
		       ;
			if(p3==p1)
				printf("%c",p1->letter);
		}
	}
	printf("\n");
}


void merger(Node * set1,Node * set2){                             //求并集运算
	Node * p1,* p2,* p3;
	p1=set1; p2=set2;
	if(p1->letter=='#')
	{
		if(p2->letter=='#')	printf("并集为空集!");
		else printf("并集为:\n");
		while(p2->letter!='#')
		{
			for(p3=set2;p3!=p2&&p3->letter!=p2->letter;p3=p3->next)
		       ;
			if(p3==p2)
				printf("%c",p2->letter);
			p2=p2->next;
		}
		printf("\n");
	}
	else if(p2->letter=='#')
	{
		printf("并集为:\n");
		while(p1->letter!='#')
		{
			for(p3=set1;p3!=p1&&p3->letter!=p1->letter;p3=p3->next)
		       ;
			if(p3==p1)
				printf("%c",p1->letter);
			p1=p1->next;
		}
		printf("\n");
	}
	else
	{
		printf("并集为:\n");
		for(p3=set1;p3->next->letter!='#';p3=p3->next)               //当两集合都非空时,连接两集合以方便后续输出
		       ;
		p3->next=set2;
		for(p1=set1;p1->letter!='#';p1=p1->next)
		{
			for(p3=set1;p3!=p1&&p3->letter!=p1->letter;p3=p3->next)
				;
			if(p3==p1)
        	printf("%c",p1->letter);                            //遍历输出第一次出现的元素即为并集所有元素
		}
		printf("\n");
	}
return;
}


void subtract(Node * set1,Node * set2)                       //求差集运算
{
	Node * p1,* p2,* p3;
	p1=set1; p2=set2; p3=set1;
	printf("差集为:\n");
	while(p2->letter!='#')
	{
		for(p3=set1;p3->letter!='#'&&p2->letter!=p3->letter;p3=p3->next)     //遍历第一个集合,有与第二集合公共元素则置其值为‘*’
			;
		{
			if(p3->letter!='#'){p3->letter='*';continue;}
			else 
			p2=p2->next;
		}
	}
	for(;p1->letter!='#';p1=p1->next)                      
	{
		if(p1->letter!='*')                                 //打印值不为‘*’且第一次出现的字符
		{
			for(p3=set1;p3!=p1&&p3->letter!=p1->letter;p3=p3->next)
		       ;
			if(p3==p1)
				printf("%c",p1->letter);
		}
	}
	printf("\n");
return;
}


int main()             //主函数
{
int operation,c;
Node * set1,* set2;
    printf("                              欢迎使用集合运算系统\n");
	printf("退出系统请按'N',继续操作请按任意键:");              //询问用户是否进入集合运算系统
	if((c=getchar())==78)return(0);
loop:printf("请输入第1个集合,并以'#'结束输入:\n");
	getchar();
	set1=Initset();                                              //初始化第一个集合
	printf("请输入第2个集合,并以'#'结束输入:\n");
	set2=Initset();                                              //初始化第二个集合
    printf("请选择运算类别:1`求交集运算;2`求并集运算;3`求差集运算: ");
scanf("%d",&operation);
switch(operation)                                                //运算选择
{
    case 1:intersection(set1,set2);break;
	case 2:merger(set1,set2);break;
	case 3:subtract(set1,set2);break;
    default:printf("\n输入错误!\n\n");
}
printf("是否进行新运算?(Y/N):");                             //以满足用户多次重复使用操作
c=getchar();
c=getchar();
if(c==89)goto loop;
return(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -