/*sparseMatrix.h*/
#include "stdio.h"
#include "stdlib.h"
#define SIZE 100
typedef struct
{
int i,j,val;
}Trip;
typedef struct{
Trip data[SIZE];
int row,col,num;
}SMatrix;
void create(SMatrix *matrix)
{
int i, x, y, e;
printf("Please input the spare matrix's row and cow:\n");//提示输入行列数
scanf("%d %d", &matrix->row, &matrix->col);
printf("Please input the number of nonzero value:\n");//提示输入非零元素个数
scanf("%d", &matrix->num);
//开始创建三元组
printf("Please input the row and cow of nonzero:\n");
for (i = 1; i<=matrix->num; i++)
{
scanf("%d %d %d", &x, &y, &e);//输入非零元素的行,列,和非零值。
matrix->data[i].i=x;
matrix->data[i].j=y;
matrix->data[i].val=e;
}
}
void Tranverse(SMatrix matrix,SMatrix* tran_res)
{//稀疏矩阵的转置,一个M*N的稀疏矩阵,转置为N*M的矩阵
int cnum[SIZE];//列非零元素的个数
int cpot[SIZE];//列的起始位置
int i,p;
for(i=0;i<=matrix.col;i++)
{
cnum[i]=0;
cpot[i]=1;
}
tran_res->col = matrix.row;//转置后的行数等于原来的列数
tran_res->row = matrix.col;//转置后的列数等于原来的行数
tran_res->num= matrix.num;//非零元素个数不变
for (i = 1; i <= matrix.num; i++)//计算每列的非零元素的个数
{
cnum[matrix.data[i].j]++;
}
for (i=1; i <= matrix.col; ++i)
{//计算每列的非零元素的起始位置
cpot[i] = cpot[i - 1] + cnum[i - 1];
}
//转置运算
for (i = 1; i <= matrix.num;++i)
{
p = cpot[matrix.data[i].j]++;//p为转置后该列在矩阵中的位置
tran_res->data[p].i=matrix.data[i].j;//行列互换
tran_res->data[p].j=matrix.data[i].i;
tran_res->data[p].val=matrix.data[i].val;
}
}
void printMatrix(SMatrix matrix)
{
int i,j;
int arr[SIZE][SIZE];
for(i=0;i<=matrix.row;i++)
for(j=0;j<=matrix.col;j++)
arr[i][j]=0;
for (i = 1; i <= matrix.num; ++i) {
arr[matrix.data[i].i][matrix.data[i].j] = matrix.data[i].val;
}
printf("The spare matrix is:\n");
for (i = 1; i <= matrix.row; ++i)
{
for (j = 1; j <=matrix.col; ++j)
printf("%d ", arr[i][j]);
printf("\n");
}
}
SMatrix *MulSMatrix (SMatrix *A, SMatrix *B)
{ SMatrix *C; /* 乘积矩阵的指针 */
int p,q,i,j,k,r,t;
int *temp;
int *num,*rpot;
temp=(int *)malloc(sizeof(int)*(B->col+1));
num=(int *)malloc(sizeof(int)*(B->row+1));
rpot=(int *)malloc(sizeof(int)*(B->row+1));
if (A->col!=B->row) return NULL; /*A的列与B的行不相等*/
C=(SMatrix *)malloc(sizeof(SMatrix)); /*申请C矩阵的存储空间*/
C->row=A->row; C->col=B->col;
if (A->num*B->num==0)
{ C->num=0;
return C;
}
for (i=1;i<= B->row;i++)
num[i]=0;
for(k=1;k<=B->num;k++)
{
i= B->data[k].i; num[i]++;
} /*求矩阵B中每一行非零元素的个数*/
rpot[1]=1; /*求矩阵B中每一行第一个非零元素在B.data中的位置*/
for (i=2;i<=B->row;i++)
rpot[i]= rpot[i-1]+num[i-1];
r=0;
p=1;
for ( i= 1;i<=A->row; i++)
{
for (j=1;j<=B->col;j++)
temp[j]=0;
while(A->data[p].i==i)
{
k=A->data[p].j;
if (k
row)
t=rpot[k+1];
else
t=B->num+1;
for(q=rpot[k];q
{
j=B->data[q].j;
temp[j]+=A->data[p].val*B->data[q].val;
} /* B中第k行的每一个非零元素*/
p++;
}
for (j=1;j<=B->col;j++)
if (temp[j])
{
r++;
C->data[r].i=i;
C->data[r].j=j;
C->data[r].val=temp[j];
}
}
C->num=r;
return C;
}
#include "sparsematrix.h"
void main()
{
SMatrix M, N,Q,*P;
int i;
create(&M);
printMatrix(M);
Tranverse(M,&N);
printMatrix(N);
create(&Q);
P=MulSMatrix(&M,&Q);
printMatrix(*P);
}