📄 jh.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 + -