解题思路:
这道题要求用三元组表的储存结构储存稀疏矩阵,并进行加法运算。 首先我们要了解一下为什么要用三元组表,对于一个稀疏矩阵,尤其是高维度时,如果以多维数组的形式开辟空间,会造成很大的不必要空间浪费,于是我们用三元组表,只存储稀疏矩阵中的非零元素,来达到储存稀疏矩阵的目的。 常见的三元组和三元组表的宏定义如下:
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
){
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
){
if(A
->data
[i
].i
==B
->data
[j
].i
&& A
->data
[i
].j
==B
->data
[j
].j
){
sum
= A
->data
[i
].val
+ B
->data
[j
].val
;
if(sum
!=0){
C
->data
[C_tu
].i
= A
->data
[i
].i
;
C
->data
[C_tu
].j
= A
->data
[i
].j
;
C
->data
[C_tu
].val
= sum
;
C_tu
++;
}
i
++;
j
++;
}
else if(A
->data
[i
].i
< B
->data
[j
].i
){
C
->data
[C_tu
].i
= A
->data
[i
].i
;
C
->data
[C_tu
].j
= A
->data
[i
].j
;
C
->data
[C_tu
].val
= A
->data
[i
].val
;
C_tu
++;
i
++;
}
else if(A
->data
[i
].i
> B
->data
[j
].i
){
C
->data
[C_tu
].i
= B
->data
[j
].i
;
C
->data
[C_tu
].j
= B
->data
[j
].j
;
C
->data
[C_tu
].val
= B
->data
[j
].val
;
C_tu
++;
j
++;
}
else if(A
->data
[i
].j
< B
->data
[j
].j
){
C
->data
[C_tu
].i
= A
->data
[i
].i
;
C
->data
[C_tu
].j
= A
->data
[i
].j
;
C
->data
[C_tu
].val
= A
->data
[i
].val
;
C_tu
++;
i
++;
}
else{
C
->data
[C_tu
].i
= B
->data
[j
].i
;
C
->data
[C_tu
].j
= B
->data
[j
].j
;
C
->data
[C_tu
].val
= B
->data
[j
].val
;
C_tu
++;
j
++;
}
}
while(i
<A
->tu
){
C
->data
[C_tu
].i
= A
->data
[i
].i
;
C
->data
[C_tu
].j
= A
->data
[i
].j
;
C
->data
[C_tu
].val
= A
->data
[i
].val
;
C_tu
++;
i
++;
}
while(j
<B
->tu
){
C
->data
[C_tu
].i
= B
->data
[j
].i
;
C
->data
[C_tu
].j
= B
->data
[j
].j
;
C
->data
[C_tu
].val
= B
->data
[j
].val
;
C_tu
++;
j
++;
}
C
->tu
= C_tu
;
}
void PrintTSMatrix(TSMatrix
*C
){
for(int i
=0;i
<C
->tu
;i
++){
printf("\n%d %d %d",C
->data
[i
].i
,C
->data
[i
].j
,C
->data
[i
].val
);
}
}
int main(){
int t1
,t2
;
scanf("%d %d",&t1
,&t2
);
TSMatrix
*pa
,*pb
,*pc
;
pa
= (TSMatrix
*)malloc(sizeof(TSMatrix
));
pb
= (TSMatrix
*)malloc(sizeof(TSMatrix
));
pc
= (TSMatrix
*)malloc(sizeof(TSMatrix
));
CreatTSMatrix(pa
,t1
);
CreatTSMatrix(pb
,t2
);
CreatTSMatrix(pc
,t1
+t2
);
for(int i
=0;i
<t1
;i
++){
scanf("%d %d %d",&pa
->data
[i
].i
,&pa
->data
[i
].j
,&pa
->data
[i
].val
);
}
for(int i
=0;i
<t2
;i
++){
scanf("%d %d %d",&pb
->data
[i
].i
,&pb
->data
[i
].j
,&pb
->data
[i
].val
);
}
AddTwoTSMatrix(pa
,pb
,pc
);
PrintTSMatrix(pc
);
return 0;
}