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

 拿n=4做实验

指针

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

#include
#include
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


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

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

 指针数组

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

#include
#include
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

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

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

内层j

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

数组指针 

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

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

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

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

#include
#include
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的首地址给指针pcout << "转置后的结果为:" << 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行的首地址


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章