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

本文介绍了如何使用三元组结构定义稀疏矩阵,并提供了一段C语言代码实现稀疏矩阵的相加操作,强调了在处理大量0元素时的高效算法。通过实例展示了如何创建、初始化和输出稀疏矩阵,适合初学者理解稀疏矩阵处理技巧。
摘要由CSDN通过智能技术生成

![在这里插入图片描述](https://img-blog.csdnimg.cn/1561af897612408ab05caea2b3f6722c.png?x-oss-process=image/waterm在这里插入图片描述
题目和数据结构实验有点相似
在这里插入图片描述
涉及到稀疏矩阵的运算,给出稀疏矩阵的定义

在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。

要求使用三元组进行运算,即定义一个结构体

typedef struct Triple
{
    int i;//行值
    int j;//列值
    int val;//元素值
}Triple;

看代码吧

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
typedef struct Triple//三元组
{
    int i;
    int j;
    int val;
}Triple;
//定义一个稀疏矩阵,里面的内容其实主要就是若干个三元组
typedef struct TSMatrix
{
    Triple data[MaxSize];
    int tu;//非零元个数
}TSMatrix;
//初始化
void InitTSMatrix (TSMatrix *s)//int m,int n)
{
    // s->m=m;这里注释掉是因为本题没有用到行数、列数,正常稀疏矩阵的化其实应该有的
    //s->n=n;
    s->tu=0;
}
//输入
void CreatTSMatrix (TSMatrix *s)
{
    for(int i=0;i<s->tu;i++)
    {
        scanf("%d %d %d",&s->data[i].i,&s->data[i].j,&s->data[i].val);
    }
}
//相加
void AddTSMatrix (TSMatrix *a,TSMatrix *b,TSMatrix *c)
{
    int k=0;
    int i=0,j=0;//i j 记录a b矩阵遍历过的元素
    while(1){
        if(a->data[i].i==b->data[j].i && a->data[i].j==b->data[j].j )//行值列值相同相加
            {
                int temp=a->data[i].val+b->data[j].val;
                if(temp==0) ++i,++j;//主义是否为相加为0
                else
                {
                    c->data[k]=a->data[i];
                    c->data[k].val=temp;
                    ++k;
                    ++i,++j;
                }
            }
//下边就是分类讨论ab行列大小 谁小先把谁放到c里面
            else
            {
                if(a->data[i].i<b->data[j].i)
                {
                     c->data[k]=a->data[i];
                    ++k;
                    ++i;
                }
                else
                {
                    if(a->data[i].i > b->data[j].i)
                    {
                        c->data[k]=b->data[j];
                        ++k;
                        ++j;
                    }
                    else
                    {
                        if(a->data[i].j < b->data[j].j)
                        {
                            c->data[k]=a->data[i];
                            ++k;
                            ++i;
                        }
                        else
                        {
                            c->data[k]=b->data[j];
                            ++k;
                            ++j;
                        }
                    }
                }
            }
            if(i==a->tu)
            {
                while(j<b->tu-1)
                {
                    c->data[k]=b->data[j];
                    ++k;
                    ++j;
                }
                break;
            }
            if(j==b->tu)
            {
                while(i<a->tu)
                {
                    c->data[k]=a->data[i];
                    ++k;
                    ++i;
                }
               break;
            }
    }
   c->tu=k;
}
//输出
void PrintTSMatrix (TSMatrix *s)
{
    for(int i=0;i<s->tu;++i)
    {
        printf("%d %d %d\n",s->data[i].i,s->data[i].j,s->data[i].val);
    }
}
int main()
{
    int t1,t2;
    scanf("%d %d",&t1,&t2);
    TSMatrix a,b,c;
    InitTSMatrix(&a);
    InitTSMatrix(&b);
    InitTSMatrix(&c);
    a.tu=t1;
    b.tu=t2;
    CreatTSMatrix(&a);
    CreatTSMatrix(&b);
    AddTSMatrix(&a,&b,&c);
    PrintTSMatrix(&c);
    return 0;
}

这道题有点容易TE,写的时候可能需要注意一下效率。
觉得还行的话点给赞吧 ヽ(✿゚▽゚)ノ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值