#include<stdlib.h>
#include<stdio.h>#define MaxSize 200
typedef int DataType;
typedef struct{         //三元组类型定义int i,j;DataType e;
}Triple;
typedef struct{             //矩阵类型定义Triple data[MaxSize];int rpos[MaxSize];     //用于存储三元组中的每一行的第一非零元素的位置int m,n,len;        //矩阵的行数,列数和非零元素的个数
}TriSeqMatrix;
//创建稀疏矩阵。要求按照行优先顺序输入非零元素值
int CreateMatrix(TriSeqMatrix *M){int i,m,n;DataType e;int flag;printf("请输入稀疏矩阵的行数、列数和非零元素数:");scanf("%d,%d,%d",&M->m,&M->n,&M->len);if(M->len>MaxSize)return 0;for(i=0;i<M->len;i++){do{printf("请以行序顺序输入第%d个非零元素所在的行(0~%d),列(0~%d)元素值:",i,M->m-1,M->n-1);scanf("%d,%d,%d",&m,&n,&e);flag=0;                            /*初始化标志位*/if(m<0||m>M->m||n<0||n>M->n)    /*如果行号或列号不正确,标志位为1*/flag=1;if(i>0&&m<M->data[i-1].i||m==M->data[i-1].i&&n<=M->data[i-1].j) /*如果输入的顺序不正确,标志位为1*/flag=1;}while(flag);M->data[i].i=m;M->data[i].j=n;M->data[i].e=e;}return 1;
}
//稀疏矩阵的输出
void PrintMatrix(TriSeqMatrix M){int i;printf("稀疏矩阵是%d行×%d列,共%d个非零元素。\n",M.m,M.n,M.len);printf("行    列    元素值\n");for(i=0;i<M.len;i++)printf("%2d%6d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);
}
//稀疏矩阵相乘
void MultMatrix(TriSeqMatrix A,TriSeqMatrix B,TriSeqMatrix *C){int i,k,t,p,q,arow,brow,ccol;int temp[MaxSize];  //累加器int num[MaxSize];if(A.n!=B.m)     //如果矩阵A的列与B的行不相等,则返回return;C->m=A.m;     //初始化C的行数、列数和非零元素的个数C->n=B.n;C->len=0;if(A.len*B.len==0)      //只要有一个矩阵的长度为0,则返回return;/*---------------求矩阵B中每一行第一个非零元素的位置------------*/for(i=0;i<B.m;i++)       //初始化numnum[i]=0;for(k=0;k<B.len;k++){       //num存放矩阵B中每一行非零元素的个数i=B.data[k].i;num[i]++;}B.rpos[0]=0;//0,0for(i=1;i<B.m;i++)      //rpos存放矩阵B中每一行第一个非零元素的位置,是在B.data中的位置B.rpos[i]=B.rpos[i-1]+num[i-1];/*---------------求矩阵A中每一行第一个非零元素的位置--------------*/for(i=0;i<A.m;i++)           /*初始化num*/num[i]=0;  for(k=0;k<A.len;k++){i=A.data[k].i;num[i]++;}A.rpos[0]=0;     for(i=1;i<A.m;i++)          /*rpos存放矩阵A中每一行第一个非零元素的位置*/A.rpos[i]=A.rpos[i-1]+num[i-1];/*----------------计算两个矩阵的乘积---------------------------------*/for(arow=0;arow<A.m;arow++){        //依次扫描矩阵A的每一行for(i=0;i<B.n;i++)       //初始化累加器temptemp[i]=0;C->rpos[arow]=C->len;//对每个非0元处理if(arow<A.m-1)t=A.rpos[arow+1];elset=A.len;for(p=A.rpos[arow];p<t;p++){brow=A.data[p].j;      /*取出A中元素的列号*/if(brow<B.m-1)t=B.rpos[brow+1];elset=B.len;for(q=B.rpos[brow];q<t;q++) /*依次取出B中的第brow行,与A中的元素相乘*/{ccol=B.data[q].j;        temp[ccol]+=A.data[p].e*B.data[q].e;/*把乘积存入temp中*/}}for(ccol=0;ccol<C->n;ccol++)  /*将temp中元素依次赋值给C*/if(temp[ccol]){if(++C->len>MaxSize) return;C->data[C->len-1].i=arow;C->data[C->len-1].j=ccol;C->data[C->len-1].e=temp[ccol];}}
}
void main(){//0,0不能为0TriSeqMatrix M,N,Q;CreateMatrix(&M);PrintMatrix(M);CreateMatrix(&N);PrintMatrix(N);printf("矩阵M和N的乘积为:\n");MultMatrix(M,N,&Q);PrintMatrix(Q);system("pause");
}

转载于:https://www.cnblogs.com/javafly/p/6037144.html

_DataStructure_C_Impl:稀疏矩阵三元组相关推荐

  1. c语言三元组稀疏矩阵的转置实验报告,稀疏矩阵三元组实现矩阵转置算法实验报告.doc...

    稀疏矩阵三元组实现矩阵转置算法实验报告.doc 1实验三稀疏矩阵的三元组表示实现矩阵转置算法学院专业班学号姓名一.实习目的1掌握稀疏矩阵的三元组顺序表存储表示:2掌握稀疏矩阵三元组表示的传统转置算法的 ...

  2. 数据结构 稀疏矩阵三元组顺序表 基本操作

    [数据结构]稀疏矩阵 三元组顺序表存储 基本操作 1.稀疏矩阵定义: 假设在 mn 的矩阵中,又t个元素不为零.δ = t/mn ,称δ为矩阵的稀疏因子,通常定义δ小于等于0.05时称为稀疏矩阵. 2 ...

  3. 稀疏矩阵三元组 严蔚敏_Sparse稀疏矩阵主要存储格式总结

    在数据科学和深度学习等领域会采用矩阵来存储数据,但当矩阵较为庞大且非零元素较少时,运算效率和存储有效率并不高.所以,一般情况我们采用Sparse稀疏矩阵的方式来存储矩阵,来提高存储和运算效率.下面将对 ...

  4. 稀疏矩阵------三元组存储---笔记

    SparseMatrix.h #include<cstdio> #define maxTerms 30 typedef int DataType; typedef struct {int ...

  5. matlab稀疏矩阵三元法,数据结构——稀疏矩阵三元组表示法+算法详解

    (1).目的:对于在实际问题中出现的大型的稀疏矩阵,若用常规分配方法在计算机中储存,将会产生大量的内存浪费,而且在访问和操作的时候也会造成大量时间上的浪费,为了解决这一问题,从而善生了多种解决方案. ...

  6. 用三元组存储稀疏矩阵,实现其快速转置c语言代码,稀疏矩阵三元组表快速转置(C语言实现)...

    本来准备昨天下午写的,但是因为去参加360众测靶场的考核耽搁了,靶场的题目还是挺基础的. 继续学习吧. 使用黑色墨水在白纸上签名就像由像素点构成的稀疏矩阵.如图4所示. 图4手写体签名 [问题]请将以 ...

  7. 稀疏矩阵三元组的快速转置

    #include <iostream> #include <stdio.h> using namespace std;#define MAXSIZE 1024 #define ...

  8. java三元组的快速转置_稀疏矩阵三元组快速转置(转poklau123写的很清楚)

    关于稀疏矩阵的快速转置法,首先得明白其是通过对三元表进行转置.如果误以为是对矩阵进行转置,毫无疑问就算你想破脑袋也想不出个所以然,别陷入死胡同了! 对于一个三元表,行为i,列为j,值为v.需将其i与j ...

  9. 十五、稀疏矩阵的乘法运算

    十五.稀疏矩阵的乘法运算 文章目录 十五.稀疏矩阵的乘法运算 题目描述 解题思路 上机代码 题目描述 数据压缩是提高传输.存储效率一种技术.教材第5章介绍了两种简单的压缩存储方法. 本实验要求实现两个 ...

最新文章

  1. 可变和不可变的数据类型
  2. Leetcode 145. 二叉树的后序遍历 (每日一题 20210930)
  3. Android 使用Picasso加载网络图片等比例缩放
  4. c语言数据转移,重温C语言(2)之数据
  5. asp.net 使用Master模板页需要注意
  6. 泛型类 0104 c# 1613697523
  7. 95-138-010-源码-Function-AggregateFunction
  8. Windows同步对象Event和Linux的条件变量
  9. 【插件】LinqToExcel常用对象
  10. 阶段3 2.Spring_04.Spring的常用注解_3 用于创建的Component注解
  11. python文本字符串比对_[Python] 利用HTML页面查看字符串差异
  12. 寻找矩阵行最大列最小元素
  13. “元宇宙”火了,这玩意到底是啥?
  14. speedoffice使用方法-Word怎么在方框里面打对勾
  15. 微信美团服务器开小差,“美团无法使用微信支付”耽误大家干饭,客服:异常已经解决...
  16. onu光功率多少是正常_光猫的收发光功率正常范围是多少
  17. 双重检查锁为什么要使用volatile字段?
  18. 【Java】时差问题,格林威治时间(GMT)与北京时间转换
  19. 支付宝应用授权获取会员信息
  20. 实现小程序连接服务器(Java后台)发送请求,并返回响应

热门文章

  1. Spark RDD Cache Checkpoint
  2. java 屏幕键盘io
  3. C语言转义字符介绍和示例
  4. 怎么用git将本地代码上传到远程服务器_git在远程服务器创建项目并将本地代码推送到服务器上...
  5. android修改屏幕长宽比例,Android屏幕适配之修改density
  6. Java设计模式学习总结(13)——结构型模式之享元模式
  7. ios java 加密_AES加密 - iOS与Java的同步实现
  8. php 时间戳存储 原因,将php文件中的unix时间戳存储到mysql中(store unix timestamp from php file into mysql)...
  9. oracle 添加归档日志文件_oracle 归档日志文件路径设置
  10. 如何确认虚拟机被哪台主机锁定以及如何解锁