请大侠们帮我看看以下程序,是用C语言求转置矩阵。提示的错误是有返回无返回之类的,不懂啊。

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
int create_mat(int row,int col)
{
int i,j;
int **init;
init=(int**)malloc(row*sizeof(int*));
for(i=0;i<row;i++)
init[i]=(int*)malloc(col*sizeof(int));
for(i=0;i<row;i++)
for(j=0;j<col;j++)
init[i][j]=rand()%100;
for(i=0;i<row;i++)
for(j=0;j<col;j++)
if(j!=col-1)printf("%6d ",init[i][j]);
else printf("%6d\n",init[i][j]);
return init;
}
void apReverseMat2Di0(int **init,int row,int col)
{
int i,j,t;
int **dest;
if (init==NULL||row<=0||col<=0)
{
printf("please enter a correct data.");
return NULL;
}
dest=(int**)malloc(row*sizeof(int*));
for(i=0;i<row;i++)
init[i]=(int*)malloc(col*sizeof(int));
for(i=0;i<row;i++)
for(j=0;j<col;j++)
dest[i][j]=rand()%100;
for(i=0;i<row;i++)
for(j=i;j<col;j++)
{
if(i!=j)
{
t=init[i][j];
init[i][j]=dest[j][i];
dest[j][i]=t;
}
}
return dest;
}

void apDisplayMat2Di(int **data, int row, int col)
{
int i=0,j=0;
for (i=0;i<row;i++)
{
printf("\n");
for (j=0;j<col;j++)
printf("\t%d",data[i*row+j]);
}
printf("\n");
}

void main()
{
int a,b,row,col;
printf("input row and col:\n");
scanf("%d%d",&row,&col);
printf("init mat:\n");
a=create_mat(row,col);
apDisplayMat2Di(a,row,col);
printf("dest mat:\n");
b=apReverseMat2Di0(a,row,col);
apDisplayMat2Di(b,row,col);
system("pause");
return 0;
}
求大神解答啊,小弟水平实在很低,要是有什么很无脑的错误或者问题,请见谅。。。

第1个回答  2012-10-09
LZ的程序自己写的吧。。转置那里的逻辑 与 函数的返回值 还不太熟。。慢慢修炼~~
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
int** create_mat(int row,int col) // 返回值 类型改为 int** 类型
{
int i,j;
int **init;
init=(int**)malloc(row*sizeof(int*));
for(i=0;i<row;i++)
init[i]=(int*)malloc(col*sizeof(int));
for(i=0;i<row;i++)
for(j=0;j<col;j++)
init[i][j]=rand()%100; // 这里的辅助输出删了..
return init;
}
int** apReverseMat2Di0(int **init,int row,int col) // 这里的返回值 类型也改为 int** 类型
{
int i,j,t;
int **dest;
if (init==NULL||row<=0||col<=0)
{
printf("please enter a correct data.");
return NULL;
}

dest=(int**)malloc(row*sizeof(int*));
for(i=0;i<row;i++)
dest[i]=(int*)malloc(col*sizeof(int)); // 仔细呀。。。init 改为 dest
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{ // 这里不涉及数据覆盖 , 所以不需要临时变量。。
dest[i][j]=init[j][i]; // 因为 main 函数那传过来时 是反着的。。所以这里也反过来。。理解理解。。
}
return dest;
}

void apDisplayMat2Di(int **data, int row, int col)
{
int i=0,j=0;
for (i=0;i<row;i++)
{
printf("\n");
for (j=0;j<col;j++)
printf("\t%d",data[i][j]);
}
printf("\n");
}

void main()
{
int row,col;
int** a,** b; // 定义为int** 型 ,用于存放 2 维数组的首地址
printf("input row and col:\n");
scanf("%d%d",&row,&col);
printf("init mat:\n");
a=create_mat(row,col);
apDisplayMat2Di(a,row,col);
printf("dest mat:\n");
b=apReverseMat2Di0(a,col,row); // 这里 col 与 row 反过来。。方便转置。。
apDisplayMat2Di(b,col,row); // 这里 col 与 row 也要反过来。。因为 a 和 b 的行与列相反。。
system("pause");
return ; // void 类型 没有返回值..
}本回答被提问者和网友采纳
第2个回答  2012-10-10
你定义的 apReverseMat2di0()函数 是个无返回值的函数 不能给 倒数 第五行 的 b 赋值 ;
把 b= 去掉 只剩 apReverseMat2Di0(a,row,col); 至少 编译不会出错
第3个回答  2012-10-11
关键是函数类型与后return后面的表达式类型不匹配:
这样改:
int** create_mat(int row,int col)

int** apReverseMat2Di0(int **init,int row,int col)

int main()
相似回答