#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node
{
int row, col;
ElemType data;
struct Node* right, * down;
}Node;
typedef struct CrossLink
{
Node* row_head;//注意:这是头结点数组
Node* col_head;
int row_max, col_max, size;
}CrossLink;
CrossLink* Creat(int m, int n)//创建
{
CrossLink* C = (CrossLink*)malloc(sizeof(CrossLink));
C->col_max = n;
C->row_max = m;
C->size = 0;
C->row_head = (Node*)calloc(m + 1, sizeof(Node));
C->col_head = (Node*)calloc(n + 1, sizeof(Node));//注意:指针是从1开始
for (int i = 1; i <= m; i++)
{
(C->row_head[i]).right = NULL;
}
for (int i = 1; i <= n; i++)
{
(C->col_head[i]).down = NULL;
}
return C;
}
void Read(CrossLink* C, int n)
{
for (int T = 0; T < n; T++)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
Node* left, * up;//注意:在遍历完成后,left指针和up指针指向目标节点的左边和上边
left = &(C->row_head[a]);
while (left->right && left->right->col <= b) left = left->right;
up = &(C->col_head[b]);
while (up->down && up->down->row <= a) up = up->down;
Node* s = (Node*)malloc(sizeof(Node));
s->data = c;
s->row = a;
s->col = b;
s->down = up->down;
up->down = s;
s->right = left->right;
left->right = s;
C->size++;
}
}
void Print(CrossLink* C)
{
for (int i = 1; i <= C->row_max; i++)
{
Node* p = C->row_head[i].right;
while (p)
{
printf("%d %d %d ", p->row, p->col, p->data);
p = p->right;
putchar('\n');
} }
}
void Add(CrossLink* A, CrossLink* B)
{
if (A->col_max != B->col_max || A->row_max != B->row_max)
return;
for (int i = 1; i <= A->row_max; i++)
{
Node* p = &(A->row_head[i]);
Node* q = &(B->row_head[i]);
while (p->right || q->right)
{
if (p->right && q->right && p->right->col == q->right->col)
{
int t = p->right->data + q->right->data;
if (t == 0)
{
Node* d = p->right;
p->right = p->right->right;
free(d);
}
else
{
p->right->data = t;
p = p->right;
} q = q->right;
}
else if (q->right == NULL || (p->right && p->right->col < q->right->col))
{
p = p->right;
}
else
{
Node* s = (Node*)malloc(sizeof(Node));
s->col = q->right->col;
s->data = q->right->data;
s->row = q->right->row;
s->right = p->right;
p->right = s;
{
Node* r = &(A->col_head[s->col]);
while (r->down && r->down->row <= r->row) r = r->down;
s->down = r->down;
r->down = s;
}
q = q->right;
} } }
}
int main()
{
int m, n;
scanf("%d%d", &m, &n);
CrossLink* A = Creat(m, n);
CrossLink* B = Creat(m, n);
int anum, bnum;
scanf("%d%d", &anum, &bnum);
Read(A, anum);
Read(B, bnum);
Add(A, B);
Print(A); }
/*
3 4 3 2
1 1 1
1 3 1
2 2 2
1 2 1
2 2 3
*/

以十字链表为存储结构实现矩阵相加(严5.27)--------西工大noj的更多相关文章

  1. 以三元组表为存储结构实现矩阵相加(耿5.7)----------西工大 noj

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...

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

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

  3. 建立二叉树的二叉链表(严6.65)--------西工大noj

    需要注意的点:在创建二叉树的函数中,如果len1==len2==0,一定要把(*T)置为NULL然后退出循环 #include <stdio.h> #include <stdlib. ...

  4. 图->存储结构->十字链表

    文字描述 十字链表是有向图的另一种链式存储结构. 在十字链表中,对应于有向图中每一条弧有一个结点,对应于每个顶点也有一个结点.这些结点的结构如下所示: 在弧结点中有5个域: 尾域tailvex和头域h ...

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

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

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

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

  7. 树和二叉树->存储结构

    文字描述 1 二叉树的顺序存储 用一组地址连续的存储单元自上而下,自左至右存储完全二叉树上的结点元素. 这种顺序存储只适用于完全二叉树.因为,在最坏情况下,一个深度为k且只有k个结点的单支树却需要长度 ...

  8. javascript实现数据结构:稀疏矩阵的十字链表存储表示

    当矩阵的非零个数和位置在操作过程中变化大时,就不宜采用顺序存储结构来表示三元组的线性表.例如,在作“将矩阵B加到矩阵A上”的操作时,由于非零元的插入或删除将会引起A.data中元素的移动.为此,对这种 ...

  9. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

随机推荐

  1. 就是要让你搞懂Nginx,这篇就够了!

    开源Linux 长按二维码加关注~ 作者:渐暖° 出处:blog.csdn.net/yujing1314/article/details/107000737 来源:公众号51CTO技术栈 Nginx ...

  2. 按照 Promise/A+ 规范逐行注释并实现 Promise

    0. 前言 面试官:「你写个 Promise 吧.」 我:「对不起,打扰了,再见!」 现在前端越来越卷,不会手写 Promise 都不好意思面试了(手动狗头.jpg).虽然没多少人会在业务中用自己实现 ...

  3. Invocation failed Unexpected end of file from server java.lang.RuntimeException: Invocation failed Unexpected end of file from server

    Android studio 提交 push的时候报错. Invocation failed Unexpected end of file from serverjava.lang.RuntimeEx ...

  4. OPRF

    在PSI中经常用到OPRF技术,现在系统学习一下. PRF Pseudo Random Function,伪随机函数,主要就是用来产生为伪随机数的. 伪随机数 什么伪随机数? 伪随机数是用确定性的算法 ...

  5. JS 的立即执行函数

    JS 的立即执行函数 本文写于 2019 年 12 月 7 日 其实 ES6 之后有了之后,很多之前的用法都没必要了,立即执行函数就是其一. 今天看到一道面试题: 请「用自己的语言」简述 立即执行函数 ...

  6. 封装axios请求

    import axios from 'axios' import router from '@/router' axios.defaults.baseURL = system.requestBaseU ...

  7. 带你学习MindSpore中算子使用方法

    摘要:本文分享下MindSpore中算子的使用和遇到问题时的解决方法. 本文分享自华为云社区<[MindSpore易点通]算子使用问题与解决方法>,作者:chengxiaoli. 简介 算 ...

  8. SAM[详细~bushi]

    基础性质概念 后缀自动机:S的SAM是个DAG,每个节点叫状态,每条带字符ch边表示+ch转移,从开始节点往下,任何一条路径都会对应一个S的子串. 不过为什么要叫"后缀"自动机呢? ...

  9. Docker容器Nginx负载均衡配置、check及stub模块安装

    Nginx是一款高性能的HTTP和反向代理.负载均衡web服务器.本次在Docker容器中部署三个tomcat,Nginx代理三个tomcat服务(以下称节点)来模拟实现负载均衡效果,配置check模 ...

  10. MAC NGINX PHP XDEBUG

    1. 安装 homebrew 2. 安装nginx ; 终端运行 brew install nginx: 1)给nginx 设置管理员权限:如果不设置管理员权限,80端口是不能监听的: #这里的目录根 ...