#include <iostream>
using namespace std;
#define MAXSIZE 1000
typedef struct
{
int value;
int i; //元素的行
int j; //元素的列
}Tripe;
typedef struct
{
Tripe data[MAXSIZE+1];
int mu; //矩阵的行数
int nu; //矩阵的列数
int tu; //矩阵的非零元个数
}TSMatrix;
//矩阵的快速转置函数
TSMatrix FastTransposeSMatrix(TSMatrix M,TSMatrix &T)
{
//将M矩阵的行列数以及非零元个数传递给矩阵T
T.nu=M.mu;
T.mu=M.nu;
T.tu=M.tu;
int num[100]; //存储每一列的非零元的个数
int cpot[100]; //存储每一列第一个非零元的位置
if (T.tu)
{
//初始化存储非零元个数的数组
for (int i=1;i<=M.nu;i++)
{
num[i]=0;
}
//求出每一列非零元的个数
for (int i=1;i<=M.tu;i++)
{
++num[M.data[i].j];
}
//求出每一列的第一个非零元的位置
cpot[1]=1;
for (int col=2;col<=M.nu;col++)
{
cpot[col]=cpot[col-1]+num[col-1];
}
//以此将矩阵的行和列进行转置
for (int q=1;q<=M.tu;q++)
{
int col=M.data[q].j;
int p=cpot[col];
T.data[p].i=M.data[q].j;
T.data[p].j=M.data[q].i;
T.data[p].value=M.data[q].value;
++cpot[col];
}
}
return T;
}
void main()
{
TSMatrix matrix,matrixtest;
cout<<"请输入矩阵的行数:";
cin>>matrix.mu;
cout<<"请输入矩形的列数:";
cin>>matrix.nu;
cout<<"请输入矩形的非零元个数:";
cin>>matrix.tu;
cout<<"输入矩阵的行和列以及行列所对应的元素的值:"<<endl;
for (int i=1;i<=matrix.tu;i++)
{
cin>>matrix.data[i].i;
cin>>matrix.data[i].j;
cin>>matrix.data[i].value;
}
FastTransposeSMatrix(matrix,matrixtest);
cout<<endl;
cout<<"转置后的矩阵的行列数以及对应的值:"<<endl;
for (int i=1;i<=matrix.tu;i++)
{
cout<<matrixtest.data[i].i<<" ";
cout<<matrixtest.data[i].j<<" ";
cout<<matrixtest.data[i].value<<" ";
cout<<endl;
}
}
数据结构之稀疏矩阵的快速转置
最新推荐文章于 2022-08-15 10:08:33 发布