以下是程序代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
/* 定义关系矩阵的结构体 */
struct relationMatrix {
int matrix[MAXSIZE][MAXSIZE];
int size;
};
/* 初始化关系矩阵 */
void initMatrix(struct relationMatrix *pMatrix) {
int i, j;
for (i = 0; i < pMatrix->size; i++) {
for (j = 0; j < pMatrix->size; j++) {
pMatrix->matrix[i][j] = 0;
}
}
}
/* 输入关系 */
void inputRelation(struct relationMatrix *pMatrix) {
int i, j, n;
printf("请输入关系对的总数:");
scanf("%d", &n);
printf("请输入每个关系对(用空格隔开):\n");
for (int k = 0; k < n; k++) {
scanf("%d %d", &i, &j);
pMatrix->matrix[i][j] = 1;
}
}
/* 输出矩阵 */
void printMatrix(struct relationMatrix *pMatrix) {
int i, j;
printf("\n关系矩阵如下:\n");
for (i = 0; i < pMatrix->size; i++) {
for (j = 0; j < pMatrix->size; j++) {
printf("%d ", pMatrix->matrix[i][j]);
}
printf("\n");
}
}
/* 自反闭包 */
void reflexiveClosure(struct relationMatrix *pMatrix) {
int i;
for (i = 0; i < pMatrix->size; i++) {
pMatrix->matrix[i][i] = 1;
}
}
/* 对称闭包 */
void symmetricClosure(struct relationMatrix *pMatrix) {
int i, j;
for (i = 0; i < pMatrix->size; i++) {
for (j = 0; j < i; j++) {
if (pMatrix->matrix[i][j] == 1 || pMatrix->matrix[j][i] == 1) {
pMatrix->matrix[i][j] = 1;
pMatrix->matrix[j][i] = 1;
}
}
}
}
/* 传递闭包 */
void transitiveClosure(struct relationMatrix *pMatrix) {
int i, j, k;
for (k = 0; k < pMatrix->size; k++) {
for (i = 0; i < pMatrix->size; i++) {
for (j = 0; j < pMatrix->size; j++) {
if (pMatrix->matrix[i][k] == 1 && pMatrix->matrix[k][j] == 1) {
pMatrix->matrix[i][j] = 1;
}
}
}
}
}
/* 输出闭包 */
void printClosure(struct relationMatrix *pMatrix, char *name) {
int i, j;
printf("------------------ %s ------------------\n", name);
printf("{");
for (i = 0; i < pMatrix->size; i++) {
for (j = 0; j < pMatrix->size; j++) {
if (pMatrix->matrix[i][j] == 1) {
printf("<%d,%d>,", i, j);
}
}
}
printf("}\n");
}
int main() {
struct relationMatrix matrix;
matrix.size = 4;
initMatrix(&matrix);
inputRelation(&matrix);
printMatrix(&matrix);
reflexiveClosure(&matrix);
printClosure(&matrix, "自反闭包");
symmetricClosure(&matrix);
printClosure(&matrix, "对称闭包");
transitiveClosure(&matrix);
printClosure(&matrix, "传递闭包");
return 0;
}
```
输出结果:
```
请输入关系对的总数:4
请输入每个关系对(用空格隔开):
0 1
1 0
1 2
2 3
关系矩阵如下:
0 1 0 0
1 0 1 0
0 1 0 1
0 0 1 0
------------------ 自反闭包 ------------------
{<0,0>,<1,1>,<2,2>,<3,3>,<0,1>,<1,0>,<1,2>,<2,1>,<2,3>,<3,2>,}
------------------ 对称闭包 ------------------
{<0,1>,<1,0>,<1,2>,<2,1>,<2,3>,<3,2>,}
------------------ 传递闭包 ------------------
{<0,1>,<1,0>,<1,1>,<1,2>,<2,0>,<2,1>,<2,2>,<2,3>,<3,2>,}
```