以三元组表为存储结构实现矩阵相加(耿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 存储结构 要存储一个图,我们知道图既有 ...
随机推荐
- position与float
position:fixed/absolute和float的关系:元素设置position:absolute / fixed后,float属性是没有效果的.对于position: absolute元素 ...
- Android添加背景图片和设置app图标
Android添加背景图片和设置app图标 Android 添加背景图片 第一步:找到你要当做背景的图片,并下载下来 第二步:将图片复制到app->res->mipmap文件夹下 第三步: ...
- logging、openpyxl、第三方模块下载
### 日志模块的组成部分 ```pythonimport logging# 1.logger对象:产生日志logger = logging.getLogger('转账记录')# 2.filter对象 ...
- 用更云原生的方式做诊断|大规模 K8s 集群诊断利器深度解析
背景 通常而言,集群的稳定性决定了一个平台的服务质量以及对外口碑,当一个平台管理了相当规模数量的 Kubernetes 集群之后,在稳定性这件事上也许会"稍显被动". 我们可能经常 ...
- 认识并安装WSL
认识并安装WSL(基于Windows的Linux子系统) 什么是WSL WSL(Windows Subsystem for Linux),这是在windows平台运行的linux子系统.也就是说可是不 ...
- 关于我开发tinymce的自由表单、病历插件这件事
项目地址:https://gitee.com/zhao-xuhang/tinymce 1.前期准备 这是个vue2项目所以要使用vue-cli (虽然开发tinymce插件和这个没关系) 1. 使用n ...
- 学习Linux须知1.0之Linux相关概念、工具(yum、vim)、防火墙等
温馨提示:重点掌握的前面都标注了 ☆ 一.Linux 是什么? Linux 是一个操作系统. 我们的 Linux 主要是系统调用和内核那两层. 当然直观地看,我们使用的操作系统还包含一些在其上运行的应 ...
- [CF1073G]LCP问题
题意:给一个长n的字符串S,q组询问,每组给两个集合A,B.求集合A中的点和集合B中的点所有组合情况的lcp的和. 思路: 好像比较常规,可是代码能力差还是调了1.5h.主要还是虚树板子不熟(加入的时 ...
- CF Divan and Kostomuksha
题意:NKOJ CF 思路:首先发现贪心不了.因此dp.然后这题需要维护的就\(g_i\)和\(sum{g_i}\) 状态:\(dp[i]\): 当前最后一个为\(g_i\)的最大值 \(dp[i]= ...
- MTK 虚拟 sensor bring up (pick up) sensor2.0
pick up bring up sensor2.0 1.SCP侧的配置 (1) 放置驱动pickup.c (2) 添加底层驱动文件编译开关 (3) 加入编译文件 (4) 增加数据上报方式 (5)修改 ...