以三元组表为存储结构实现矩阵相加

假设稀疏矩阵AB均以三元组表作为存储结构。试编写矩阵相加的程序,另设三元组表C存放结果矩阵。矩阵大小为mn(0<m,n<100)

第一行输入t1t2(0<t1,t2<100) ,t1t2分别是矩阵AB中非零元素的个数,后面t1+t2行分别输入AB中的元素,用三元组表示。

输出三元组表C

3 3

1 2 3

3 2 1

3 4 2

1 1 4

3 2 5

3 4 1

1 1 4

1 2 3

3 2 6

3 4 3

#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;
    TSMatrix A,B,C;
    scanf("%d%d",&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;
}

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值