![在这里插入图片描述](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,写的时候可能需要注意一下效率。
觉得还行的话点给赞吧 ヽ(✿゚▽゚)ノ