稀疏矩阵加法,实现C=A+B

输入两个稀疏矩阵,输出它们相加的结果。

第一行输入四个正整数,分别是两个矩阵的行m、列n、第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数t2

接下来的t1+t2行是三元组,分别是第一个矩阵的数据和第二个矩阵的数据。三元组的第一个元素表示行号,第二个元素表示列号,第三个元素是该项的值。

输出相加后的矩阵三元组。

3 4 3 2

1 1 1

1 3 1

2 2 2

1 2 1

2 2 3

1 1 1

1 2 1

1 3 1

2 2 5

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10000
typedef struct
{
    int row,col,e;
}Triple;

typedef struct
{
    Triple data[MAXSIZE+1];
    int m,n,len;
}TSMatrix;

void InitTriple(TSMatrix *Q)
{
    Q->m=100;
    Q->n=100;
    Q->len=0;
}
void EnterTriple(TSMatrix *Q,int row,int col,int e)
{
    Q->len++;
    Q->data[Q->len].row=row;
    Q->data[Q->len].col=col;
    Q->data[Q->len].e=e;
}

void PutTriple(TSMatrix *Q)
{
    int i;
    for(i=1;i<Q->len;i++)
    {
        printf("%d %d %d\n",Q->data[i].row,Q->data[i].col,Q->data[i].e);
    }
    printf("%d %d %d",Q->data[i].row,Q->data[i].col,Q->data[i].e);
}
void SumTriple(TSMatrix *A,TSMatrix *B,TSMatrix *C)
{
    int i=1,j=1;
    while(i<=A->len&&j<=B->len)
    {
        if(A->data[i].row<B->data[j].row)
        {
            EnterTriple(C,A->data[i].row,A->data[i].col,A->data[i].e);
            i++;
        }
        else if(A->data[i].row==B->data[j].row)
        {
            if(A->data[i].col<B->data[j].col)
            {
                EnterTriple(C,A->data[i].row,A->data[i].col,A->data[i].e);
                i++;
            }
            else if(A->data[i].col>B->data[j].col)
            {
                EnterTriple(C,B->data[j].row,B->data[j].col,B->data[j].e);
                j++;
            }
            else
            {
                if(B->data[j].e+A->data[i].e!=0)
                    EnterTriple(C,B->data[j].row,B->data[j].col,B->data[j].e+A->data[i].e);
                i++;
                j++;
            }
        }
        else
        {
            EnterTriple(C,B->data[j].row,B->data[j].col,B->data[j].e);
            j++;
        }
    }
    while(i<=A->len)
    {
        EnterTriple(C,A->data[i].row,A->data[i].col,A->data[i].e);
        i++;
    }
    while(j<=B->len)
    {
        EnterTriple(C,B->data[j].row,B->data[j].col,B->data[j].e);
        j++;
    }
}
int main()
{
    int n,m,i,row,col,e,h,l;
    TSMatrix A,B,C;
    scanf("%d%d%d%d",&h,&l,&n,&m);
    InitTriple(&A);
    InitTriple(&B);
    InitTriple(&C);
    for(i=0;i<n;i++)
    {
        scanf("%d%d%d",&row,&col,&e);
        EnterTriple(&A,row,col,e);
    }
    for(i=0;i<m;i++)
    {
        scanf("%d%d%d",&row,&col,&e);
        EnterTriple(&B,row,col,e);
    }
    SumTriple(&A,&B,&C);
    PutTriple(&C);
    return 0;
}

  • 9
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值