c - 请帮我转置 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");
}
}
}
解决方案
您将所有值交换两次,并且在第二次交换后打印行首的值。第一次交换发生在i
等于1
和2
假设您一开始就有这个矩阵:
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