#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. 服务器 CPU 100% 异常排查实践与总结

    一个执着于技术的公众号 问题背景 昨天下午突然收到运维邮件报警,显示数据平台服务器cpu利用率达到了98.94%,而且最近一段时间一直持续在70%以上,看起来像是硬件资源到瓶颈需要扩容了,但仔细思考就 ...

  2. JS运算符,流程控制,函数,内置对象,BOM与DOM

    运算符 1.算数运算符 运算符 描述 + 加 - 减 * 乘 / 除 % 取余(保留整数) ++ 递加 - - 递减 ** 幂 var x=10; var res1=x++; '先赋值后自增1' 10 ...

  3. python常用内置函数和关键字

    常用内置方法 在Python中有许许多多的内置方法,就是一些Python内置的函数,它们是我们日常中经常可以使用的到的一些基础的工具,可以方便我们的工作. 查看所有的内置类和内置方法 # 方法一 bu ...

  4. 817. Linked List Components - LeetCode

    Question 817. Linked List Components Solution 题目大意:给一个链表和该链表元素组成的一个子数组,求子数组在链表中组成多少个片段,每个片段中可有多个连续的元 ...

  5. Navicat破解激活流程

    ​​ ​ Navicat Navicat Premium 是一套数据库开发工具,让你从单一应用程序中同时连接 MySQL.MariaDB.MongoDB.SQL Server.Oracle.Postg ...

  6. 第6组 Beta冲刺 总结

    目录 1. 基本情况 2. 思考与总结 2.1. 设想和目标 2. 计划 3. 资源 4. 变更管理 5. 设计/实现 6. 测试/发布 7. 团队的角色,管理,合作 8. 总结 3. 敏捷开发 1. ...

  7. 测试平台系列(95) 前置条件支持简单的python脚本

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节我们构思了一下怎么去支 ...

  8. 什么是HBase?终于有人讲明白了

    一.初识HBase HBase 是一个面向列式存储的分布式数据库,其设计思想来源于 Google 的 BigTable 论文.HBase 底层存储基于 HDFS 实现,集群的管理基于 ZooKeepe ...

  9. 我的第一个开源作品Kiwis2 Mock Server

    我的第一个开源作品Kiwis2 Mock Server,目前公测中,欢迎大家提供宝贵意见. 代码:https://github.com/kiwis2/mockserver 主页:https://kiw ...

  10. 【FAQ】运动健康服务REST API接口使用过程中常见问题和解决方法总结

    华为运动健康服务(HUAWEI Health Kit)为三方生态应用提供了REST API接口,通过其接口可访问数据库,为用户提供运动健康类数据服务.在实际的集成过程中,开发者们可能会遇到各种问题,这 ...