本代码对于集合元素只支持a-z,有其他情况自行修改
传递闭包采用warshall算法解决
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 256
int count=0,cnt=0;
char ys[max];
char r[max][2];
int matrix[max][max];
int countif(char ch[])
{
count=0;
for(int i=0;i<strlen(ch);i++)
{
if('a'<=ch[i]&&ch[i]<='z')ys[count++]=ch[i];
}
return count;
}
void pp(char rh[])
{
count=0,cnt=0;
for(int i=0;i<strlen(rh);i++)
{
if('a'<=rh[i]&&rh[i]<='z')r[count][cnt++]=rh[i];
if(cnt==2){count++;cnt=0;}
}
}
void rR(char ys[],char r[][2],int count1)
{
int count2=count;
for(int i=0;i<count;i++)
{
if(r[i][0]==r[i][1])
{
for(int j=0;j<count1;j++)
{
if(ys[j]==r[i][0])ys[j]='#';
}
}
}
for(int i=0;i<count1;i++)
{
if(ys[i]!='#'){
r[count2][0]=ys[i];
r[count2][1]=ys[i];
count2++;
}
}
printf("r(R)={");
for(int i=0;i<count2;i++)
{
if(i!=0)printf(",");
printf("<%c,%c>",r[i][0],r[i][1]);
}
printf("}");
printf("\n");}
void sR(char ys[],char r[][2])
{
int count2=count;
char a,b;
for(int i=0;i<count;i++)
{
int flag=1;
a=r[i][1];
b=r[i][0];
for(int j=0;j<count2;j++)
{
if(a==r[j][0]&&b==r[j][1])
{
flag=0;
break;
}
}
if(flag==1)
{
r[count2][0]=a;
r[count2][1]=b;
count2++;
}
}
printf("s(R)={");
for(int i=0;i<count2;i++)
{
if(i!=0)printf(",");
printf("<%c,%c>",r[i][0],r[i][1]);
}
printf("}");
printf("\n");
}
void reset(int count1)
{
int count2=count1;
while(ys[count1])
{
ys[count1]='\0';
count1++;
}
while(r[count2][0]||r[count2][1])
{
r[count2][0]=r[count2][1]='\0';
count2++;
}
}
void create_matrix(int matrix[][max],int count1)
{
int count2=count,cnt=0;
memset(matrix,0,sizeof(matrix));
int a,b;
char c,d;
for(int i=0;i<count;i++)
{
for(int j=0;j<count1;j++)
{
if(r[i][0]==ys[j])a=j;
if(r[i][1]==ys[j])b=j;
}
matrix[a][b]=1;
}
for(int i=0;i<count1;i++)
{
for(int j=0;j<count1;j++)
{
if(matrix[j][i]==1)
{
for(int k=0;k<count1;k++)
{
matrix[j][k]=matrix[j][k]|matrix[i][k];
}
}
}
}
for(int i=0;i<count1;i++)
{
for(int j=0;j<count1;j++)
{
if(matrix[i][j]==1)
{
int flag=1;
c=ys[i];
d=ys[j];
for(int k=0;k<count2;k++)
{
if(r[k][0]==c&&r[k][1]==d)flag=0;
}
if(flag==1)
{
r[count2][0]=c;
r[count2][1]=d;
count2++;
}
}
}
}
printf("t(R)={");
for(int i=0;i<count2;i++)
{
if(i!=0)printf(",");
printf("<%c,%c>",r[i][0],r[i][1]);
}
printf("}");
printf("\n");
}
int main()
{
printf("请输入集合中的元素:");
char ch[max];
scanf("%s",ch);
printf("\n");
int count1=countif(ch);
printf("请输入二元关系R:");
char rh[max];
scanf("%s",rh);
pp(rh);
printf("\n");
printf("R的自反闭包为:\n");
rR(ys,r,count1);
reset(count1);
printf("R的对称闭包为:\n");
sR(ys,r);
reset(count1);
printf("R的传递闭包为:\n");
create_matrix(matrix,count1);
}
运行结果: