[c]代码库
define SMAX 1024 /*一个足够大的数*/
typedef struct
{
int i,j; /*非零元素的行、列*/
datatype v; /*非零元素值*/
} SPNode; /*三元组类型*/
typedef struct
{
int mu,nu,tu; /*矩阵的行、列及非零元素的个数*/
SPNode data[SMAX]; /*三元组表*/
} SPMatrix; /*三元组表的存储类型*/
SPMatrix *MulSMatrix ( SPMatrix *A, SPMatrix *B )
/*稀疏矩阵A(m1× n1)和B(m2× n2) 用三元组表存储,求A×B */
{
SPMatrix *C; /* 乘积矩阵的指针*/
int p,q,i,j,k,r;
datatype temp[n+1];
int num[B->nu+1],rpot[B->nu+1];
if ( A->nu!=B->mu ) return NULL; /*A 的列与B 的行不相等*/
C=malloc ( sizeof ( SPMatrix ) ); /*申请C 矩阵的存储空间*/
C->mu=A->mu;
C->nu=B->nu;
if ( A->tu*B->tu==0 ) {C->tu=0; return C; }
for ( i=1; i<= B->mu; i++ ) num[i]=0; /*求矩阵B 中每一行非零元素的个数*/
for ( k=1; k<=B->tu; k++ )
{
i= B->data[k].i;
num[i]++;
}
rpot[1]=1; /*求矩阵B 中每一行第一个非零元素在B.data 中的位置*/
for ( i=2; i<=B->mu; i++ )
rpot[i]= rpot[i-1]+num[i-1];
r=0; /*当前C 中非零元素的个数*/
p=1; /*指示A.data 中当前非零元素的位置*/
for ( i= 1; i<=A->mu; i++ )
{
for ( j=1; j<=B->nu; j++ ) temp[j]=0; /*cij 的累加器初始化*/
while ( A->data[p].i==i ) ./*求第i 行的*/
{ k=A->data[p].j; /*A 中当前非零元的列号*/
if ( k<B->mu ) t=rpot[k+1];
else t=B->tu+1; /*确定B 中第k 行的非零元素在B.data 中的下限位置*/
for ( q=rpot[k]; q<t; q++; ) /* B 中第k 行的每一个非零元素*/
{
j=B->data[q].j;
temp[j]+=A->data[p].v * B->data[q].v
}
p++;
} /* while */
for ( j=1; j<=B->nu; j++ )
if ( temp[j] )
{
r++;;
C->data[r]={i,j,temp[j] };
}
} /*for i*/
C->tu=r;
return C;
}/* MulSMatrix */