设m*n 矩阵中有t 个非零元素且t<
将三元组按行优先的顺序,同一行中列号从小到大的规律排列成一个线性表,称为三元组表,采用顺序存储方法存储该表。如图5.11 稀疏矩阵对应的三元组表为图5.12。
显然,要唯一的表示一个稀疏矩阵,还需要存储三元组表的同时存储该矩阵的行、列,为了运算方便,矩阵的非零元素的个数也同时存储。这种存储的思想实现如下:
define SMAX 1024 /*一个足够大的数*/
typedef struct
{ int i,j; /*非零元素的行、列*/
datatype v; /*非零元素值*/
}SPNode; /*三元组类型*/
typedef struct
{ int mu,nu,tu; /*矩阵的行、列及非零元素的个数*/
SPNode data[SMAX]; /*三元组表*/
} SPMatrix; /*三元组表的存储类型*/
这样的存储方法确实节约了存储空间,但矩阵的运算从算法上可能变的复杂些。下面我们讨论这种存储方式下的稀疏矩阵的两种运算:转置和相乘。
1.稀疏矩阵的转置
设SPMatrix A; 表示一m*n 的稀疏矩阵,其转置B 则是一个n*m 的稀疏矩阵,因此也有SPMatrix B; 由A 求B 需要:
A 的行、列转化成B 的列、行;
将A.data 中每一三元组的行列交换后转化到B.data 中;
看上去以上两点完成之后,似乎完成了B,没有。因为我们前面规定三元组的是按一行一行且每行中的元素是按列号从小到大的规律顺序存放的,因此B
也必须按此规律实现,A 的转置B 如图5.13 所示,图5.14 是它对应的三元组存储,就是说,在A 的三元组存储基础上得到B
的三元组表存储(为了运算方便,矩阵的行列都从1 算起,三元组表data 也从1 单元用起)。
算法思路:
①A 的行、列转化成B 的列、行;
②在A.data 中依次找第一列的、第二列的、直到最后一列,并将找到的每个三元组的行、列交换后顺序存储到B.data 中即可。
算法如下:
void TransM1 (SPMatrix *A)
{ SPMatrix *B;
int p,q,col;
B=malloc(sizeof(SPMatrix)); /*申请存储空间*/
B->mu=A->nu; B->nu=A->mu; B->tu=A->tu;
/*稀疏矩阵的行、列、元素个数*/
if (B->tu>0) /*有非零元素则转换*/
{ q=0;
for (col=1; col&l