1.编写程序,实现利用三元组表进行两个稀疏矩阵相加的算法。
要求:(1)随机产生两个可相加的稀疏矩阵(二维);
(2)将产生的稀疏矩阵用两个三元组表的顺序存储结构存储;
(3)将两稀疏矩阵相加的结果存储在第三个三元组表中。
算法自己也知道~但怎样编程啊~
#define MaxSize 10 //用户自定义
typedef int DataType; //用户自定义
typedef struct
{ //定义三元组
int i,j;
DataType v;
}TriTupleNode;
typedef struct
{ //定义三元组表
TriTupleNode data[MaxSize];
int m,n,t;//矩阵行,列及三元组表长度
}TriTupleTable;
//以下为矩阵加算法
void AddTriTuple( TriTupleTable *A, TriTupleTable *B, TriTupleTable *C)
{//三元组表表示的稀疏矩阵A,B相加
int k,l;
DataType temp;
C->m=A->m;//矩阵行数
C->n=A->n;//矩阵列数
C->t=0; //三元组表长度
k=0; l=0;
while (k<A->t&&l<B->t)
{if((A->data[k].i==B->data[l].i)&&(A->data[k].j==B->data[l].j))
{temp=A->data[k].v+B->data[l].v;
if (!temp)//相加不为零,加入C
{C->data[c->t].i=A->data[k].i;
C->data[c->t].j=A->data[k].j;
C->data[c->t++].v=temp;
}
k++;l++;
}
if ((A->data[k].i==B->data[l].i)&&(A->data[k].j<B->data[l].j))
||(A->data[k].i<B->data[l].i)//将A中三元组加入C
{C->data[c->t].i=A->data[k].i;
C->data[c->t].j=A->data[k].j;
C->data[c->t++].v=A->data[k].v;
k++;
}
if ((A->data[k].i==B->data[l].i)&&(A->data[k].j>B->data[l].j))
||(A->data[k].i>B->data[l].i)//将B中三元组加入C
{C->data[c->t].i=B->data[l].i;
C->data[c->t].j=B->data[l].j;
C->data[c->t++].v=B->data[l].v;
l++;
}
}
while (k<A->t)//将A中剩余三元组加入C
{C->data[c->t].i=A->data[k].i;
C->data[c->t].j=A->data[k].j;
C->data[c->t++].v=A->data[k].v;
k++;
}
while (l<B->t)//将B中剩余三元组加入C
{C->data[c->t].i=B->data[l].i;
C->data[c->t].j=B->data[l].j;
C->data[c->t++].v=B->data[l].v;
l++;
}
}
#include "Stdio.h"
#include "Conio.h"
# define MAXSIZE 10 /*假设非零元个数的最大值为10*/
# define MAXRC 10
struct Triple
{
int i,j; /*该非零元的行下标和列下标*/
int e;
};
struct TSMtrix
{
struct Triple data[MAXSIZE+1]; /*非零元三元组表,data[0]未用*/
int rpos[MAXRC+1]; /*各行第一个非零元的位置表*/
int cpos[MAXRC+1]; /*各列第一个非零元的位置表*/
int num[MAXRC+1]; /*各列非零元的个数*/
int mu,nu,tu; /*矩阵的行数、列数和非零元个数*/
};
CreateMtrix(struct TSMtrix *M)
{ /*创建一个稀疏矩阵*/
int i,elem,col,row,mu,nu,tu;
printf("please input matrix col,row,unzeroed numbers:\n");
scanf("%d%d%d",&mu,&nu,&tu);
M->mu=mu;
M->nu=nu;
M->tu=tu;
for (i=1;i<=tu;i++)
{
printf("please input element col,row,value:\n");
scanf("%d%d%d",&col,&row,&elem);
if ( mu<0 || nu<0 || mu>M->mu || nu>M->nu)
{
printf("error!");
i--;
}
else
{
M->data[i].i=col;
M->data[i].j=row;
M->data[i].e=elem;
}
}
}
ShowMtrix(struct TSMtrix M)
{ /*打印出矩阵*/
int i=1,j=1,dir=1;
printf("The matrix is:\n");
for (i=1;i<=M.mu;i++)
{
for (j=1;j<=M.nu;j++)
{
if (M.data[dir].i==i && M.data[dir].j==j) /*存在非零元*/
{
printf("%d ",M.data[dir].e);
dir++;
}
else
printf("0 ");
}
printf("\n");
}
}
FastTransposeSMtrix(struct TSMtrix M,struct TSMtrix *T)
{ /*矩阵的快速转置*/
int t=1,p=1,q,col=M.nu;
T->mu=M.mu;
T->nu=M.nu;
T->tu=M.tu;
if (T->tu)
{
for (col=1;col<=M.nu;col++)
M.num[col]=0;
for (t=1;t<=M.nu;t++)
++M.num[M.data[t].j];
M.cpos[1]=1; /*找到M中cpos的位置*/
for (col=2;col<=M.nu;col++)
M.cpos[col]=M.cpos[col-1]+M.num[col-1];
for (p=1;p<=M.tu;p++)
{
col=M.data[p].j;
q=M.cpos[col];
T->data[q].i=M.data[p].j;
T->data[q].j=M.data[p].i;
T->data[q].e=M.data[p].e;
++M.cpos[col];
}
}
}
MultSMatrix(struct TSMtrix M,struct TSMtrix N,struct TSMtrix *Q)
{ /*稀疏矩阵相乘*/
int i,arow,brow,ccol,t,temp,p,q;
int ctemp[MAXRC+1]={0};
if (M.nu!=N.mu)
printf("Multiply error!");
Q->mu=M.mu;
Q->nu=N.nu;
Q->tu=0; /*Q初始化*/
/*---------------查询M中rpos的位置------------------*/
for (i=1;i<=M.mu;i++)
M.num[i]=0;
for (t=1;t<=M.tu;t++)
++M.num[M.data[t].i];
M.rpos[1]=1;
for (i=2;i<=M.mu;i++)
M.rpos[i]=M.rpos[i-1]+M.num[i-1];
/*---------------查询N中rpos的位置------------------*/
for (i=1;i<=N.mu;i++)
N.num[i]=0;
for (t=1;t<=N.tu;t++)
++N.num[N.data[t].i];
N.rpos[1]=1;
for (i=2;i<=N.mu;i++)
N.rpos[i]=N.rpos[i-1]+N.num[i-1];
/*---------------矩阵的相乘------------------*/
if (M.tu*N.tu!=0) /*Q为非零矩阵*/
{
for (arow=1;arow<=M.mu;arow++)
{
for (i=0;i<=N.nu;i++) /*处理M中的每一行*/
ctemp[i]=0; /*累加器ctemp每次都要清零*/
Q->rpos[arow]=Q->tu+1;
if (arow<M.mu)
temp=M.rpos[arow+1];
else
temp=M.tu+1;
for (p=M.rpos[arow];p<temp;p++) /*对当前行中每一个非零元*/
{
brow=M.data[p].j; /*找到对应元在N中的行号*/
if (brow<N.mu)
t=N.rpos[brow+1];
else
t=N.tu+1;
for (q=N.rpos[brow];q<t;q++)
{
ccol=N.data[q].j; /*乘积元素在Q中列号*/
ctemp[ccol]+=M.data[p].e*N.data[q].e;
}
} /*求得Q中第crow( =arow)行的非零元*/
for (ccol=1;ccol<=Q->nu;ccol++) /*压缩存储该行非零元*/
if (ctemp[ccol])
{
if ( (++Q->tu) > MAXSIZE )
printf("error!");
Q->data[Q->tu].i=arow;
Q->data[Q->tu].j=ccol;
Q->data[Q->tu].e=ctemp[ccol];
}
}
}
else
printf("There's no unzeroed element!");
}
main()
{
struct TSMtrix M;
struct TSMtrix T;
struct TSMtrix Q;
struct TSMtrix N;
CreateMtrix(&M);
ShowMtrix(M);
printf("\n");
CreateMtrix(&T);
ShowMtrix(T);
MultSMatrix(M,T,&Q);
ShowMtrix(Q);
FastTransposeSMtrix(Q,&N);
ShowMtrix(N);
getch();
}
上学期写的
#include<stdio.h>
typedef struct{
int data[100][100];
int m,n;
}matrix;
typedef int spmatrix[100][3];
printmatrix(matrix A)/*打印矩阵*/
{ int i,j;
for(i=0;i<A.m;i++)
{ for(j=0;j<A.n;j++)
printf("%3d",A.data[i][j]);
printf("\n");
}
printf("\n");
}
printspmatrix(spmatrix Q)/*打印矩阵的三元组形式*/
{ int i;
for(i=0;i<=Q[0][2];i++)
{printf("%d %d %d",Q[i][0],Q[i][1],Q[i][2]);
printf("\n");
}
printf("\n");
}
void compressmatrix(matrix P,spmatrix T)/*将矩阵转换成三元组形式*/
{ int i,j,k=1;
for(i=0;i<P.m;i++)
for(j=0;j<P.n;j++)
if(P.data[i][j]!=0)
{ T[k][0]=i;
T[k][1]=j;
T[k][2]=P.data[i][j];
k++;
}
T[0][0]=P.m;
T[0][1]=P.n;
T[0][2]=k-1;
}
void add(spmatrix D,spmatrix E,spmatrix C)/*核心函数,矩阵相加*/
{ int i=1,k=1,j=1;
C[0][0]=D[0][0];/*保存行号*/
C[0][1]=D[0][1]; /*保存列号*/
while((i<=D[0][2])&&(j<=E[0][2]))/*循环遍历*/
if(D[i][0]<E[j][0])/*D的行号小于E的行号*/
{ C[k][0]=D[i][0];/*D的行赋给C的行*/
C[k][1]=D[i][1];/*D的列赋给C的列*/
C[k][2]=D[i][2];/*D的值赋给C的值*/
i++;k++;
}
else if(D[i][0]>E[j][0])
{ C[k][0]=E[j][0];
C[k][1]=E[j][1];
C[k][2]=E[j][2];
j++;k++;
}
else if(D[i][1]<E[j][1])
{ C[k][0]=D[i][0];
C[k][1]=D[i][1];
C[k][2]=D[i][2];
i++;k++;
}
else if(D[i][1]>E[j][1])
{ C[k][0]=E[j][0];
C[k][1]=E[j][1];
C[k][2]=E[j][2];
j++;k++;
}
else { C[k][0]=D[i][0];
C[k][1]=D[i][1];
C[k][2]=D[i][2]+E[j][2];
i++;j++;
if(C[k][2]!=0)k++;/*相加等于零*/
}
if((i>D[0][2])&&(j<=E[0][2]))/*D已经遍历完,而E没有*/
while(j<=E[0][2])
{ C[k][0]=E[j][0];
C[k][1]=E[j][1];
C[k][2]=E[j][2];
j++;k++;
}
else if((i<=D[0][2])&&(j>E[0][2]))/*E已经遍历完,而D没有*/
while(i<=D[0][2])
{ C[k][0]=D[i][0];
C[k][1]=D[i][1];
C[k][2]=D[i][2];
j++;k++;
}
C[0][2]=k-1;
}