首页 > 解决方案 > 请帮我转置 C 中的矩阵(使用动态内存分配)

问题描述

我有这个任务来使用 C 中的动态内存分配来获取和转置矩阵

我通过将线性位置转换为 (i,j) 并交换 i,j 旧元素和新元素位置来做到这一点,这是完美的,不知何故,交换没有按我的预期工作,可能看起来我正在让其他问题为我解决,但此时我是空白的,所以非常感谢您的帮助

这是代码:

#include <stdio.h>
#include <stdlib.h>

int main(){
    int m,n;
    printf("Enter the order of matrix, m*n:\n");
    scanf("%d %d",&m,&n);

    int *matrix_ptr;
    matrix_ptr = (int *) malloc(m*n*sizeof(int));

    printf("Enter the elements of %d*%d matrix\n",m,n);
    for(int i=0; i<m*n; i++){
        scanf("%d", matrix_ptr+i);
    }

    // Transposing the matrix

    for(int i=0; i<m*n; i++){
        int i_index = i / n;
        int j_index = i % n;

        // (i_index)*n + j_index gives the linear position

        int new_linear_pos = (j_index)*n + i_index;

        int temp = *(matrix_ptr + new_linear_pos);
        *(matrix_ptr + new_linear_pos) = *(matrix_ptr + i);
        *(matrix_ptr + i) = temp;

        if(i==0){
            printf("\nThe transpose is:\n");
        }
        printf("%d ", *(matrix_ptr+i));
        if((i+1)%n == 0){
            printf("\n");
        }
    }
}

输出: 在此处输入图像描述

标签: cmatrix

解决方案


您将所有值交换两次,并且在第二次交换后打印行首的值。第一次交换发生在i等于12

假设您一开始就有这个矩阵:

1 2 3
4 5 6
7 8 9

将索引 0 与 0 交换保持不变。印刷1

将索引 1 与 3 交换:打印4

1 4 3
2 5 6
7 8 9

将索引 2 与 6 交换:打印7\n

1 4 7
2 5 6
3 8 9

将索引 3 与 1 交换:打印4

1 2 7
4 5 6
3 8 9

ETC...

解决方案是只交换一次元素。

最简单的解决方法是if (i > new_linear_pos) continue; //already swapped


推荐阅读