#ifndef MATRIX_H_#define MATRIX_H_#include<stdbool.h>#define MAXSIZE 12500#define MAXRC 500typedefint Elem;typedefstruct{int i, j;
Elem e;}Triple;typedefstruct{
Triple data[MAXSIZE];int rpos[MAXRC];int*num;int*cpot;int mu, nu, tu;}Matrix;/*create a matrix*/voidCreateMatrix(Matrix *M);/*destroy the matrix*/voidDestroyMatrix(Matrix *M);/*print the matrix*/voidPrintMatrix(Matrix M);/*return the matrix transpose of a given matrix*/
bool TransposeMatrix(Matrix M, Matrix *T);/*take the product of the sparse matrix Q=M*N*/
bool MultiMatrix(Matrix M, Matrix N, Matrix *T);#endif
Matrix.c
#include"Matrix.h"#include<stdio.h>#include<stdlib.h>#include<string.h>/*create a matrix*/voidCreateMatrix(Matrix *M){int m, n, t;scanf("%d%d%d",&m,&n,&t);//scanf("%d", &n);//scanf("%d", &t);
M->mu = m;
M->nu = n;
M->tu = t;//printf("%d\n", M->tu);
Triple T;
bool k;int i;scanf("%d%d%d",&T.i,&T.j,&T.e);do{
k =0;if(T.i <1|| T.i > M->mu || T.j <1|| T.j > M->nu){
k =1;printf("wrong input !\nplease enter again! \n");scanf("%d%d%d",&T.i,&T.j,&T.e);}}while(k);
M->data[0]= T;// printf("%d\n",M->data[0].i);for(i =1; i < M->tu; i++){scanf("%d%d%d",&T.i,&T.j,&T.e);do{
k =0;if(T.i <1|| T.i > M->mu || T.j <1|| T.j > M->nu || T.i < M->data[i-1].i ||(T.i == M->data[i-1].i && T.j <= M->data[i-1].j)){
k =1;printf("wrong input !\nplease enter again! \n");scanf("%d%d%d",&T.i,&T.j,&T.e);}}while(k);
M->data[i]= T;}
M->num =(int*)malloc(M->nu*sizeof(int));
M->cpot =(int*)malloc(M->nu*sizeof(int));memset(M->num,0x0, M->nu*sizeof(int));memset(M->cpot,0x0, M->nu*sizeof(int));for(i =0; i < M->tu; i++){
M->num[M->data[i].j -1]++;}
M->cpot[0]=1;for(i =1; i < M->nu; i++){
M->cpot[i]= M->cpot[i-1]+ M->num[i-1];}
M->rpos[0]=1;int Num[M->mu];memset(Num,0x0, M->mu*sizeof(int));for(i =0; i < M->tu; i++){
Num[M->data[i].i-1]++;}/*for(i = 1 ; i < M->mu ; i++) {
printf("%d\n",Num[i-1]);
}*/for(i =1; i < M->mu ; i++){
M->rpos[i]= M->rpos[i-1]+ Num[i-1];}/*for (i = 1; i < M->tu; i++) {
if (M->data[i].i > M->data[i-1].i) {
M->rpos[M->data[i].i-1] = i + 1;
}
}*//*for (i = 1; i < M->tu; i++) {
if (M->data[i].i > M->data[i-1].i+1) {
int m = M->data[i].i - M->data[i-1].i;
for (int a = M->data[i-1].i + 1; a < M->data[i].i; i++) {
M->rpos[a-1] = M->rpos[M->data[i-1].i-1];
}
}
}*/}/*destroy the matrix*/voidDestroyMatrix(Matrix *M){
M->mu =0;
M->tu =0;
M->nu =0;free(M->num);free(M->cpot);}/*print the matrix*/voidPrintMatrix(Matrix M){int i;printf("%d行%d列%d个非零元素。\n",M.mu,M.nu,M.tu);printf("行 列 元素值\n");for(i=0;i<M.tu;i++)printf("%2d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);for(i=1;i<=M.mu;i++)printf("第%d行的第一个非零元素是本矩阵第%d个元素\n",i,M.rpos[i-1]);for(i=1;i<=M.nu;i++)printf("第%d列的元素个数为%d\n",i,M.num[i-1]);for(i=1;i<=M.nu;i++)printf("第%d列的第一个元素的位置是%d\n",i,M.cpot[i-1]);}/*return the matrix transpose of a given matrix*/
bool TransposeMatrix(Matrix M, Matrix *T){
Matrix A;
A = M;
T->nu = A.mu;
T->mu = A.nu;
T->tu = A.tu;for(int i =0; i < T->tu; i++){
T->data[A.cpot[A.data[i].j-1]-1].i = A.data[i].j;
T->data[A.cpot[A.data[i].j-1]-1].j = A.data[i].i;
T->data[A.cpot[A.data[i].j-1]-1].e = A.data[i].e;
A.cpot[A.data[i].j-1]++;}
T->num =(int*)malloc(T->nu*sizeof(int));
T->cpot =(int*)malloc(T->nu*sizeof(int));memset(T->num,0x0, T->nu*sizeof(int));memset(T->cpot,0x0, T->nu*sizeof(int));int i =0;for(i =0; i < T->tu; i++){
T->num[T->data[i].j -1]++;}
T->cpot[0]=1;for(i =1; i < T->nu; i++){
T->cpot[i]= T->cpot[i-1]+ T->num[i-1];}
T->rpos[0]=1;int Num[T->mu];memset(Num,0x0, T->mu*sizeof(int));for(i =0; i < T->tu; i++){
Num[T->data[i].i-1]++;}}/*take the product of the sparse matrix Q=M*N*/
bool MultiMatrix(Matrix M, Matrix N, Matrix *T){if(M.nu != N.mu)return0;
T->mu = M.mu;
T->nu = N.nu;
T->tu =0;if(M.tu*N.tu !=0)for(int arow =1; arow <= M.mu; arow++){int ctemp[N.nu];memset(ctemp,0x0, N.nu*sizeof(int));
T->rpos[arow-1]= T->tu+1;int tp =0;if(arow < M.mu)
tp = M.rpos[arow];else
tp = M.tu +1;for(int p = M.rpos[arow-1]; p < tp; p++){int t = M.data[p-1].j;int pause;if(t < N.mu)
pause = N.rpos[t];else
pause = N.tu +1;for(int m = N.rpos[t-1]; m < pause; m++){
ctemp[N.data[m-1].j-1]+= M.data[p-1].e*N.data[m-1].e;}}for(int i =0; i < N.nu; i++){if(ctemp[i]!=0){
T->data[T->tu].i = arow;
T->data[T->tu].j = i +1;
T->data[T->tu].e = ctemp[i];
T->tu++;}}}
T->num =(int*)malloc(T->nu*sizeof(int));
T->cpot =(int*)malloc(T->nu*sizeof(int));memset(T->num,0x0, T->nu*sizeof(int));memset(T->cpot,0x0, T->nu*sizeof(int));for(int i =0; i < T->tu; i++){
T->num[T->data[i].j -1]++;}
T->cpot[0]=1;for(int i =1; i < T->nu; i++){
T->cpot[i]= T->cpot[i-1]+ T->num[i-1];}return1;}
main.c
#include<stdio.h>#include"Matrix.h"int main (){
Matrix M;
Matrix N;
Matrix A;CreateMatrix(&M);CreateMatrix(&N);PrintMatrix(M);PrintMatrix(N);TransposeMatrix(M,&A);PrintMatrix(A);
Matrix T;MultiMatrix(M,N,&T);PrintMatrix(T);DestroyMatrix(&A);DestroyMatrix(&T);DestroyMatrix(&M);DestroyMatrix(&N);return0;}