2651 - 数据结构/稀疏矩阵/三元组实现

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

实验原理:稀疏矩阵是指非零元素较少的矩阵,如果采用二维数组存储将会导致很大的存储空间浪费。我们可以使用(行号,列号,非零元素值)的三元组的顺序表来存储矩阵中的非零值,这样就可以不存储大量的零元素。

需要注意的是:为了操作高效,我们需要将非零元素按照行顺序排列,同一行里面按列排列。

 

实验步骤

1、实现三元组定义

2、实现稀疏矩阵定义

3、实现稀疏矩阵的元素添加方法

4、实现稀疏矩阵的输出方法

5、实现稀疏矩阵的加法

6、实现稀疏矩阵的减法

7、实现稀疏矩阵的转置

题目输入

每个输入由两个矩阵A和B组成,每个矩阵本身就按三元组的方式输入:每个矩阵的第一行由三个整数组成,n、m和c,表示矩阵的行列数和非零元素数量。

 

题目输出

输出固定文本:A'

然后输出A的转置

 

输出固定文本:A+B

然后输出A+B的结果

 

输入/输出样例

输入格式

3 3 2
0 0 5
1 2 7
3 3 2
0 0 5
2 1 9

输出格式

A'
3 3 2
(0,0)=5
(2,1)=7
A+B
3 3 3
(0,0)=10
(1,2)=7
(2,1)=9

提示

一、三元组实现

struct Triple{

 int row,col;
 float data;
 Triple(){ row=0,col=0,data=0; }
 Triple(int r,int c,float d)
 {  row=r;col=c;data=d; }

&nbsp;void Show()<br />

 {  printf("(%d,%d)=%.0f\n",row,col,data); }

};

&nbsp;

二、稀疏矩阵接口和部分实现

#define MAX_SIZE 100&nbsp;<br />

struct SparseMatrix
{
 int rows,cols;
 int count;
 Triple elems[MAX_SIZE];

&nbsp;SparseMatrix(int r,int c)<br />

 {  rows=r;  cols=c;  count=0; }

&nbsp;void AddElement(Triple &amp;t)<br />

 {  elems[count++]=t; }

<br />

 void AddElement(int r,int c,float data)
 {  elems[count++]=Triple(r,c,data); }

&nbsp;

&nbsp;SparseMatrix&amp; Transpose()<br />

 {
  SparseMatrix* result=new SparseMatrix(cols,rows);
  //TODO:实现转置

&nbsp;&nbsp;return *result;<br />

 }

&nbsp;SparseMatrix&amp; Add(SparseMatrix &amp;other)<br />

 {
  SparseMatrix result=new SparseMatrix(rows,cols);
  //TODO:完成元素相加result=this+other
  return
result;
 }
 void ShowTriple()
 {
  printf("%d %d %d\n",rows,cols,count);
  for (int i=0;i<count;i++)
   elems[i].Show();
 }

&nbsp;void ShowFull()<br />

 {
  int index=0;
  Triple triple=elems[index++];
  for (int r=0;r<rows;r++)
  {
   for (int c=0;c<cols;c++)
   {
    if (r==triple.row && c==triple.col)
    {
     printf("%.2f\t",triple.data);
     triple=elems[index++];
    }
    else
     printf("%d\t",triple.data);
   }
   printf("\n");
  }
  printf("\n");
 }
};

&nbsp;

三、主控部分:

int main()<br />

{
 int n,m,count;
 int r,c,d;
 while(scanf("%d%d%d",&n,&m,&count)==3)
 {
  SparseMatrix A(n,m);
  for (int i=0;i<count;i++)
  {
   scanf("%d%d%d",&r,&c,&d);
   A.AddElement(r,c,d);
  }
  scanf("%d%d%d",&n,&m,&count);
  SparseMatrix B(n,m);
  for (int i=0;i<count;i++)
  {
   scanf("%d%d%d",&r,&c,&d);
   B.AddElement(r,c,d);
  }
  printf("A'\n");
  A.Transpose().ShowTriple();
  printf("A+B\n");
  A.Add(B).ShowTriple();
 }

&nbsp;return 0;<br />

}

&nbsp;