#include<stdio.h>
#include<stdlib.h>
#define MAX 100
static int cz[MAX][MAX];
static int cc[MAX][MAX];
static int cd[MAX][MAX];
static int r[MAX][MAX];
void initc(int x[][MAX],int y[][MAX],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
x[i][j]=y[i][j];
}
}
}
int main()
{
int i,j,N;
printf("选择要输入几阶矩阵\n");
scanf("%d",&N);
int** r;int** c;
printf("请输入关系矩阵真值(0或1):\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
scanf("%d",&r[i][j]);
}
} //输出矩阵;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(r[i][j]!=0&&r[i][j]!=1)
{
printf("输错了");
return 0;
}
}
}
int cz[N][N],cd[N][N],cc[N][N];
cz=initc (cz,r,N);
//求自反闭包
for(i=0;i<N;i++)
{
cz[i][i]=1;//将主对角线全部改为1
}
printf("自反闭包的矩阵");
initc函数返回为void,你这么写成 cz = initc(cz,r,N);呢?
r和c是指针的指针,指针只是一个地址存储,你得给它们分配空间才行。而且你明明上面已经定义了四个全局变量数组,完全够用了,不需要再定义这两个指针的,直接用全局变量cc和r。同样45行的三个临时变量删除掉,全局都已经定义了,怎么又定义一堆临时变量呢
修改一下:
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
static int cz[MAX][MAX];
static int cc[MAX][MAX];
static int cd[MAX][MAX];
static int r[MAX][MAX];
void initc(int x[][MAX],int y[][MAX],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
x[i][j]=y[i][j];
}
}
}
int main()
{
int i,j,N;
printf("选择要输入几阶矩阵\n");
scanf("%d",&N);
printf("请输入关系矩阵真值(0或1):\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
scanf("%d",&r[i][j]);
}
} //输出矩阵;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(r[i][j]!=0&&r[i][j]!=1)
{
printf("输错了");
return 0;
}
}
}
initc (cz,r,N);
//求自反闭包
for(i=0;i<N;i++)
{
cz[i][i]=1;//将主对角线全部改为1
}
printf("自反闭包的矩阵");
return 0;
}
(1)第24行的int ** r;int ** c;都没有申请内存,就在30行中使用了,肯定会崩的
(2)第8行的initc函数返回值是void,在46行中反而有返回值了,cz=initc (cz,r,N); 改成 initc (cz,r,N);
(3)如果你的编译器是Visual Studio,第45行 int cz[N][N],cd[N][N],cc[N][N];这里也会保存,标准C中不允许使用变量定义数组大小
代码修改如下
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
static int cz[MAX][MAX];
static int cc[MAX][MAX];
static int cd[MAX][MAX];
static int r[MAX][MAX];
void initc(int x[][MAX],int** y ,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
x[i][j]=y[i][j];
}
}
}
int main()
{
int i,j,N;
printf("选择要输入几阶矩阵\n");
scanf("%d",&N);
int** r;//int** c;
r = new int*[N];
printf("请输入关系矩阵真值(0或1):\n");
for(i=0;i<N;i++)
{
r[i] = new int[N];
for(j=0;j<N;j++)
{
scanf("%d",&r[i][j]);
}
} //输出矩阵;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(r[i][j]!=0&&r[i][j]!=1)
{
printf("输错了");
return 0;
}
}
}
//int cz[N][N],cd[N][N],cc[N][N];
int cz[MAX][MAX],cd[MAX][MAX],cc[MAX][MAX];
initc (cz,r,N);
//求自反闭包
for(i=0;i<N;i++)
{
cz[i][i]=1;//将主对角线全部改为1
}
printf("自反闭包的矩阵");
//释放r的内存
for(i=0;i<N;i++)
{
delete[] r[i];
r[i]=0;
}
delete[] r;
r=0;
return 0;
}