三元组顺序表表示的稀疏矩阵加法。
(1) 输入说明:输入第1行为两个同型矩阵的行数m、列数n,矩阵A的非零元素个数t1,矩阵B的非零元素个数t2。 按行优先顺序依次输入矩阵A三元组数据,共t1行,每行3个数,分别表示非零元素的行标、列标和值。 按行优先顺序依次输入矩阵B三元组数据,共t2行,每行3个数,分别表示非零元素的行标、列标和值。
(2) 输出说明:输出第1行为相加后矩阵行数m、列数n及非零元素个数t。 输出t行相加后的三元组顺序表结果,每行输出非零元素的行标、列标和值,每行数据之间用空格分隔。
(3) 测试样例:
输入样例:
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
代码:
1 #include<iostream>
2
3 #define MAXSIZE 100
4
5 using namespace std;
6
7 typedef int ElemType;
8
9 typedef struct{//三元组的定义
10 int r;//行号
11 int c;//列号
12 ElemType e;
13 }mytuple;
14
15 typedef struct{
16 int row;//行数
17 int column;//列数
18 int num;//非零元的个数
19 mytuple data[MAXSIZE];
20 }Matrix;
21
22 void addition(Matrix a, Matrix b, Matrix &c)
23 {
24 int i = 0, j = 0, m = 0;
25 int sum;
26 while(i<a.num && j<b.num)
27 {//A和B都没有计算结束的时候
28 if(a.data[i].r<b.data[j].r || (a.data[i].r==b.data[j].r && a.data[i].c<b.data[j].c))
29 {//A的元素在B元素的前面
30 c.data[m].r = a.data[i].r;
31 c.data[m].c = a.data[i].c;
32 c.data[m].e = a.data[i].e;
33 m++;
34 i++;
35 }
36 else if(a.data[i].r==b.data[j].r && a.data[i].c==b.data[j].c)
37 {//A和B的元素行号列号相等
38 sum = a.data[i].e + b.data[i].e;
39 if(sum != 0)//不等于0的时候才能赋值
40 {
41 c.data[m].r = a.data[i].r;
42 c.data[m].c = a.data[i].c;
43 c.data[m].e = sum;
44 m++;
45 }
46 i++;
47 j++;
48 }
49 else
50 {//B元素在A元素前面
51 c.data[m].r = b.data[i].r;
52 c.data[m].c = b.data[i].c;
53 c.data[m].e = b.data[i].e;
54 m++;
55 j++;
56 }
57 }
58 while(i<a.num)
59 {//A矩阵还没有输完
60 c.data[m].r = a.data[i].r;
61 c.data[m].c = a.data[i].c;
62 c.data[m].e = a.data[i].e;
63 i++;
64 m++;
65 }
66 while(j<b.num)
67 {//B矩阵还没有输完
68 c.data[m].r = b.data[j].r;
69 c.data[m].c = b.data[j].c;
70 c.data[m].e = b.data[j].e;
71 j++;
72 m++;
73 }
74 c.num = m;//C矩阵中非零元的个数
75 }
76
77 int main()
78 {
79 Matrix a, b, c;
80
81 cin >> a.row >> a.column >> a.num >> b.num;
82 b.row = a.row;
83 b.column = a.column;
84 c.row = a.row;//矩阵加法行和列都不变
85 c.column = a.column;
86
87 for(int i=0;i<a.num;i++)
88 {
89 cin >> a.data[i].r >> a.data[i].c >> a.data[i].e;
90 }
91 for(int i=0;i<b.num;i++)
92 {
93 cin >> b.data[i].r >> b.data[i].c >> b.data[i].e;
94 }
95
96 addition(a, b, c);
97
98 cout << c.row << " " << c.column << " " << c.num << endl;
99 for(int i=0;i<c.num;i++)
100 {
101 cout << c.data[i].r << " " << c.data[i].c << " " << c.data[i].e << endl;
102 }
103
104 return 0;
105 }
分析:
这道题是需要将矩阵压缩储存,我用的是三元组,将非零元的行号和列号和值都保存下来,然后再对应的位置做加法就好了。一开始在DEV运行的时候结果错误是因为我忘记将C矩阵的非零元个数赋值,后来加上就好了。