“ Ctrl AC!一起 AC!”
三元组:a[n][3]
第0行:总行数,总列数,非零元素个数
第i行:表示第i个元素的行,列,及其值
数据类型定义:
typedef struct node{
int data[100][100];
int m,n;
}matrix;
typedef int spmatrix[100][3]; // spmatrix = int [100][3]
将稀疏矩阵转换成其三元组表示:
void compressmatrix(matrix A,spmatrix B){
int i,j,k=1;
for(i=0;i<A.m;i++){
for(j=0;j<A.n;j++){
if(A.data[i][j]!=0){
B[k][0]=i;
B[k][1]=j;
B[k][2]=A.data[i][j];
k++;
}
}
}
B[0][0]=A.m;
B[0][1]=A.n;
B[0][2]=k-1;
}
稀疏矩阵三元组表示下转置运算的实现:
void transpmatrix(spmatrix B,spmatrix C){
int i,j,t,m,n;
int x[100]; //存放B中每列的非零元素的个数,因为列转后变成行
int y[100]; //存放转置后的每行第一个非零元素的位置
m=B[0][0];n=B[0][1];t=B[0][2];
C[0][0]=n;C[0][1]=m;C[0][2]=t;
if(t>0){
for(i=0;i<n;i++) x[i]=0; //初始化
for(i=1;i<=t;i++) x[B[i][1]]=x[B[i][1]]+1;
y[0]=1;
for(i=1;i<n;i++) y[i]=y[i-1]+x[i-1]; //某行第一个元素的位置等于上一行的初始位置加上一行元素个数
for(i=1;i<=t;i++){
j=y[B[i][1]];
C[j][0]=B[i][1];
C[j][1]=B[j][0];
C[j][2]=B[i][2];
y[B[i][1]]=j+1;
}
}
}
感谢阅读!!!
“ Ctrl AC!一起 AC!”
|