【#文档大全网# 导语】以下是®文档大全网的小编为您整理的《稀疏矩阵A和B均以三元组表作为储存结构时,试写出矩阵相加算法,其结果存放在三元组表C中》,欢迎阅读!
/*当具有相同行数和列数的稀疏矩阵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 //否则,判断列编号
{
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);
}
本文来源:https://www.wddqxz.cn/01e8786db007e87101f69e3143323968011cf4a3.html