1. 程式人生 > 實用技巧 >寫一函式,將一個3x3的整型矩陣轉置

寫一函式,將一個3x3的整型矩陣轉置

寫一函式,將一個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;
}