寫一函式,將一個3x3的整型矩陣轉置
阿新 • • 發佈:2020-07-27
寫一函式,將一個3x3的整型矩陣轉置
解題思路: 矩陣轉置就是行變列,列變行,說白了就是 arry[i][j] 轉換為 arry[j][i] ; 但是需要注意的是,
一. 因為行列個數可能並非相同,轉換後行數或者列數變多了或者變少,因此不能直接轉換。需要重新申請空間儲存轉換後的資料。
二. 二維陣列是線性扁平化儲存的,無法確定列數的情況下傳參後,在函式中使用時需要頭指標向後偏移 列數*第n行 才能訪問到第n行的資料。例如在函式中訪問 arry[i][j] ,需要通過arry + col_num*i + j 方式進行訪問。
答案:
#include <stdio.h> int **transform(int **arry, int row_count, int col_count) { //列變行,行變列,則行的個數是以前列的個數,列的個數是以前行的個數 int **p = NULL; //矩陣中有多少行,取決於以前有多少列,然後申請地址空間 p = (int **)malloc(sizeof(int *) * col_count); for (int i = 0; i < col_count; i++) { //一行中有多少列,取決於以前有多少行,然後申請空間 p[i] = (int *)malloc(sizeof(int) * row_count); } for (int i = 0; i < col_count; i++) { for (int j = 0; j < row_count; j++) { //二維陣列的儲存是扁平化的, 訪問第j行第i列的資料,應該是 arry + j*列數 + i //j是新陣列的列,但是是源陣列的行 p[i][j] = (arry + col_count * j)[i]; } } return p; } int main() { int arry[3][4]; printf("Please enter a 3 x 4 matrix: \n"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { scanf_s("%d", &arry[i][j]); } } int **p = transform(arry, 3, 4); printf("\n"); for (int i = 0; i < 4; i++) { for (int j = 0; j < 3; j++) { printf("%d ", p[i][j]); } free(p[i]); // 釋放二級指標中每個一級指標申請的空間 printf("\n"); } free(p);//釋放總體二級指標的空間 system("pause"); return 0; }