西北工业大学noj数据结构实验004稀疏矩阵的加法

在这里插入图片描述
在这里插入图片描述
这道题实现两个稀疏矩阵的加法。笔者采用了结构体数组的定义形式存储矩阵。同时需要注意输出时候的顺序,还有当家和后的结果为零时删除这个节点。要说的都在注释里,话不多说上代码:

#include<stdio.h>
#include <stdlib.h>
#define ok 1
#define error 0
#define max 1000
typedef struct
{
    int hang;
    int lie;
    int data;
}seq;
typedef struct
{
    seq a[max];
}ju;

void creat( ju *l,int m,int n,int t)//创建一个m行n列的矩阵,输入t个元素
{
    for (int i=0;i<t;i++)
    {
        int a,b,c;
        scanf("%d",&a);
        scanf("%d",&b);
        scanf("%d",&c);
        l->a[i].hang=a;
        l->a[i].lie=b;
        l->a[i].data=c;
    }
}
void add(ju *l,ju *m,ju *n,int *t1,int *t2)//将矩阵lm加和放到n中,两矩阵里面元素个数分别为t1t2
{
    for(int i=0;i<*t1;i++)//先把l拷贝到n
    {
        n->a[i].hang=l->a[i].hang;
        n->a[i].lie=l->a[i].lie;
        n->a[i].data=l->a[i].data;
    }

    for(int i=0;i<*t2;i++)//遍历m每一个元素
    {
        for(int j=0;j<*t1;j++)//查找n里面有没有和它位置相同的元素
        {
            if(n->a[j].hang==m->a[i].hang&&n->a[j].lie==m->a[i].lie)//位置相同的元素直接相加
                {
                    n->a[j].data=n->a[j].data+m->a[i].data;
                    for(int k=i;k<*t2;k++)//位置重叠的元素在m里删除
                    {
                        m->a[k].hang=m->a[k+1].hang;
                        m->a[k].lie=m->a[k+1].lie;
                        m->a[k].data=m->a[k+1].data;
                    }
                    (*t2)--;
                    i--;
                    break;
                }
        }
    }

    int e=*t1;
    for(int i=0;i<*t2;i++)//不重叠的元素直接输入到n后
        {
        n->a[e].hang=m->a[i].hang;
        n->a[e].lie=m->a[i].lie;
        n->a[e].data=m->a[i].data;
        e++;
        }

        int t;//冒泡的中间变量
        for(int i=0;i<*t1+*t2-1;i++)//冒泡
            for(int j=0;j<*t1+*t2-1-i;j++)
               if((n->a[j].hang>n->a[j+1].hang)||(n->a[j].hang==n->a[j+1].hang&&n->a[j].lie>n->a[j+1].lie))
                  {
                      t=n->a[j].hang,n->a[j].hang=n->a[j+1].hang,n->a[j+1].hang=t;
                      t=n->a[j].lie,n->a[j].lie=n->a[j+1].lie,n->a[j+1].lie=t;
                      t=n->a[j].data,n->a[j].data=n->a[j+1].data,n->a[j+1].data=t;
                  }


    int q=*t1+*t2;

    for(int i=0;i<q;i++)
    {
        if(n->a[i].data==0) //等于0的元素删除
        {
            for(int k=i;k<q;k++)
                    {
                        n->a[k].hang=n->a[k+1].hang;
                        n->a[k].lie=n->a[k+1].lie;
                        n->a[k].data=n->a[k+1].data;
                    }
           (*t2)--;
           q--;

        }
    }

}
void shuchu(ju *n,int j)//矩阵输出.j个元素
{
    for(int i=0;i<j;i++)
    {
       printf("%d ",n->a[i].hang);
       printf("%d ",n->a[i].lie);
       printf("%d ",n->a[i].data);
       printf("\n");

    }
}
int main()
{
    int m,n,k1,k2;
    scanf("%d%d%d%d",&m,&n,&k1,&k2);
    ju *l,*k,*o;
    l=(ju*)malloc(sizeof(ju));
    k=(ju*)malloc(sizeof(ju));
    o=(ju*)malloc(sizeof(ju));
    creat(l,m,n,k1);
    creat(k,m,n,k2);
    add(l,k,o,&k1,&k2);
    shuchu(o,k1+k2);
    return 0;
}
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值