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


#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的更多相关文章
- 以三元组表为存储结构实现矩阵相加(耿5.7)----------西工大 noj
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...
- 建立二叉树的二叉链表存储结构(严6.70)--------西工大noj
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TreeNode ...
- 建立二叉树的二叉链表(严6.65)--------西工大noj
需要注意的点:在创建二叉树的函数中,如果len1==len2==0,一定要把(*T)置为NULL然后退出循环 #include <stdio.h> #include <stdlib. ...
- 图->存储结构->十字链表
文字描述 十字链表是有向图的另一种链式存储结构. 在十字链表中,对应于有向图中每一条弧有一个结点,对应于每个顶点也有一个结点.这些结点的结构如下所示: 在弧结点中有5个域: 尾域tailvex和头域h ...
- 图的存储结构大赏------数据结构C语言(图)
图的存储结构大赏------数据结构C语言(图) 本次所讲的是常有的四种结构: 邻接矩阵 邻接表 十字链表 邻接多重表 邻接矩阵 概念 两个数组,一个表示顶点的信息,一个用来表示关联的关系. 如果是无 ...
- Java数据结构——树的三种存储结构
(转自http://blog.csdn.net/x1247600186/article/details/24670775) 说到存储结构,我们就会想到常用的两种存储方式:顺序存储和链式存储两种. 先来 ...
- 树和二叉树->存储结构
文字描述 1 二叉树的顺序存储 用一组地址连续的存储单元自上而下,自左至右存储完全二叉树上的结点元素. 这种顺序存储只适用于完全二叉树.因为,在最坏情况下,一个深度为k且只有k个结点的单支树却需要长度 ...
- javascript实现数据结构:稀疏矩阵的十字链表存储表示
当矩阵的非零个数和位置在操作过程中变化大时,就不宜采用顺序存储结构来表示三元组的线性表.例如,在作“将矩阵B加到矩阵A上”的操作时,由于非零元的插入或删除将会引起A.data中元素的移动.为此,对这种 ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
随机推荐
- .NET混合开发解决方案7 WinForm程序中通过NuGet管理器引用集成WebView2控件
系列目录 [已更新最新开发文章,点击查看详细] WebView2组件支持在WinForm.WPF.WinUI3.Win32应用程序中集成加载Web网页功能应用.本篇主要介绍如何在WinForm ...
- Android开发的开始
Android 软件 手机软件哦,目前只有一层外壳,进一步功能等待开发. 下载地址
- MySQL8新增降序索引
MySQL8新增降序索引 桃花坞里桃花庵,桃花庵里桃花仙.桃花仙人种桃树,又摘桃花卖酒钱. 一.MySQL5.7 降序索引 MySQL在语法上很早就已经支持降序索引,但实际上创建的却仍然是升序索引,如 ...
- vs code 终端字体间距过大(全角的样子)
文件-首选项-设置 将 terminal.integrated.fontFamily 配置为 Consolas, 'Courier New', monospace 或其他想要的字体,或者点击齿轮按钮重 ...
- springcloud-- Alibaba-nacos--支持的几种服务消费方式
通过<Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现>一文的学习,我们已经学会如何使用Nacos来实现服务的注册与发现,同时也介绍如何通过LoadBal ...
- GDKOI 2021 Day1 PJ 爆炸记
早上睡到 7:10 分才想起今天有 GDKOI ,赶紧去买了一个面包赶去机房 发现隔壁的大奆都过来了.比赛时由于昨晚一直没睡好,打了两个小时的哈欠 T1 :暴力模拟 根据 \(r\) 和 \(c\) ...
- java8 Stream新特性
import lombok.Getter; import lombok.Setter; @Setter @Getter public class Person { private String nam ...
- redis击穿,穿透,雪崩,分布式锁,api(jedis,luttuce)
击穿:(redis做缓存用,肯定发生了高并发,到达数据库查询) 设置key 的过期时间,过期后没有这个key,找不到了,就穿过了(其中一个key过期导致并发访问数据库) LRU (LRU,即:最近最少 ...
- 智慧机房3D可视化技术解决方案
随着夏季气温越来越高,机房内大量设备同步工作时,难免使机房内温度飙升. 机房温度每升高10℃,计算机的可靠性就下降25% 磁盘磁带也会因热涨效应造成记录错误 计算机的时钟主频在温度过高都会降低 UPS ...
- SAP 维护视图隐藏字段
PBO: MODULE reset_index. 其中ZDT_BPC002_T02 为视图名称. MODULE reset_index OUTPUT. FIELD-SYMBOLS:<fs ...