Похоже, все, что вы забыли сделать, это на самом деле использовать транспонированную матрицу. Все, что я сделал, это изменил сигнатуру функции и возвратил матрицу, которую вы уже распределили и которой вы манипулировали, и я получил результат, который вы искали.
#include <stdio.h>
#include <stdlib.h>
int** transpose(int *r,int *c, int **matrix);
void printMatrix(int r, int c, int **matrix) {
for (size_t i = 0; i < r; ++i){
for (size_t j = 0; j < c; ++j) {
printf("%2d ",matrix[i][j]);
}
printf("\n");
}
}
int main()
{
int r = 3;
int c = 2;
int **matrix = calloc(sizeof(int*), r);
for (size_t i = 0; i < r; ++i) {
matrix[i] = calloc(sizeof(int), c);
}
for (size_t i = 0; i < r; ++i) {
for (size_t j = 0; j < c; ++j) {
matrix[i][j] = (3 * i + 2 * j) % 8 + 1;
}
}
printf("Before transpose:\n");
printMatrix(r, c, matrix);
int** newMatrix = transpose(&r, &c ,matrix);
printMatrix(r, c, newMatrix);
return EXIT_SUCCESS;
}
int** transpose(int *r, int *c, int **matrix) {
int newR = *c;
int newC = *r;
int **newMatrix = calloc((sizeof(int*)), newR);
for (size_t i = 0; i < newR; ++i) {
newMatrix[i] = (int*) malloc(newC*(sizeof(int)));
}
for (size_t i = 0; i < newR; ++i) {
for (size_t j = 0; j < newC; ++j) {
newMatrix[i][j] = matrix[j][i];
}
}
*c = newC;
*r = newR;
matrix = calloc(sizeof(int*), *r);
for (size_t i = 0; i < *r; ++i) {
matrix[i] = calloc(sizeof(int), *c);
}
for (size_t i = 0; i < newR; ++i) {
for (size_t j = 0; j < newC; ++j) {
matrix[i][j] = newMatrix[i][j];
}
printf("\n");
}
return newMatrix;
}
Выход:
1 4 7
3 6 1
Я изменил несколько вещей, особенно потому, что я предпочитаю использовать calloc
вместо malloc
, поскольку он обнуляет вновь выделенную память, и есть специальный параметр для размера запрошенной памяти, который я считаю семантически это лучшая идея.
В качестве примечания: вам не нужно приводить результат malloc
в C. Я, как мне кажется, склонен чувствовать это сильнее, чем другие люди, потому что кодовый шум, особенно когда вы работаете в С - одна из худших вещей, которые вы можете сделать для себя. Это довольно хороший пример этого, так как все, что я сделал, это переформатировал ваш код, и ответ был тут же. Не скупитесь на пробелы; это действительно имеет значение.
В любом случае, я надеюсь, что это чем-то помогло, даже если у вас в буквальном смысле все было сделано.