#867 转置矩阵

#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;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值