以十字链表为存储结构实现矩阵相加(严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> ...
随机推荐
- OpenStack平台调度策略优化
OpenStack平台报错分析 在OpenStack平台经历大并发的时候,比如同一个平台,大量的用户同时创建云主机(单个用户创建大量云主机不会触发此种现象),会达到云平台的性能瓶颈,导致创建云主机报错 ...
- maccms10二开批量入库和资源打包
批量入库 因为maccms自带的采集采集起来很慢,而且很多资源站的采集接口不能对内容排序,导致最旧的数据最后入库.用java写个采集程序,采集完入库的时候发现不能一次性入库多个数据,导致入库也很慢,所 ...
- 如何形象简单地理解java中只有值传递,而没有引用传递?
首先,java中只有值传递,没有引用传递.可以说是"传递的引用(地址)",而不能说是"按引用传递". 按值传递意味着当将一个参数传递给一个函数时,函数接收的是原 ...
- 流量治理神器-Sentinel 究竟是怎么做到让业务方接入简单?
大家好,我是架构摆渡人,这是流量治理系列的第10篇原创文章,如果有收获,还请分享给更多的朋友. 做业务开发,需要考虑业务的扩展性.做基础框架开发,需要考虑如何让业务方接入,使用简单,尽量不要耦合在业务 ...
- 思科,华为l2tp组网,家庭宽带,公司内网数据分离
拓扑 简介 办公网使用专线接入,拥有固定IP地址,网络出口使用防火墙做NAT,下联交换机接入服务器,办公电脑等,旁挂思科路由器做L2TP LNS 家庭宽带使用ADSL线路,华为路由器做拨号设备与DHC ...
- Tenseal库
在此记录Tenseal的学习笔记 介绍 在张量上进行同态计算的库,是对Seal的python版实现,给开发者提供简单的python接口,无需深究底层密码实现. 当前最新版本:3.11 位置:A lib ...
- 75. Sort Colors - LeetCode
Question 75. Sort Colors Solution 题目大意: 给一个数组排序,这个数组只有0,1,2三个元素,要求只遍历一遍 思路: 记两个索引,lowIdx初始值为0,highId ...
- async用法
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- TENSEAL: A LIBRARY FOR ENCRYPTED TENSOR OP- ERATIONS USING HOMOMORPHIC ENCRYPTION 解读
本文记录阅读该paper的笔记,这篇论文是TenSeal库的原理介绍. 摘要 机器学习算法已经取得了显著的效果,并被广泛应用于各个领域.这些算法通常依赖于敏感和私有数据,如医疗和财务记录.因此,进一步 ...
- 第6组 Beta冲刺 总结
目录 1. 基本情况 2. 思考与总结 2.1. 设想和目标 2. 计划 3. 资源 4. 变更管理 5. 设计/实现 6. 测试/发布 7. 团队的角色,管理,合作 8. 总结 3. 敏捷开发 1. ...