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

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

输入格式:

输入第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;
}

 

 

 

  • 2
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
十字链表是一种用于表示稀疏矩阵数据结构,它可以高效地存储和处理稀疏矩阵。 在进行十字链表稀疏矩阵加法时,我们需要进行以下步骤: 1. 创建两个稀疏矩阵的十字链表表示。 2. 初始化一个新的十字链表来存储结果矩阵。 3. 遍历两个输入矩阵的十字链表,同时进行如下操作: a. 如果两个链表的行号和列号相等,说明有相同的元素可以相加,将它们的值相加,并将结果插入到结果链表中。 b. 如果链表1的行号小于链表2的行号,说明链表1中存在元素而链表2中不存在,直接将链表1的元素插入结果链表中。 c. 如果链表2的行号小于链表1的行号,说明链表2中存在元素而链表1中不存在,直接将链表2的元素插入结果链表中。 4. 返回结果链表作为结果矩阵。 这样,我们就可以实现两个稀疏矩阵的加法操作。 当进行稀疏矩阵加法时,可能会遇到以下问题: 1. 如何创建十字链表表示稀疏矩阵:可以使用一个结构体来表示每个非零元素,结构体包含行号、列号和值等信息。然后,使用链表来存储这些结构体,同时使用一维数组来存储每个行和列的头指针。 2. 如何处理两个链表的合并:可以使用双指针来遍历两个链表,根据行号和列号的大小关系来决定插入哪个元素到结果链表中,然后将指针移动到下一个节点。 3. 如何处理相同位置的元素相加:可以直接将两个元素的值相加,并将结果插入到结果链表中。 相关问题: 1. 如何实现稀疏矩阵的乘法? 2. 如何实现稀疏矩阵的转置? 3. 如何实现稀疏矩阵的压缩存储? 4. 如何实现稀疏矩阵的逆转?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值