三元组表稀疏矩阵其求和
- 格式:doc
- 大小:38.50 KB
- 文档页数:6
#include "stdio.h"
#define MAXSIZE 100
struct node
{
int i,j;
int v;
};
struct sparmatrix
{
int rows,cols;
int terms;
struct node data[MAXSIZE];
};
void sum(struct sparmatrix a,struct sparmatrix b);
main()
{
int m[MAXSIZE][MAXSIZE],n[MAXSIZE][MAXSIZE];
int i,j,mrow,mcol,nrow,ncol,ano=0,bno=0,counter=0,t=0;
struct sparmatrix a,b;
printf("Please input row and col of matrix m(for example: row,col):");
scanf("%d,%d",&mrow,&mcol);
printf("\n");
printf("Please input row and col of matrix n(for example: row,col):");
scanf("%d,%d",&nrow,&ncol);
if ((mrow!=nrow)||(mcol!=ncol))
{
printf("ERROR: dimensions of m,n are different!");
getch();
return; /*comapre dimension between matrix m and n*/
}
for (i=0;i
for (j=0;j
{ printf("input value of data element m[%d][%d] ",i,j);
scanf("%d",&m[i][j]);
} /*input value of matrix m*/
for (i=0;i
for (j=0;j
{ printf("input value of data element n[%d][%d] ",i,j);
scanf("%d",&n[i][j]); } /*input value of matrix n*/
printf("matrix m you input as follows:\n");
for (i=0;i
for (j=0;j
{
if (t==mcol)
{
printf("\n");
t=0;
}
printf(" %d",m[i][j]);
t++;
} /*output matrix m*/
printf("\n");
printf("\n");
printf("matrix n you input as follows:\n");
t=0;
for (i=0;i
for (j=0;j
{
if (t==ncol)
{
printf("\n");
t=0;
}
printf(" %d",n[i][j]);
t++;
} /*output matrix n*/
printf("\n");
printf("\n");
for (i=0;i
for (j=0;j
if (m[i][j]!=0)
{ counter++;
a.data[ano].i=i;
a.data[ano].j=j;
a.data[ano].v=m[i][j];
ano++;
} a.rows=mrow;a.cols=mcol;a.terms=counter;
printf("tripule node of m: i j v \n");
for(i=0;i
printf(" %5d %5d %5d\n",a.data[i].i,a.data[i].j,a.data[i].v);
counter=0;
for (i=0;i
for (j=0;j
if (n[i][j]!=0)
{ counter++;
b.data[bno].i=i;
b.data[bno].j=j;
b.data[bno].v=n[i][j];
bno++;
}
b.rows=nrow;b.cols=ncol;b.terms=counter;
printf("tripule node of n: i j v\n");
for(i=0;i
printf(" %5d %5d %5d\n",b.data[i].i,b.data[i].j,b.data[i].v);
sum(a,b);
getch();
}
void sum(struct sparmatrix a,struct sparmatrix b)
{
struct sparmatrix c; /*c为a+b的转置*/
int i,j,x,k=0,p=0,cno=0,counter=0,flag=0;
int mn[MAXSIZE][MAXSIZE]; /*define variables*/
c.cols=a.cols;
c.rows=a.rows;
if (a.terms==0&&b.terms==0)
{
return ; /*check the numbers of data element that isn't zero*/
}
for(i=1;i<=c.rows;i++) {for(j=1;j<=c.cols;j++)
{
if(a.data[k].i==b.data[p].i)
if(a.data[k].j==b.data[p].j)
{c.data[cno].v=a.data[k].v+b.data[p].v;
c.data[cno].i=a.data[k].i;
c.data[cno].j=a.data[k].j;
cno++;
k++;
p++;
}
else
if(a.data[k].j>b.data[p].j)
{c.data[cno].v=b.data[p].v;
c.data[cno].i=b.data[p].i;
c.data[cno].j=b.data[p].j;
cno++;
p++;
}
else
{c.data[cno].v=a.data[k].v;
c.data[cno].i=a.data[k].i;
c.data[cno].j=a.data[k].j;
cno++;
k++;
}
else
if(a.data[k].i>b.data[p].i)
{c.data[cno].v=b.data[p].v;
c.data[cno].i=b.data[p].i;
c.data[cno].j=b.data[p].j;
cno++;
p++;
}
else
{c.data[cno].v=a.data[k].v;
c.data[cno].i=a.data[k].i;
c.data[cno].j=a.data[k].j;
cno++;
k++;
};
if (k==a.terms||p==b.terms)
{flag=1;break;}
}
if (flag==1)
break;
}
if(k==a.terms&&p
while(p
{c.data[cno].v=b.data[p].v;
c.data[cno].i=b.data[p].i;
c.data[cno].j=b.data[p].j;
cno++;
p++;
}
if(p==b.terms&&k
while(k
{c.data[cno].v=a.data[k].v;
c.data[cno].i=a.data[k].i;
c.data[cno].j=a.data[k].j;
cno++;
k++;
}
if(k==a.terms&&p==b.terms)
c.terms=cno;
printf("the tripule of m+n is: i j v \n");
for(i=0;i
printf(" %5d %5d %5d\n",c.data[i].i,c.data[i].j,c.data[i].v);