/*当具有相同行数和列数的稀疏矩阵A和B均以三元组表作为储存结构时,试写出矩阵相加算法,其结果存放在
三元组表C中。
*/
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
typedef struct
{
int i,j;
int v;
}node;
typedef struct
{
int m,n,t;
node data[MAXSIZE];
}Spmatrix;
void SpmInit(Spmatrix *S)  //三元组表初始化
{
int i;
printf("请输入行数、列数以及数据个数:\n");
scanf("%d%d%d",&S->m,&S->n,&S->t);
printf("请输入数据元素:\n");
for(i=0;i<S->t;i++)
scanf("%d%d%d",&S->data[i].i,&S->data[i].j,&S->data[i].v);
}
void SpmAdd(Spmatrix *A,Spmatrix *B,Spmatrix *C)
{
int i=0,j=0,j1=0,j2=0;  //j,j1,j2分别指向C,A,B的当前元素
C->m=A->m;      //将C的行列赋值为A的行列
C->n=A->n;
C->t=A->t+B->t;    //将C的数据总数赋值为A和B的总数和
for(i=0;i<C->t;i++)    //最坏的情况下,循环C->t次
{
if(j1>=A->t&&j2<B->t)  //如果A的数据已经读取完,则直接将B当前值赋值给C,j2后移
{
C->data[j]=B->data[j2];
j2++;
}
else if(j2>=B->t&&j1<A->t) //如果B的数据已经读取完,则直接将A当前值赋值给C,j1后移
{
C->data[j]=A->data[j1];
j1++;
}
else if(j1>=B->t&&j2>=B->t) //如果A,B都已经操作完,但循环为结束,则直接结束循环
break;
else
{ //先比较行编号
if(A->data[j1].i<B->data[j2].i)//如果A当前元素的行小于B的,则赋值给C
{
C->data[j]=A->data[j1];
j1++;
}
else if(A->data[j1].i>B->data[j2].i)//如果B当前元素的行小于A的,则赋值给C
{
C->data[j]=B->data[j2];
j2++;
}
else //否则,判断列编号
{
matlab中printf输出格式if(A->data[j1].j<B->data[j2].j)//如果A当前元素的列小于B的,则赋值给C
{
C->data[j]=A->data[j1];
j1++;
}
else if(A->data[j1].j>B->data[j2].j)//如果B当前元素的列小于A的,则赋值给C
{
C->data[j]=B->data[j2];
j2++;
}
else //否则,则说明A和B的当前元素位置相同,则值相加,赋值给C
{
C->data[j].i=A->data[j1].i;
C->data[j].j=A->data[j1].j;
C->data[j].v=A->data[j1].v+B->data[j2].v;
j1++;
j2++;
}
}
}
if(C->data[j].v==0)
continue;
j++;
}
C->t=j;
}
void Print(Spmatrix *S)  //输出三元组表
{
int i=0;
for(i=0;i<S->t;i++)
printf("%3d%3d%3d\n",S->data[i].i,S->data[i].j,S->data[i].v);
}
void main()
{
Spmatrix *A,*B,*C;
A=(Spmatrix *)malloc(sizeof(Spmatrix));
B=(Spmatrix *)malloc(sizeof(Spmatrix));
C=(Spmatrix *)malloc(sizeof(Spmatrix));
SpmInit(A);
SpmInit(B);
SpmAdd(A,B,C);
Print(C);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。