稀疏矩阵有三种表示方式:1,三元组顺序表 2,行逻辑连接的顺序表 3,十字链表。
矩阵的一个非零元可以由一个三元组(i,j,e)唯一确定,由此稀疏矩阵可以由表示非零元的三元组及其行列数唯一确定。下面代码为以三元组顺序表为存储结构的基本操作,其中快速转置的思想是预先确定原矩阵的每一列的非零元个数,在执行转置时候可以随即插入。
//三元组顺序表来存储矩阵并进行矩阵的转置
typedef int Elemtype ;
const int MAXSIZE=12500;
const int MAXNUM=20;
typedef struct{
int i,j; //该非零元的行下标和列下标
Elemtype e; //非零的值
} Triple;
typedef struct{
Triple data[MAXSIZE+1]; //非零元的三元组表,data【0】未使用
int mu,nu,tu; //分别表示矩阵行数,列数,非零元的个数
}TSMatrix;
//初始化三元组顺序表并输入行数和列数和非零元的个数
Status InitTSMatrix(TSMatrix & M,int mu,int nu,int tu){
if(tu>(mu*nu)) return ERROR;
M.mu=mu; M.nu=nu; M.tu=tu;
int i,j,e;
for(int k=1;k<=M.tu;++k){
cout<<"Please input the 'rownumber' 'colnumber' and 'the value' of number "<<k<<":";
cin>>i>>j>>e;
if(i>0&&i<=mu&&j>0&&j<=nu){
M.data[k].i=i;
M.data[k].j=j;
M.data[k].e=e;
}else return ERROR;
}
return OK;
}
Status TransposeSTMatrix(TSMatrix M,TSMatrix &T){
T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if(!T.tu) return ERROR;
int q=1;
for(int col=1;col<=M.nu;++col){
for(int p=1;p<=M.tu;++p){
if(M.data[p].j==col){
T.data[q].i=M.data[p].j;
T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e;
++q;
}
}
}
return OK;
}
//快速转置矩阵方法
Status FastTransposeSMatrix(TSMatrix M,TSMatrix & T){
//采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if(!T.tu) return ERROR;
int num[MAXNUM];//?????
for(int col=1;col<=M.nu;++col) num[col]=0;
for(int t=1;t<=M.tu;++t) ++num[M.data[t].j];
int cpot[MAXNUM];
cpot[1]=1;
//求第col列中第一个非零元在T.data中的序号
for(int col=2;col<=M.nu;++col)
cpot[col]=cpot[col-1]+num[col-1];
int q,col;
for(int p=1;p<=M.tu;++p){
col=M.data[p].j; q=cpot[col];
T.data[q].i=M.data[p].j;
T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e;
++cpot[col];
}
return OK;
}
void DisTRSMatrix(TSMatrix m){
cout<<"The TSMatrix is:"<<endl;
for(int k=1;k<=m.tu;++k){
cout<<m.data[k].i<<" "<<m.data[k].j<<" "<<m.data[k].e<<endl;
}
}
int main()
{
TSMatrix m,t;
InitTSMatrix(m,6,7,8);
//TransposeSTMatrix(m,t);
FastTransposeSMatrix(m,t);
DisTRSMatrix(t);
return 0;
}