三元组顺序表表示的稀疏矩阵加法

2023-05-16

三元组顺序表表示的稀疏矩阵加法。

输入格式:

输入第1行为两个同型矩阵的行数m、列数n,矩阵A的非零元素个数t1,矩阵B的非零元素个数t2。

按行优先顺序依次输入矩阵A三元组数据,共t1行,每行3个数,分别表示非零元素的行标、列标和值。
按行优先顺序依次输入矩阵B三元组数据,共t2行,每行3个数,分别表示非零元素的行标、列标和值。

输出格式:

输出第1行为相加后矩阵行数m、列数n及非零元素个数t。
输出t行相加后的三元组顺序表结果,每行输出非零元素的行标、列标和值,每行数据之间用空格分隔。

输入样例:

4 4 3 4

0 1 -5

1 3 1

2 2 1

0 1 3

1 3 -1

3 0 5

3 3 7

输出样例:

4 4 4

0 1 -2

2 2 1

3 0 5

3 3 7


输出结果:  

 


 

主要算法: 


bool Add(TSMatrix A, TSMatrix B, TSMatrix& C) {	//三元表组相加 
	if (A.m != B.m || A.n != B.n)		//两个矩阵只有行列数相同才可以相加
		return false;
	C.m = A.m;
	C.n = A.n;
	int i = 1, j = 1, count = 1, n = 1;
	while (i <= A.length && j <= B.length) {
		if (A.data[i].row == B.data[j].row) {			//矩阵A当前元素行号等于矩阵B当前元素行号 
			if (A.data[i].col == B.data[j].col) {		//矩阵A当前元素列号等于矩阵B当前元素列号 
				if (A.data[count].elem + B.data[count].elem != 0)
				{
					C.data[count] = A.data[i];
					C.data[count].elem += B.data[j].elem;
					count++;
				}
				++i; ++j;
				
			}
			else if (A.data[i].col < B.data[j].col) {	//矩阵A当前元素列号小于矩阵B当前元素列号 
				C.data[count] = A.data[i];
				++i; ++count;
			}
			else if (A.data[i].col > B.data[j].col) {	//矩阵A当前元素列号大于矩阵B当前元素列号 
				C.data[count] = B.data[j];
				++j; ++count;
			}
		}
		else if (A.data[i].row < B.data[j].row) {		//矩阵A当前元素行号小于矩阵B当前元素行号 
			C.data[count] = A.data[i];
			++i; ++count;
		}
		else if (A.data[i].row > B.data[j].row) {		//矩阵A当前元素行号大于矩阵B当前元素行号 
			C.data[count] = B.data[j];
			++j; ++count;
		}
			
	}
	while (i <= A.length) {
		C.data[count] = A.data[i];
		++i; ++count;
	}
	while (j <= B.length) {
		C.data[count] = B.data[j];
		++j; ++count;
	}
	C.length = --count;
	return true;
}



 完整代码:

#include<iostream>
using namespace std;
#define MAXSIZE 100

typedef struct {
	int row, col;
	int elem;
}triple;

typedef struct {
	triple data[MAXSIZE + 1];		//零号元素位置弃用
	int m, n, length;				//矩阵的行数、列数和非零元素的个数 
}TSMatrix;

void Initialise(TSMatrix& M,TSMatrix &N){		//三元表组初始化 
	int r, c,la,lb;
	cin >> r >> c >> la>> lb;
	M.m = N.m = r;
	M.n = N.n = c;
	M.length = la;
	N.length = lb;
	for (int i = 1; i <= M.length; ++i)
		cin >> M.data[i].row >> M.data[i].col >> M.data[i].elem;
	for(int j=1;j<=N.length;j++)
	    cin >> N.data[j].row >> N.data[j].col >> N.data[j].elem;
}

