转置n*n矩阵(3种方法)

本文介绍如何使用不同类型的指针(指针数组、数组指针)来实现矩阵的转置操作,包括具体的C++代码实现及解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 拿n=4做实验

指针

因为指针是完全的一维的,所以交换元素只有一种方法(指针数组和数组指针有三种)

#include<iostream>
#include<iomanip>
using namespace std;
void trans(int* p, int n);
int main()
{
	const int n = 4;
	int a[n][n];
	int i = 0, j = 0;
	cout << "请输入4*4矩阵:" << endl;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			cin >> a[i][j];
		}
	}
	int* p = a[0]; 
    trans(p,n);
	cout << "转置后的结果为:" << endl;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			cout << setw(4) << a[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}
void trans(int* p, int n)
{
	int i = 0, j = 0;
	for (i = 0; i < n; i++)
    {
         //注意这里必须写j<i
		//只需要右上方一半与左下方一半交换
		//写成j<isize会在转置后再转置
		//变成没转置时的情况
        for (j = 0; j < i; j++)
		{
			int temp = *(p + n * i + j);//*q是a[0]的地址
			*(p + n * i + j) = *(p + n * j + i);
			*(p + n * j + i) = temp;
		}
	}

}


    trans(p, n);   //也可以写成  trans((int *)a, n)

 将a的首地址强制转化为指针,并赋给形参*p

 指针数组

这种在输入n的时候要同时输入n行每行的首地址,也就是a[0],a[1],a[2].....

#include<iostream>
#include<iomanip>
using namespace std;
void trans(int* p[], int n);
int main()
{
    const int n=4;
	int a[n][n];
	int i = 0, j = 0;
	cout << "请输入4*4矩阵:" << endl;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			cin >> a[i][j];
		}
	}
	int* p[n] = { a[0],a[1],a[2],a[3] };
	trans(p, n);
	cout << "转置后的结果为:" << endl;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			cout << setw(4) << a[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}
void trans(int* p[], int n)
{
	int i = 0, j = 0;
	for (i = 0; i < n; i++)//因为是使用下标,所以是n-1
	{
		for (j = 0; j < i; j++)
		{   //这三种交换方法都可以
			int temp = *(*p + n * i + j);//*q是a[0]的地址
			*(*p + n * i + j) = *(*p + n * j + i);
			*(*p + n * j + i) = temp;

			/*int temp = p[i][j];
			p[i][j] = p[j][i];
			p[j][i] = temp;*/

			/*int temp = *(p[i] + j);
			*(p[i] + j) = *(p[j] + i);
			*(p[j] + i) = temp;*/
		}
	}

}

注意外层i<n,a[3][2]与a[2][3]需要完成交换

这两个按线性排列分别是a[11]和a[14]

2*4+3=11    4*3+2=14  所以需要3这个数

内层j<i,因为转置只需要一半,因为最后一个a[3][3]不需要与自己交换

---------------------------------------------------------------------------------------------------------------------------------

数组指针 

形如 int (*p)[4]的是数组指针,指向一个数组

指向二维数组时,(*p)后面的括号对应二维数组的列数

这种方法是直接将a每行的首地址给数组指针p,根据[]中对应的列与二维数组一一对应

通过知道每行的首地址,在行的地址上加列的数,即可得到元素

#include<iostream>
#include<iomanip>
using namespace std;
void trans(int(*p)[4]);
int main()
{
	const int n = 4;
	int a[n][n];
	int i = 0, j = 0;
	cout << "请输入4*4矩阵:" << endl;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			cin >> a[i][j];
		}
	}
	trans(a);//直接将a的首地址给指针p
	cout << "转置后的结果为:" << endl;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			cout << setw(4) << a[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}
void trans(int(*p)[4])//@这里方框里必须是一个确定的数,也就是数组的列数
{
	int i = 0, j = 0;
	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < i; j++)
		{
			/*int temp = *(*p + n * i + j);//*q是a[0]的地址
			*(*p + n * i + j) = *(*p + n * j + i);
			*(*p + n * j + i) = temp;*/

			/*int temp = p[i][j];
			p[i][j] = p[j][i];
			p[j][i] = temp;*/

			int temp = *(p[i] + j);
			*(p[i] + j) = *(p[j] + i);
			*(p[j] + i) = temp;
		}
	}

}

p[i]代表的是数组第i行的首地址

### 实现 n×m 整型矩阵转置 对于任意大小为 \(n \times m\) 的整型矩阵,可以采用多种方式来实现其转置。下面介绍一种通用的方法,并提供相应的 C 语言代码示例。 #### 方法概述 为了处理不同尺寸的矩形矩阵,在定义数组时应考虑动态分配内存以适应不同的行列数。通过遍历原矩阵中的每一个元素并将其放置到新位置上,即可完成整个矩阵转置过程[^1]。 #### 示例代码 以下是使用C语言编写的程序片段,用于展示如何创建一个函数 `transposeMatrix` 来接收两个参数——原始矩阵及其维度信息(n,m),并将该矩阵按列优先顺序存储至另一个二维数组中: ```c #include <stdio.h> #include <stdlib.h> void transposeMatrix(int **src, int srcRows, int srcCols, int **dest){ for (int row = 0; row < srcRows; ++row) { for (int col = 0; col < srcCols; ++col) { dest[col][row] = src[row][col]; } } } // 测试部分 int main(){ const int rows = 3; const int cols = 4; // 初始化源矩阵 int matrixA[rows][cols]={ {1 ,2 ,3 ,4}, {5 ,6 ,7 ,8}, {9,10,11,12} }; // 动态分配目标矩阵空间 int *matrixB[cols]; for(int i=0;i<cols;++i){ matrixB[i]=(int*)malloc(rows*sizeof(int)); } // 调用转置函数 transposeMatrix((int**)matrixA, rows, cols, matrixB); // 打印结果 puts("Transposed Matrix:"); for(int r=0;r<cols;++r){ for(int c=0;c<rows;++c){ printf("%d ",matrixB[r][c]); } putchar(&#39;\n&#39;); } // 清理资源 for(int i=0;i<cols;++i){ free(matrixB[i]); } return 0; } ``` 此段代码展示了完整的流程,包括初始化输入数据、调用转置算法以及释放不再使用的内存区域。注意这里假设了行数小于等于列数的情况;如果实际情况相反,则需相应调整逻辑[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值