以三元组表为存储结构实现矩阵相加(耿5.7)----------西工大 noj
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _Triple
{
int i;
int j;
int e;
}Triple;
typedef struct _Matrix
{
Triple* data;
int* i_pos;
int m, n, size, max_size;
}Matrix;
void Increase(Matrix* M, int n)//可以增加容纳二元组的个数
{
int ret = 0;
Triple* t = (Triple*)calloc(ret = M->max_size + n, sizeof(Triple));
for (int i = 0; i < M->size; i++)
{
t[i] = M->data[i];
}
free(M->data);
M->data = t;
M->max_size = ret;
}
Matrix* Creat(int m, int n)
{
Matrix* M = (Matrix*)malloc(sizeof(Matrix));
M->m = m;
M->n = n;
M->size = 0;
M->data = (Triple*)calloc(m * n / 5 + 1, sizeof(Triple));
M->max_size = m * n / 5 + 1;
M->i_pos = (int*)calloc(m, sizeof(int));
return M;
}
void Destroy(Matrix* M)
{
free(M->data);
free(M->i_pos);
free(M);
}
void Insert(Matrix* M, int m, int n, int e)
{
if (M->size == M->max_size)
Increase(M, 10);
int t = M->size;
M->data[t].e = e;
M->data[t].i = m;
M->data[t].j = n;
(M->size)++;
}
void Print(Matrix* M)
{
for (int i = 0; i < M->size; i++)
{
printf("%d %d %d\n", M->data[i].i, M->data[i].j, M->data[i].e);
}
}
int Compare(Matrix* A, Matrix* B, int pa, int pb)
{
if (A->data[pa].i > B->data[pb].i)
return 1;
else if (A->data[pa].i < B->data[pb].i)
return -1;
else
{
if (A->data[pa].j > B->data[pb].j)
return 1;
else if (A->data[pa].j < B->data[pb].j)
return -1;
else
return 0;
}
}
void Add(Matrix* A, Matrix* B, Matrix* C)
{
int pa = 0, pb = 0;
while (pa < A->size && pb < B->size)
{
if (Compare(A, B, pa, pb) == 0)
{
int tmp = A->data[pa].e + B->data[pb].e;
if(tmp)
Insert(C, A->data[pa].i, A->data[pa].j, tmp);//一定要注意判定是不是为 0
pa++;
pb++;
}
else if (Compare(A, B, pa, pb) < 0)
{
Insert(C, A->data[pa].i, A->data[pa].j, A->data[pa].e);
pa++;
}
else
{
Insert(C, B->data[pb].i, B->data[pb].j, B->data[pb].e);
pb++;
}
}
while (pb < B->size)//别忘记
{
Insert(C, B->data[pb].i, B->data[pb].j, B->data[pb].e);
pb++;
}
while (pa < A->size)
{
Insert(C, A->data[pa].i, A->data[pa].j, A->data[pa].e);
pa++;
}
}
int main()
{
Matrix* A, * B, * C;
A = Creat(2, 2);
B = Creat(2, 2);
C = Creat(2, 2);
int a_num, b_num;
scanf("%d%d", &a_num, &b_num);
for (int i = 0; i < a_num; i++)
{
int _i, _j, _e;
scanf("%d%d%d", &_i, &_j, &_e);
Insert(A, _i, _j, _e);
}
for (int i = 0; i < b_num; i++)
{
int _i, _j, _e;
scanf("%d%d%d", &_i, &_j, &_e);
Insert(B, _i, _j, _e);
}
Add(A, B, C);
Print(C);
Destroy(A);
Destroy(B);
Destroy(C);
return 0;
}
以三元组表为存储结构实现矩阵相加(耿5.7)----------西工大 noj的更多相关文章
- 以十字链表为存储结构实现矩阵相加(严5.27)--------西工大noj
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> typedef int ElemT ...
- 建立二叉树的二叉链表存储结构(严6.70)--------西工大noj
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TreeNode ...
- 图的存储结构大赏------数据结构C语言(图)
图的存储结构大赏------数据结构C语言(图) 本次所讲的是常有的四种结构: 邻接矩阵 邻接表 十字链表 邻接多重表 邻接矩阵 概念 两个数组,一个表示顶点的信息,一个用来表示关联的关系. 如果是无 ...
- 三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)
不用十字链表也可以稀疏矩阵相加时间复杂度最坏情况达到O(tuA + tuB);思路比较简单就不赘述了,代码如下: 三元组: package 行逻辑链接的顺序表实现稀疏矩阵的相乘; public cla ...
- (续)一个demo弄清楚位图在内存中的存储结构
本来续---数字图像处理之位图在计算机中的存储结构一文,通过参考别人的代码,进行修改和测试终于成功运行. 该实例未使用任何API和相关类,相信如果对此实例能够完全理解那么将有进一步进行数字图像处理的能 ...
- Java数据结构——树的三种存储结构
(转自http://blog.csdn.net/x1247600186/article/details/24670775) 说到存储结构,我们就会想到常用的两种存储方式:顺序存储和链式存储两种. 先来 ...
- OpenCV 第二课 认识图像的存储结构
OpenCV 第二课 认识图像的存储结构 Mat Mat 类包含两部分,矩阵头和矩阵体.矩阵头包含矩阵的大小,存储方式和矩阵体存储空间的指针.因此,Mat中矩阵头的大小是固定的,矩阵体大小是不定的. ...
- 从NSM到Parquet:存储结构的衍化
http://blog.csdn.net/dc_726/article/details/41777661 为了优化MapReduce及MR之前的各种工具的性能,在Hadoop内建的数据存储格式外,又涌 ...
- 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现
如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...
随机推荐
- 一个登录点两个逻辑漏洞-edusrc
最近呢, 也是基础漏洞学的差不多了, 就在edusrc上面实战, 刚开始搞一些信息泄漏啥的, 提交了十几个, 结果就他娘的通过了一个. 咱也就不碰信息泄漏了, 没得意思. 关于这个学校测试时也是有坑的 ...
- 第一个MVC程序
配置版 添加web的支持! 确定导入了SpringMVC 的依赖! 配置web.xml , 注册DispatcherServlet <?xml version="1.0" e ...
- Java学习笔记-基础语法Ⅵ-异常
异常 对于异常,JVM默认处理方案为:把异常名称.异常原因以及异常出现的位置等信息输出在控制台,并且程序停止执行 异常处理方式一:try ... catch public class Demo { p ...
- windbg的时间旅行实现对 C# 程序的终极调试
一:什么是时间旅行 简而言之就是把程序的执行流拍成vlog,这样就可以对 vlog 快进或者倒退,还可以分享给别人做进一步的分析,是不是想都不敢想. 很开心的是 windbg preview 版本中已 ...
- CSAPP 之 AttackLab 详解
前言 本篇博客将会介绍 CSAPP 之 AttackLab 的攻击过程,利用缓冲区溢出错误进行代码注入攻击和 ROP 攻击.实验提供了以下几个文件,其中 ctarget 可执行文件用来进行代码注入攻击 ...
- mysql Bad handshake
由于 Java 程序访问 MySQL 时,MySQL 抛出 Bad handshake 错误,导致接口抛错,然后在 MySQL 配置文件新增 skip_ssl 配置(忽略 SSL 密钥和证书文件),重 ...
- 用Repo管理自己的本地仓库
AOSP使用Repo工具管理项目源码.而Repo工具则依赖一个名叫manifest的git仓库来记录Android源码中都包含哪些子仓库. 进入Android源码根目录下的.repo目录,可以看到ma ...
- 不忍了,快速下载Visual Studio Code
更新记录 本文迁移自Panda666原博客,原发布时间:2021年5月2日. 奇怪的原因 因为一些众所周知的原因,在国内下载Visual Studio Code的速度比较慢,所以我们需要一些方法来加快 ...
- Node.js精进(6)——文件
文件系统是一种用于向用户提供底层数据访问的机制,同时也是一套实现了数据的存储.分级组织.访问和获取等操作的抽象数据类型. Node.js 中的fs模块就是对文件系统的封装,整合了一套标准 POSIX ...
- 全新升级的AOP框架Dora.Interception[6]: 框架设计和实现原理
本系列前面的五篇文章主要介绍Dora.Interception(github地址,觉得不错不妨给一颗星)的编程模式以及对它的扩展定制,现在我们来聊聊它的设计和实现原理.(拙著<ASP.NET C ...