1.菜鸟版:二维数组存储矩阵 并实现矩阵转置
int m,n;
cout<<"请输入行数 列数:"<<endl;
cin>>m>>n;
int a[max][max]={0};
int res[max][max]={0};
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
res[j][i]=a[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cout<<res[i][j]<<' ';
}
cout<<endl;
}
结果:
2.进阶版(稀疏矩阵):用三元组存储矩阵的非零元素
三元组(是个结构体):一个数组+矩阵的行数+列数+非零元素的个数
三元组的元素(也就是存在数组里的元素,也是个结构体):矩阵中非零元素的行下标、列下标以及数值
(mu:矩阵的行数 nu:矩阵的列数)
#define SMAX 1000
typedef struct
{
int i,j; //储存非零元素的行和列信息
datatype v; //非零元素的值
}SPNode; //数组里的元素
typedef struct
{
int mu,nu,tu; //矩阵的行、列和非零元素的个数
SPNode data[SMAX+1]; //三元组数组,第0位不用
}SPMatrix;
原本的三元组:先存第一行的元素,再存第二行的元素…
那么要如何存储到转置后的三元组数组里呢?
理论上说,只需要将原本元素的行和列交换一下,存储到新的三元组里即可,但是问题是,这样并不方便我们在新的三元组里找到它的位置,比如,【1,2,14】和【1,5,-5】这两个元素,第一个转置之后跑到了第二行去,第二个元素转置后跑到了第五行去,暂时好像没看出什么能在转置后的矩阵中快速找到它们的规律呢!
①遍历 原三元组的 列,得出每列有几个元素(由下图可知,第一列有1个元素,第二列有2个元素,第三列0个,第四列1个,第五列1个),所以转置后的矩阵,第一行有1个元素,第二行有2个元素,第三行0个,第四行1个,第五行1个
②在新的数组中,第一行首元素存在数组第一个的位置,第二行首元素存在第一行首元素地址+第一行元素个数的位置…以此类推。也就是说,只要统计好原矩阵中每一列的元素个数(也就是转置后的矩阵中每一行的元素个数),就可以知道转置后矩阵中每一行的起始地址。
cpot数组用于储存 转置后的矩阵 每一行的起始位置(=上一行的起始位置+上一行的元素个数)
代码: