两个稀疏矩阵三元组相加

当稀疏矩阵A和B均以三元组表作为存储结构时,试写出矩阵相加的算法,其结果存放在三元组表C中。 解:这个算法有点繁,要考虑到两个稀疏矩阵的非零元素不是一一对应的,在建立新的三元组表C时,为了使三元组元素仍按行优先排列,所以每次插入的三元组不一定是A的,按照矩阵元素的行列去找A中的三元组,若有,则加入C,同时,这个元素如果在B中也有,则加上B的这个元素值,否则这个值就不变 如果A中没有,则找B,有则插入C,无则查找下一个矩阵元素。





当稀疏矩阵A和B均以三元组表作为存储结构时,试写出矩阵相加的算法,其结果存放在三元组表C中。

解:
矩阵相加就是将两个矩阵中同一位置的元素值相加。由于两个稀疏矩阵的非零元素按三元组表形式存放,在建立新的三元组表C时,为了使三元组元素仍按行优先排列,所以每次插入的三元组不一定是A的,按照矩阵元素的行列去找A中的三元组,若有,则加入C,同时,这个元素如果在B中也有,则加上B的这个元素值,否则这个值就不变;如果A中没有,则找B,有则插入C,无则查找下一个矩阵元素。

#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 t&&l 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 data[l].j))
||(A-> data[k].i 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 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 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++;
}
}







以下程序只做大家一起学习:

了解稀疏矩阵的三元组表压缩存储结构和稀疏矩阵的三元组表表示方法下的相加算法。掌握稀疏矩阵的三元组表存储结构的实现,实现稀疏矩阵的三元组表表示下的相加算法,编写程序,实现利用三元组表进行两个稀疏矩阵相加的算法。

要求:(1)随机产生两个可相加的稀疏矩阵(二维);

(2)将产生的稀疏矩阵用两个三元组表的顺序存储结构存储;

(3)将两稀疏矩阵相加的结果存储在第三个三元组表中。

二、实验方案

#include

#define MaxSize 1000 /*用户自定义*/

typedef int DataType; /*用户自定义*/

typedef struct

{ int i,j; DataType v; }Triple;/*定义三元组结构*/

typedef struct

{ Triple data[MaxSize];/*定义可存三元组大小*/

int mu,nu,tu; }Tsmatrix;/*行数,列数,非零元*/



void addtriple( Tsmatrix *A ,Tsmatrix *B,Tsmatrix *C) /*三元组相加算法*/

{int x,sum,pb,pc,pa;

C->mu=A->mu;

C->nu=A->nu;

C->tu=0; /*定义矩阵C的非零元个数开始为0个*/

pa=1;

pb=1;

pc=1;

for(x=1;x<=A->mu;x++)

{while(A->data[pa].i
while(B->data[pb].i
while(A->data[pa].i==x && B->data[pb].i==x) /*行数相等时*/

{if(A->data[pa].j==B->data[pb].j) /*列数相等时*/

{sum=A->data[pa].v+B->data[pb].v; /*矩阵想加*/

if(sum) /*相加不为零时*/

{C->data[pc].i=x;

C->data[pc].j=A->data[pa].j;

C->data[pc].v=sum;

pa++;

pb++;

pc++;

}

}



else

if(A->data[pa].j>B->data[pb].j) /*A的列数大于B的列数时*/

{C->data[pc].i=x;

C->data[pc].j=B->data[pb].j;

C->data[pc].v=B->data[pb].v;

pb++;

pc++;



}

else

{C->data[pc].i=x;

C->data[pc].j=A->data[pa].j;

C->data[pc].v=A->data[pa].v;

pa++;

pc++;



}


}

while(A->data[pa].i==x) /*插入A剩余的元素*/

{C->data[pc].i=x;

C->data[pc].j=A->data[pa].j;

C->data[pc].v=A->data[pa].v;

pa++;

pc++;



}

while(B->data[pb].i==x) /*插入B的元素*/

{C->data[pc].i=x;

C->data[pc].j=B->data[pb].j;

C->data[pc].v=B->data[pb].v;

pb++;

pc++;



}

}

C->tu=pc;

}



main()

{ Tsmatrix *A , *B, *C; int b,e,k;

A=(Tsmatrix*)malloc(sizeof(Tsmatrix));

B=(Tsmatrix*)malloc(sizeof(Tsmatrix));

C=(Tsmatrix*)malloc(sizeof(Tsmatrix)); /*生成A、B、C三元组存储空间*/

printf("input A->mu:");

/*输入A的行数*/

scanf("%d",&A->mu);

printf("input A->nu:");

scanf("%d",&A->nu); /*输入B的列数*/

printf("input A->tu:");

scanf("%d",&A->tu);/*输入A 的非零元*/



printf("input A:\n");/*输入A的非零元三元组*/

for(e=1;e<=A->tu;e++)/*循环输入A的三元组*/

scanf("%d%d%d",&A->data[e].i,&A->data[e].j,&A->data[e].v);

printf("\n");



printf("input B.tu:");/*输入B的非零元三元组*/

scanf("%d",&B->tu);

printf("input B:\n");

for(k=1;k<=B->tu;k++)

scanf("%d%d%d",&B->data[k].i,&B->data[k].j,&B->data[k].v);

printf("\n");

addtriple( A,B,C); /*引用相加算法*/

printf("output C:\n");/*输出C的三元组*/

for(b=1;btu;b++)

printf("%d,%d,%d\n",C->data.i,C->data.j,C->data.v);

}


相关文档
最新文档