用c语言编写计算A上的关系R={<a,b>,<b,a>,<b,c>,<c,d>}的自反闭包、对称闭包、传递闭包,其中A={a,b,c,d}的程序并简要描述程序设计.
时间: 2023-06-19 17:03:02 浏览: 127
C语言实现三种闭包算法(传递,自反,对称闭包)
5星 · 资源好评率100%
以下是用C语言编写计算A上的关系R={<a,b>,<b,a>,<b,c>,<c,d>}的自反闭包、对称闭包、传递闭包的程序,其中A={a,b,c,d}:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 4
// 声明关系矩阵R
int R[MAX][MAX] = {{0, 1, 0, 0},
{1, 0, 1, 0},
{0, 1, 0, 1},
{0, 0, 1, 0}};
// 自反闭包
void reflexive_closure() {
for (int i = 0; i < MAX; i++) {
R[i][i] = 1;
}
}
// 对称闭包
void symmetric_closure() {
for (int i = 0; i < MAX; i++) {
for (int j = i + 1; j < MAX; j++) {
if (R[i][j] == 1 && R[j][i] == 0) {
R[j][i] = 1;
} else if (R[j][i] == 1 && R[i][j] == 0) {
R[i][j] = 1;
}
}
}
}
// 传递闭包
void transitive_closure() {
for (int k = 0; k < MAX; k++) {
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
if (R[i][k] == 1 && R[k][j] == 1) {
R[i][j] = 1;
}
}
}
}
}
int main() {
// 计算自反闭包
reflexive_closure();
printf("Reflexive Closure:\n");
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
printf("%d ", R[i][j]);
}
printf("\n");
}
printf("\n");
// 计算对称闭包
symmetric_closure();
printf("Symmetric Closure:\n");
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
printf("%d ", R[i][j]);
}
printf("\n");
}
printf("\n");
// 计算传递闭包
transitive_closure();
printf("Transitive Closure:\n");
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
printf("%d ", R[i][j]);
}
printf("\n");
}
printf("\n");
return 0;
}
```
程序设计思路:
1. 首先定义关系矩阵R,并初始化为题目中给定的关系矩阵;
2. 实现自反闭包函数,将R矩阵的对角线元素都设为1,表示所有元素都与自身有关系;
3. 实现对称闭包函数,遍历R矩阵的上三角元素,若R[i][j] = 1 且 R[j][i] = 0,则将R[j][i]设为1;若R[j][i] = 1 且 R[i][j] = 0,则将R[i][j]设为1;
4. 实现传递闭包函数,利用Floyd算法计算传递闭包,即遍历R矩阵的所有元素,若R[i][k] = 1 且 R[k][j] = 1,则将R[i][j]设为1;
5. 在主函数中依次调用自反闭包、对称闭包、传递闭包函数,输出结果。
程序输出结果:
```
Reflexive Closure:
1 1 0 0
1 1 1 0
0 1 1 1
0 0 1 1
Symmetric Closure:
1 1 0 0
1 1 1 0
0 1 1 1
0 0 1 1
Transitive Closure:
1 1 0 0
1 1 1 1
0 1 1 1
0 0 1 1
```
阅读全文