#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. Centos 7防火墙策略配置指南

    Centos 7防火墙策略配置指南 -- 清听凌雪慕忆 @ 目录 1. 开启防火墙 1.1 user切换到root用户 1.2 查看防火墙服务状态 1.3 查看firewall的状态 1.4 启动/关 ...

  2. JDBC:加载数据库驱动、连接数据库(详细讲解)

    加载数据库驱动: 1)由于Java是一个纯面向对象语言,任何事物在其中都必须抽象成类或者类对象,数据库也不例外,JDBC同样也把数据库抽象成面向对象的结构: 2)JDBC将整个数据库驱动器在底层抽象成 ...

  3. .NET混合开发解决方案9 WebView2控件的导航事件

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  4. 最新管家婆财贸ERP C9 V22.0的应用网页版的财务软件1000用户补丁免狗授权注册机网络版软件下载

    管家婆财贸ERPC9应用价值: 1.多组织独立核算 多种组织形态核算,出具独立的三大财务报表及业务报表,发挥经营管理的积极性,便于专业化运营. 2.兼顾统筹与分权 满足多种集团统管与分权管控模式需求, ...

  5. 如何生成一个java文档

    如何生成一个java文档 众所周知,一个程序给别人看可能可以看懂,几万行程序就不一定了.在更多的时候,我们并不需要让别人知道我们的程序是怎么写的,只需要告诉他们怎么用的.那么,api文档就发挥了它的作 ...

  6. nginx 主运行配置详解(nginx.conf)

    #==基础配置==# user nginx; #设置运行用户,当运行NGINX时,进程所使用的用户,则进程拥有该用户对文件或目录的操作权限. worker_processes 4; #设置工作进程数量 ...

  7. CenterNet和CenterNet2笔记

    CenterNet和CenterNet2笔记 CenterNet是基于anchor-free的一阶段检测算法 CenterNet2是CenterNet作者基于两阶段的改进 CenterNet(Obje ...

  8. CF Divan and Kostomuksha

    题意:NKOJ CF 思路:首先发现贪心不了.因此dp.然后这题需要维护的就\(g_i\)和\(sum{g_i}\) 状态:\(dp[i]\): 当前最后一个为\(g_i\)的最大值 \(dp[i]= ...

  9. STM32启动文件

    一.复位电路 在了解启动文件之前需要明白STM32的复位中断流程,STM32的复位分为上电复位和手动复位,复位的电路图如下所示: 注意: 图中的复位电路是低电平复位,有的MCU是高电平复位. 上电复位 ...

  10. Spring-Cloud-Alibaba系列教程(一)Nacos初识

    前言 在2020年即将开启SpringCloudAlibaba的专题,希望2020年共同学习进步. 学习资料 文档 Naco文档 程序猿DD Spring Cloud Aliabab专题 专题博客 视 ...