bool Add(TSMatrix A, TSMatrix B, TSMatrix& C) {	//三元表组相加 
	if (A.m != B.m || A.n != B.n)		//两个矩阵只有行列数相同才可以相加
		return false;
	C.m = A.m;
	C.n = A.n;
	int i = 1, j = 1, count = 1, n = 1;
	while (i <= A.length && j <= B.length) {
		if (A.data[i].row == B.data[j].row) {			//矩阵A当前元素行号等于矩阵B当前元素行号 
			if (A.data[i].col == B.data[j].col) {		//矩阵A当前元素列号等于矩阵B当前元素列号 
				if (A.data[count].elem + B.data[count].elem != 0)
				{
					C.data[count] = A.data[i];
					C.data[count].elem += B.data[j].elem;
					count++;
				}
				++i; ++j;
				
			}
			else if (A.data[i].col < B.data[j].col) {	//矩阵A当前元素列号小于矩阵B当前元素列号 
				C.data[count] = A.data[i];
				++i; ++count;
			}
			else if (A.data[i].col > B.data[j].col) {	//矩阵A当前元素列号大于矩阵B当前元素列号 
				C.data[count] = B.data[j];
				++j; ++count;
			}
		}
		else if (A.data[i].row < B.data[j].row) {		//矩阵A当前元素行号小于矩阵B当前元素行号 
			C.data[count] = A.data[i];
			++i; ++count;
		}
		else if (A.data[i].row > B.data[j].row) {		//矩阵A当前元素行号大于矩阵B当前元素行号 
			C.data[count] = B.data[j];
			++j; ++count;
		}
			
	}
	while (i <= A.length) {
		C.data[count] = A.data[i];
		++i; ++count;
	}
	while (j <= B.length) {
		C.data[count] = B.data[j];
		++j; ++count;
	}
	C.length = --count;
	return true;
}

void Show(TSMatrix M) {
	cout << M.m <<" " << M.n << " "<< M.length << endl;
	for (int i = 1; i <= M.length; ++i) {
		cout << M.data[i].row << " " << M.data[i].col << " " << M.data[i].elem << endl;
	}
}

