pta-2020DS-ch4 练习题-4-7-4 三元组顺序表表示的稀疏矩阵加法

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

(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矩阵的非零元个数赋值,后来加上就好了。

猜你喜欢

转载自www.cnblogs.com/minsiL/p/12901669.html