#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. clientWidth、offsetWidth、scrollWidth……

    1.元素视图属性 clientWidth:元素内容可视区宽度(水平方向 width + 左右 padding). clientHeight:元素内容可视高度(垂直方向 height + 上下paddi ...

  2. WinUI3开发笔记(Ⅰ)

    ·背景:自从接触了微软的WinUI3的界面,瞬间觉得C# .NetFramework不香了,于是入坑网上教程极少的WinUI3的开发...... 难 (一,安装开发环境) 具体参考微软官网说明http ...

  3. arts-week9

    Algorithm 521. Longest Uncommon Subsequence I - LeetCode Review 如何搭建一个私有的CDN? 大部分情况下,我们使用市场上现有的 CDN ...

  4. 130_传析阅管理系统accdb64位版本

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 几年前笔者针对家居门店的进销存.人员管理.工资管理.任务系统.门店经营盈亏管理.销售分析.考勤请假等息息相关的业务基于Ac ...

  5. 在 Git 提交信息中使用 Emoji

    Gitmoji 旨在解释如何在 Git 提交消息时使用表情符号.在提交信息时使用表情符号,可以更容易地识别提交的目的或意图. Emoji 列表 :优化项目结构 / 代码格式 :art: ️ :性能提升 ...

  6. st表 LCA

    我当时知道ST表可以 \(O(1)\) 求 LCA 的时候是极为震惊的,可以在需要反复使用 LCA 的时候卡常使用. ST表!用于解决 RMQ问题 ST表 我可能写得不好,看专业的 怎么实现? 考虑把 ...

  7. T1创世纪(原创)

    创世纪 这是我的第一道原创题 题解: 这道题的核心算法是:加维度的最短路+贪心 状态:\(dis[i][j][t][a]\)表示在 \(t\) 时,到达 \((i,j)\) ,当前共造\(a\)只&q ...

  8. 关于『进击的Markdown』:第四弹

    关于『进击的Markdown』:第四弹 建议缩放90%食用 美人鱼(Mermaid)悄悄的来,又悄悄的走,挥一挥匕首,不留一个活口 又是漫漫画图路... 女士们先生们,大家好!  我们要接受Markd ...

  9. 0-1knapsack

    Python 实现0-1背包问题(回溯法) 题目 解题思路 回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(bounding function)来处死那些实际上不可能产生所需 ...

  10. 深入C++04:模板编程

    模板编程 函数模板 模板意义:对类型也进行参数化: 函数模板:是不编译的,因为类型不知道 模板的实例化:函数调用点进行实例化,生成模板函数 模板函数:这才是要被编译器所编译的 函数模板.模板的特例化. ...