#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes);
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes)
{
int **p;
p = (int **)malloc(matrixColSize[0] * sizeof(int *));
if (p==NULL) return NULL;
int i, j;
for(i = 0; i<matrixColSize[0]; ++i)
{
p[i] = (int *)malloc(matrixSize * sizeof(int));
if (p==NULL) return NULL;
memset(p[i], 0, matrixSize * sizeof(int));
}
for(i = 0; i<matrixSize; ++i)
{
for(j = 0; j<matrixColSize[i]; ++j)
{
p[j][i] = matrix[i][j];
}
}
*returnSize = matrixColSize[0];
int *q = (int *)malloc(sizeof(int) * (*returnSize));
memset(q, 0, *returnSize * sizeof(int));
if(q==NULL) return NULL;
for(i = 0; i<(*returnSize); ++i)
{
q[i] = matrixSize;
}
*returnColumnSizes = q;
return p;
}
int main()
{
// 初始化指针数组, 初始化函数实参
int m, n, v, matrixSize, **matrix, *matrixColSize, returnSize, *returnColumnSizes;
printf("请输入原始数组行数 列数: ");
scanf("%d %d", &m, &n);
matrixSize = m;
matrix = (int **)malloc(sizeof(int *) * m);
if(matrix==NULL) return -1;
matrixColSize = (int *)malloc(sizeof(int) *m);
memset(matrixColSize, 0, m * sizeof(int));
if(matrix==NULL) return -1;
int i, j;
for(i = 0; i<m; ++i)
{
matrix[i] = (int *)malloc(sizeof(int) * n);
if(matrix[i]==NULL) return -1;
memset(matrix[i], 0, n * sizeof(int));
matrixColSize[i] = n;
}
for(i = 0; i<m;++i)
{
for(j = 0; j<n; ++j)
{
printf("请输入 matrix[%d][%d] 值: ", i, j);
scanf("%d", &v);
matrix[i][j] = v;
}
}
//打印数组信息
printf("打印matrix的数组信息:\n");
for(i = 0; i<m; ++i)
{
for(j = 0; j<n; ++j)
{
printf("%d\t", matrix[i][j]);
}
printf("\n");
}
returnSize = n;
returnColumnSizes = (int *)malloc(sizeof(int) * (returnSize));
if(returnColumnSizes==NULL) return -1;
memset(returnColumnSizes, 0, returnSize * sizeof(int));
int **result = transpose(matrix, matrixSize, matrixColSize, &returnSize, &returnColumnSizes);
//打印数组信息
printf("打印转置后matrix的数组信息:\n");
for(i = 0; i<n; ++i)
{
for(j = 0; j<m; ++j)
{
printf("%d\t", result[i][j]);
}
printf("\n");
}
//释放分配的内存地址
for(i = 0; i<m; ++i)
{
free(matrix[i]);
}
free(matrix);
free(matrixColSize);
free(returnColumnSizes);
return 0;
}