int main() {
	TSMatrix A,B,C;
	cout << "请输入稀疏矩阵A,B的行数、列数和非零元素的个数:" << endl;
	Initialise(A,B);
	if (!Add(A, B, C)) {
		cout << "矩阵行列数不同,无法相加!";
		return 0;
	}
	cout << "三元组表C:" << endl;
	Show(C);
	return 0;
}

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三元组顺序表表示的稀疏矩阵加法 的相关文章

  • 4.25-5.1,创建修改文件目录,查看命令,查找命令,用户管理命令

    创建和修改文件和目录 修改文件所有者和权限 查看 创建链接 执行内容和目录搜索 cat 显示文件内容 xff08 不好用 xff09 tac 倒着显示nl 行号more 一页一页的显示文件内容less 可以翻页head 头搭配 ntail
  • CenTos 7.6 1810 重置root密码

    引导页面按 e 在UTF 8 后追加 init 61 bin sh Ctrl 43 x 进入单用户模式 mount o remount rw 挂载根目录 passwd root xff08 不使用小键盘 xff09 更新系统信息命令 tou
  • Ubuntu基础——网络配置+配置apt源(手把手教程)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 安装环境 xff1a Ubuntu22 04 一 xff1b 切换管理员模式 首先我们来到命令行输入su xff08 请注意命令的空格 x
  • 不建议单片机的IO口直接驱动直流电机

    实验目的 想通过单片机的PF9引脚pwm输出来调节直流马达速度 硬件连接 xff1a 直流马达的两个引脚一端接PF9 另一端接GND 实验现象 xff1a 直流电机不转 xff0c 但是用万用表测量PF9和地之间有电压 但是连上电机后 xf
  • Ubuntu系统进行复制粘贴文件显示没有权限的解决办法

    Ctrl 43 alt 43 T打开终端 输入命令sudo nautilus 然后就可以打开一个不需要管理员权限的界面 xff0c 可以直接复制粘贴 亲测有效 xff01 xff01 借鉴于博客 xff1a https blog csdn
  • Windows下Python安装twint的方法

    1 安装git xff0c 如果不安git工具 xff0c 用pip install twint安装出来的twint是运行不了的 Git Downloading Package git scm com 64位的链接https github
  • 初学Python,if __name__ == ‘__main__‘:

    if name 61 61 39 main 39 若是在当前文件 xff0c name 是 main 若是导入的文件 xff0c name 是模块名 这句话的意思就是 xff0c 当模块被直接运行时 xff0c 以下代码块将被运行 xff0
  • 初学Python,urllib实现翻译

    import urllib request import urllib parse import json import time url 61 34 https fanyi youdao com translate smartresult
  • PVE踩坑实录2设置无线网卡

    wifi设置 1 在https www wireshark org tools wpa psk html上面算出自己的wap psk 2 修改网卡设置 vi etc network interfaces auto wlp2s0 iface
  • A10-7860K试装DSM

    家里旧电脑一台 xff0c A10 7860K xff0c 想发挥下余热 xff0c 然后就是一周的尝试 终于暂时可以用如下配置启动 xff0c 无错误 PVE7 3 1 处理器host xff0c SeaBIOS xff0c 机型i440
  • 记一起和前端没什么卵关系的OPTION 405问题

    记一起和前端没什么卵关系的后端405问题 问题的关键点在于本来是POST请求 xff0c 会变成OPTION请求 xff0c 并且提示405报错 xff0c 会类似跨域 并且只有某些手机机型才会 xff08 如Oppo系列 xff09 其实
  • 单点登录 Oauth2认证 详解

    1 单点登录的特点是 xff1a 1 认证系统为独立的系统 2 各子系统通过Http或其它协议与认证系统通信 xff0c 完成用户认证 3 用户身份信息存储在Redis集群 Java中有很多用户认证的框架都可以实现单点登录 xff1a 1
  • 【JAVA】-JAVA简介

    目录 一 JAVA的简介 发展概述 语言的优势 二 JAVA的特性 一 JAVA的简介 发展概述 1 1 JAVA语言发展简史 Java 语言源于 1991 年 4 月 xff0c Sun 公司 James Gosling博士 领导的绿色计
  • SpringBoot整合mybatis-plus实现分页查询(建议收藏)

    一 前言 最近学习了SpringBoot分页查询的两种写法 xff0c 一种是手动实现 xff0c 另一种是使用框架实现 现在我将具体的实现流程分享一下 二 手动实现分页查询 先复习一下 xff0c SQL中的limit关键字 xff0c
  • MySQL 数据库 分组查询

    分组查询 xff1a 包括单列分组查询和多列分组查询 group by 单列分组查询 示例 xff1a 1 根据科目分组 xff0c 查询每个科目的平均分 2 根据班级分组 xff0c 查询每个班级成绩总数 3 根据班级分组 xff0c 查
  • JAVA http请求工具类

    原文 xff1a JAVA http请求工具类 月半花开的博客 CSDN博客 目录 1 第一种http requst 1 xff09 maven引入 2 xff09 Get请求请求示例 3 xff09 post请求请求示例 2 第二种hut
  • Weather API 天气应用 API调用分享

    Weather API 分享 链接 xff1a https openweathermap org api 注册默认是One Call API 3 0 适合学生项目练手 提供以下天气数据 xff1a 当前天气每小时 分钟预报48小时每小时预报
  • pip安装python包到指定路径

    1 2 我们可以先进入创建好的虚拟环境的site packages 我还没有尝试 xff1a
  • Kubernetes1.26.0部署(Ubuntu/CentOS)

    文章目录 前言准备工作准备5台虚拟机初始化操作Centos配置yum源配置免密 修改hostname 关闭防火墙 selinux 关闭swap分区 方便后面进行其它操作 下载软件包并批量安装配置时间同步配置打开文件描述符添加ipvs模块和内

随机推荐