我被要求编写一个获取二维数组(矩阵),列数和行数的程序,程序将返回转置矩阵(不使用[] [],这意味着只使用指针算术)
我写的程序,确实转置矩阵,没问题。我的问题是了解如何返回。这是我的代码:
int** transpose_matrix(matrix mat1,int number_of_rows,int number_of_columns)
{
matrix mat2;
int row_index,column_index;
for(row_index=0;row_index<number_of_rows;row_index++)
{
for(column_index=0;column_index<number_of_columns;column_index++)
**(mat2+(column_index*number_of_rows)+row_index)=**(mat1+(row_index*number_of_columns)+column_index);
}
// at this point, mat2 is exactly the transpose of mat1
return mat2;
}
现在这里是我的问题:我无法返回矩阵,我能做的最接近的事情是返回矩阵的第一个值的地址,但即使我这样做,矩阵的其余部分也将无法使用一旦我退出transpose_matrix函数回到void main ...我怎么能返回mat2?
答案 0 :(得分:0)
一,二维数组不是双指针。
二,动态分配。如果matrix
是二维数组类型,那么写下这样的东西:
typedef int matrix[ROWS][COLUMNS];
typedef int (*matrix_ptr)[COLUMNS];
matrix_ptr transpose_matrix(matrix m, int rows, int cols)
{
matrix_ptr transposed = malloc(sizeof(*transposed) * rows);
// transpose, then
return transposed;
}
答案 1 :(得分:0)
好的:这里有三件事:
代码的简单修复(适用于任何矩阵大小):
int* transpose_matrix(int *mat1,int number_of_rows,int number_of_columns)
{
int *mat2=malloc(number_of_rows*number_of_columns*sizeof(int));
int row_index,column_index;
for(row_index=0;row_index<number_of_rows;row_index++)
{
for(column_index=0;column_index<number_of_columns;column_index++)
mat2[column_index*number_of_rows+row_index]=mat1[row_index*number_of_columns+column_index];
}
// at this point, mat2 is exactly the transpose of mat1
return mat2;
}
...
print(m,r,c); // I hope you have a print()
int *t=transpose_matrix(m,r,c);
print (t,c,r);
...
// use t[max: c-1][max: r-1]
free(t);
如果我们只有固定大小的矩阵(C99也可以使用可变长度数组!)。
typedef int Matrix[ROWS][COLUMNS];
typedef int TMatrix[COLUMNS][ROWS];
typedef int (*pMatrix)[COLUMNS];
typedef int (*pTMatrix)[ROWS];
pTMatrix transpose_matrix(Matrix m , int rows, int cols)
{
pTMatrix t = malloc(sizeof(*t)*cols);
for (int r=0; r<rows ; ++r)
for (int c=0; r<cols ; ++r)
t[c][r]=m[r][c];
return t;
}
好吧,如果修复了行和列,你就不需要传递它......嗯......