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

 

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int r;
    int c;
    int v;
}node;

typedef struct
{
    int cnt1;
    int cnt2;
    node matrix1[1000];
    node matrix2[1000];
}matrix;

void init(matrix *p)
{
    int m,n,t1,t2;
    int x,y,z,i=0;
    scanf("%d%d%d%d",&m,&n,&t1,&t2);
    p->cnt1=t1;
    p->cnt2=t2;
    while(1)
    {
        scanf("%d%d%d",&x,&y,&z);
        p->matrix1[i].r=x;
        p->matrix1[i].c=y;
        p->matrix1[i].v=z;
        i++;
        if(i==t1)break;
    }
    i=0;
     while(1)
    {
        scanf("%d%d%d",&x,&y,&z);
        p->matrix2[i].r=x;
        p->matrix2[i].c=y;
        p->matrix2[i].v=z;
        i++;
        if(i==t2)break;
    }
}

void plus(matrix *p)
{
    int flag,tmp;
    int i=0,j=0,k=p->cnt1-1;
    for(i=0;i<p->cnt2;i++)
    {
        flag=1;
        for(j=0;j<p->cnt1;j++)
        {
            if(p->matrix1[j].r==p->matrix2[i].r && p->matrix1[j].c==p->matrix2[i].c )
            {
                p->matrix1[j].v += p->matrix2[i].v;
                flag=0;
                break;
            } //if is the same r & c,plus
        }
            if(flag)
            {
                p->matrix1[++k].r = p->matrix2[i].r;
                p->matrix1[k].c = p->matrix2[i].c;
                p->matrix1[k].v = p->matrix2[i].v;
            }   //else , append
    }
        p->cnt1=k+1;
        for(i=0;i<k;i++)
            for(j=i;j<k+1;j++)
            {
                if(p->matrix1[i].r > p->matrix1[j].r)
                {
                    tmp=p->matrix1[i].r;
                    p->matrix1[i].r=p->matrix1[j].r;
                    p->matrix1[j].r=tmp;
                    tmp=p->matrix1[i].c;
                    p->matrix1[i].c=p->matrix1[j].c;
                    p->matrix1[j].c=tmp;
                    tmp=p->matrix1[i].v;
                    p->matrix1[i].v=p->matrix1[j].v;
                    p->matrix1[j].v=tmp;
                }
            }
            for(i=0;i<k;i++)
                for(j=i;j<k+1;j++)
            {
                if(p->matrix1[i].r==p->matrix1[j].r && p->matrix1[i].c > p->matrix1[j].c)
                {
                    tmp=p->matrix1[i].c;
                    p->matrix1[i].c=p->matrix1[j].c;
                    p->matrix1[j].c=tmp;
                    tmp=p->matrix1[i].v;
                    p->matrix1[i].v=p->matrix1[j].v;
                    p->matrix1[j].v=tmp;
                }
            }
}

void output(matrix *p)
{
    int tmp=0;
    while((p->cnt1)--)
    {
        printf("\n%d %d %d",p->matrix1[tmp].r,p->matrix1[tmp].c,p->matrix1[tmp].v);
        tmp++;
    }
}

int main()
{
    matrix *p=(matrix *)malloc(sizeof(matrix));
    init(p);
    plus(p);
    output(p);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值