『西工大-数据结构-NOJ』 012-以三元组表为存储结构实现矩阵相加(耿5.7) 『西北工业大学』
解题思路:
这道题要求用三元组表的储存结构储存稀疏矩阵,并进行加法运算。
首先我们要了解一下为什么要用三元组表,对于一个稀疏矩阵,尤其是高维度时,如果以多维数组的形式开辟空间,会造成很大的不必要空间浪费,于是我们用三元组表,只存储稀疏矩阵中的非零元素,来达到储存稀疏矩阵的目的。
常见的三元组和三元组表的宏定义如下:
typedef struct{
//定义三元组
int i,j;
int val;
}Triple;
typedef struct{
//定义三元组表
Triple *data;//多个三元组
int mu,nu,tu;//最大行,最大列,有效元素个数
}TSMatrix;
再进行三元组操作的时候很重要的的一点是要注意三元组表的规范性,即三元组表中的三元组储存次序是按照:①行由低到高;②列由低到高 来储存的。
故本题的难点在于在进行三元组表储存到稀疏矩阵的加法运算时,不仅要利用旧三元组表的规范性,而且还要保证新三元组表的规范性,为实现这些我们要在加法运算中进行全面的分类执行。
具体操作见代码,代码中有部分注释。
题解代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct{
//定义三元组
int i,j;
int val;
}Triple;
typedef struct{
//定义三元组表
Triple *data;//多个三元组
int mu,nu,tu;//最大行,最大列,有效元素个数
}TSMatrix;
void CreatTSMatrix(TSMatrix *p,int n){
//申请一个容量为n的三元组表
p->data = (Triple*)malloc(sizeof(Triple)*n);
p->tu = n;
}
void AddTwoTSMatrix(TSMatrix *A, TSMatrix *B, TSMatrix *C){
int i=0,j=0,sum,C_tu=0;
while(i<A->tu && j<B->tu){
//当还有AB均有值未进行加法运算
if(
Jse_NGU: 貌似不是G->vexs[v1] 而应该是G->vexs[v1在邻接表的下标]
2201_76039887: 有个疑问❓,可不可以不用指针的指针**T,而直接用*t来专递树的指针呢?
weixin_46008420: 请问noj的网址是多少
嗨嗨害 嗨害: 第50行为什么要g节点没被访问过呢
LWK999999: 相加函数有个地方写错了,应该是q->right=p->right