麻烦大家帮帮忙了,感激不尽
稀疏矩阵三元组的加法,乘法
#include<stdio.h>
typedef struct
{
int data[100][100];
int m,n;
}matrix;
typedef int spmatrix[100][3];
void compress(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 recompress(matrix *a,spmatrix b)
{
int i,j,k=1;
for (i=0;i<b[0][0];i++)
for (j=0;j<b[0][1];j++)
(*a).data [i][j]=0;
for (k=1;k<=b[0][2];k++)
(*a).data [b[k][0]][b[k][1]]=b[k][2];
}
void print(matrix *a)
{
int i,j;
for (i=0;i<(*a).m ;i++)
{ for(j=0;j<(*a).n ;j++)
printf("%-4d",(*a).data [i][j]);
putchar('\n');
}
}
void prints(spmatrix b)
{
int i;
for (i=0;i<=b[0][2];i++)
printf("%-5d%-5d%-6d\n",b[i][0],b[i][1],b[i][2]);
}
void mulit(matrix *a,matrix *b,matrix *c)
{
int i,j,k;
int s;
(*c).m=(*a).m;
(*c).n=(*b).n;
for (i=0;i<(*a).m;i++)
for (k=0;k<(*b).n;k++)
{ s=0;
for (j=0;j<(*a).n;j++)
s+=(*a).data [i][j]*(*b).data [j][k];
(*c).data [i][k]=s;
}
}
int getvalue(spmatrix a,int x,int y)
{
int z=1;
while ( ( a[z][0]!=x || a[z][1]!=y) && z<=a[0][2] )
z++;
if (z==a[0][2] +1) return 0;
else return a[z][2];
}
void mulits(spmatrix a,spmatrix b,spmatrix c)
{
int i,j,k,s,n=1;
for (i=0;i<a[0][0];i++)
for (k=0;k<b[0][1];k++)
{ s=0;
for (j=0;j<a[0][1];j++)
s+=getvalue(a,i,j) *getvalue(b,j,k);
if (s)
{
c[n][2]=s;
c[n][0]=i;
c[n][1]=k;
n++;
}
}
c[0][0]=a[0][0];
c[0][1]=b[0][1];
c[0][2]=n-1;
}
void add(matrix *a,matrix *b,matrix *c)
{
int i=0,j=0 ;
for (i=0;i<(*a).m ;i++)
for (j=0;j<(*a).n ;j++)
(*c).data [i][j]=(*a).data [i][j]+(*b).data [i][j];
(*c).m=(*a).m;
(*c).n=(*a).n;
}
void adds(spmatrix a,spmatrix b,spmatrix c)
{
int i=0,j=0,k=0;
while (i<=a[k][2] && j<=b[k][2])
{
if (a[i][0]==b[j][0])
{
if (a[i][1]<b[j][1])
{
c[k][0]=a[i][0];
c[k][1]=a[i][1];
c[k][2]=a[i][2];
i++;
}
else if (a[i][1]>b[j][1])
{
c[k][0]=b[j][0];
c[k][1]=b[j][1];
c[k][2]=b[j][2];
j++;
}
else
{
c[k][0]=a[i][0];
c[k][1]=a[i][1];
c[k][2]=a[i][2]+b[i][2];
i++;
j++;
}
}
else if (a[i][1]<b[j][1])
{
c[k][0]=a[i][0];
c[k][1]=a[i][1];
c[k][2]=a[i][2];
i++;
}
else
{
c[k][0]=b[j][0];
c[k][1]=b[j][1];
c[k][2]=b[j][2];
j++;
}
k++;
}
if (i==a[0][2])
for (i=j;j<=b[0][2];i++)
{
c[k][0]=b[j][0];
c[k][1]=b[j][1];
c[k][2]=b[j][2];
k++;
}
else if (j=b[0][2])
for (j=i;j<=a[0][2];j++)
{
c[k][0]=a[i][0];
c[k][1]=a[i][1];
c[k][2]=a[i][2];
k++;
}
c[0][0]=a[0][0];
c[0][1]=a[0][1];
c[0][2]=k-1;
}
int main(int argc, char* argv[])
{
int i,j;
matrix a,b,c;
spmatrix a0,b0,c0;
a.m=b.m=3;
a.n=b.n=3;
for(i=0;i<a.m;i++)
for (j=0;j<a.n;j++)
{ printf("a[%d][%d]=",i,j);
scanf("%d",&a.data [i][j]);
b.data [i][j]=a.data [i][j]-3;
}
printf("matrix a is \n");
print(&a);
printf("matrix b is \n");
print(&b);
compress(&a,a0);
compress(&b,b0);
printf("spmatrix a0 is \n");
prints(a0);
printf("spmatrix b0 is \n");
prints(b0);
add(&a,&b,&c);
printf("matrix c is \n");
print(&c);
adds(a0,b0,c0);
printf("spmatrix c0 is \n");
prints(c0);
printf("other test\n");
mulit(&a,&b,&c);
print(&c);
putchar('\n');
compress(&a,a0);
compress(&b,b0);
mulits(a0,b0,c0);
recompress(&c,c0);
print(&c);
return 0;
}