#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的更多相关文章

  1. 以十字链表为存储结构实现矩阵相加(严5.27)--------西工大noj

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> typedef int ElemT ...

  2. 建立二叉树的二叉链表存储结构(严6.70)--------西工大noj

    #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TreeNode ...

  3. 图的存储结构大赏------数据结构C语言(图)

    图的存储结构大赏------数据结构C语言(图) 本次所讲的是常有的四种结构: 邻接矩阵 邻接表 十字链表 邻接多重表 邻接矩阵 概念 两个数组,一个表示顶点的信息,一个用来表示关联的关系. 如果是无 ...

  4. 三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)

    不用十字链表也可以稀疏矩阵相加时间复杂度最坏情况达到O(tuA + tuB);思路比较简单就不赘述了,代码如下: 三元组: package 行逻辑链接的顺序表实现稀疏矩阵的相乘; public cla ...

  5. (续)一个demo弄清楚位图在内存中的存储结构

    本来续---数字图像处理之位图在计算机中的存储结构一文,通过参考别人的代码,进行修改和测试终于成功运行. 该实例未使用任何API和相关类,相信如果对此实例能够完全理解那么将有进一步进行数字图像处理的能 ...

  6. Java数据结构——树的三种存储结构

    (转自http://blog.csdn.net/x1247600186/article/details/24670775) 说到存储结构,我们就会想到常用的两种存储方式:顺序存储和链式存储两种. 先来 ...

  7. OpenCV 第二课 认识图像的存储结构

    OpenCV 第二课 认识图像的存储结构 Mat Mat 类包含两部分,矩阵头和矩阵体.矩阵头包含矩阵的大小,存储方式和矩阵体存储空间的指针.因此,Mat中矩阵头的大小是固定的,矩阵体大小是不定的. ...

  8. 从NSM到Parquet:存储结构的衍化

    http://blog.csdn.net/dc_726/article/details/41777661 为了优化MapReduce及MR之前的各种工具的性能,在Hadoop内建的数据存储格式外,又涌 ...

  9. 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

    如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...

随机推荐

  1. Linux 运维工程师面试问答录(推荐阅读)

    一个执着于技术的公众号 本文整理了一些比较常见的 Linux 相关的面试题目,该问答录主要分为基础知识篇和服务器篇.内容主要涉及 Linux 基本原理.常用命令操作.服务器应用等部分的内容. Linu ...

  2. Docker容器的安装和使用

    Docker容器的安装和使用 安装: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 或国内:curl -sSL ...

  3. 使用VUE+SpringBoot+EasyExcel 整合导入导出数据

    使用VUE+SpringBoot+EasyExcel 整合导入导出数据 创建一个普通的maven项目即可 项目目录结构 1 前端 存放在resources/static 下 index.html &l ...

  4. Packed Ciphertexts in LWE-based Homomorphic Encryption:解读

    本节内容记录阅读该论文的笔记 介绍 首先,介绍了两种明文"打包"的方法:PVW和SV PVW:对应论文(PVW:A framework for efficient and comp ...

  5. 找到占用CPU最高的Java线程

    一.找到java进程id jps查看当前运行的java进程id [root@localhost ~]# jps 18354 Jps 9381 Bootstrap 二.找到内存和CPU占用最高的线程pi ...

  6. Android 12(S) 图像显示系统 - GraphicBuffer同步机制 - Fence

    必读: Android 12(S) 图像显示系统 - 开篇 一.前言 前面的文章中讲解Android BufferQueue的机制时,有遇到过Fence,但没有具体讲解.这篇文章,就针对Fence这种 ...

  7. Property or method "xxx" is not defined on the instance but referenced during render

    是xxx中的data写成date了,因此报错. 这个错误属于粗心

  8. 记一次生产事故的排查与优化——Java服务假死

    一.现象 在服务器上通过curl命令调用一个Java服务的查询接口,半天没有任何响应.关于该服务的基本功能如下: 1.该服务是一个后台刷新指示器的服务,即该服务会将用户需要的指示器数据提前计算好,放入 ...

  9. 关于p命名空间和c命名空间 外加一个context

    P命名空间注入 : 需要在头文件中加入约束文件 导入约束 : xmlns:p="http://www.springframework.org/schema/p" 如 xmlns=& ...

  10. Django+Vue+Nginx+Https域名代理访问

    Django+Vue使用Nginx实现Https域名的安全访问 前端 VUE 前端访问自身域名: https://demo.com,后序使用 Nginx 代理至后端 直接访问后端https:api会无 ...