#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. ThinkPHP V6.0.12在php8.1下验证码出现问题

    一.问题描述 1.项目需求要求使用PHP8.1.*版本 2.运行程序发现验证码不生效报错如下: 二.错误描述 1.报错信息得出:从浮点(数字)到整数的隐式转换将失去精度 三.解决流程 1.找到报错文件 ...

  2. spring boot 集成 rabbitmq 指南

    先决条件 rabbitmq server 安装参考 一个添加了 web 依赖的 spring boot 项目 我的版本是 2.5.2 添加 maven 依赖 <dependency> &l ...

  3. Element中Tree树结构组件中实现Ctrl和Shift多选

    在Element中的树结构中, 实现多选功能,首先的是判断有没有按下键盘ctrl和shift按键.但是在Element中的tree组件的左键点击事件是没有提供$event鼠标属性判断的.所以就需要在函 ...

  4. 第06组 Beta冲刺 (3/5)

    目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2. 方梓涵 3.曾丽莉 4.杜筱 5. 董翔云 6.黄少丹 7.鲍凌函 8.詹鑫冰 9.曹兰英 10.吴沅静 1.3 冲刺成果展示 1.1 ...

  5. 羿网通WT2100网络测试仪端口开关功能应用案例

    端口开关是羿网通WT2100具备的一项全局性的功能,使用客户端软件Packlark连接WT2100后无需进入具体功能即可使用.该功能是通过控制设备上的以太网开关实现快速.便捷地切换网口通断状态的目标, ...

  6. HCNP Routing&Switching之VRRP基础

    前文我们了解了链路高可用技术链路聚合相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16279078.html:今天我们来聊一聊另一种高可用技术,网关高 ...

  7. html5手册语义化标签

    html5手册语义化标签: article section aside hgroup header footer nav time mark figure figcaption contextmenu ...

  8. Asp.Net Core Identity 多数据库支持

    Asp.Net Core Identity 是.Net自带的身份认证系统,支持用户界面 (UI) 登录功能,并且管理用户.密码.配置文件数据.角色.声明.令牌.电子邮件确认等等.使用Visual St ...

  9. Training loop Run Builder

    以下内容来自deeplizard pyorch_P31  

  10. 【NOIP2017 提高组正式赛】列队 题解

    题目大意 有一个 \(n\times m\) 的方阵,每次有 \((x,y)\) 离开,离开后有两个命令 向左看齐.这时第一列保持不动,所有学生向左填补空缺.这条指令之后,空位在第 \(x\) 行第 ...