第八周项目4 稀疏矩阵的三元组的实现与应用

来源:互联网 发布:淘宝点外卖 编辑:程序博客网 时间:2024/06/05 15:55
  1. /* 
  2. * Copyright(c) 2017,烟台大学计算机学院 
  3. * All rights reserved. 
  4. * 文件名称:cpp1. 
  5. * 作    者:刘思源 
  6. * 完成日期:2017 年 10 月 22 日 
  7. * 版 本 号:v1.0 
  8. * 
  9. * 问题描述:采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法 
  10. 提示1:两个行数、列数相同的矩阵可以相加 
  11. 提示2:充分利用已经建立好的算法库解决问题 
  12. 提示3:教材例6.3已经给出两个稀疏矩阵相加的运算的算法,但未利用基本运算。请比较这两种方案 
  13. * 输入描述:无需输入 
  14. * 程序输出:实现各种算法的函数的测试结果 
  15. */  


解答一:

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include "tup.h"  
  3. bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c)  
  4. {  
  5.     int i,j;  
  6.     ElemType va,vb,vc;  
  7.     if (a.rows!=b.rows || a.cols!=b.cols)  
  8.         return false;                        //行数或列数不等时不能进行相加运算  
  9.     c.rows=a.rows;  
  10.     c.cols=a.cols;       //c的行列数与a的相同  
  11.     c.nums=0;  
  12.     for(i=0; i<M; i++)  
  13.         for(j=0; j<N; j++)  
  14.         {  
  15.             Assign(a,va,i,j);  
  16.             Assign(b,vb,i,j);  
  17.             vc=va+vb;  
  18.             if(vc)  
  19.                 Value(c,vc,i,j);  
  20.         }  
  21.     return true;  
  22. }  
  23.   
  24. int main()  
  25. {  
  26.     TSMatrix ta,tb,tc;  
  27.     int A[M][N]=  
  28.     {  
  29.         {0,0,1,0,0,0,0},  
  30.         {0,2,0,0,0,0,0},  
  31.         {3,0,0,0,0,0,0},  
  32.         {0,0,0,5,0,0,0},  
  33.         {0,0,0,0,6,0,0},  
  34.         {0,0,0,0,0,7,4}  
  35.     };  
  36.     int B[M][N]=  
  37.     {  
  38.         {0,0,10,0,0,0,0},  
  39.         {0,0,0,20,0,0,0},  
  40.         {0,0,0,0,0,0,0},  
  41.         {0,0,0,50,0,0,0},  
  42.         {0,0,20,0,0,0,0},  
  43.         {0,0,0,10,0,0,4}  
  44.     };  
  45.     CreatMat(ta,A);  
  46.     CreatMat(tb,B);  
  47.     printf("A:\n");  
  48.     DispMat(ta);  
  49.     printf("B:\n");  
  50.     DispMat(tb);  
  51.     if(MatAdd(ta, tb, tc))  
  52.     {  
  53.         printf("A+B:\n");  
  54.         DispMat(tc);  
  55.     }  
  56.     else  
  57.     {  
  58.         printf("相加失败\n");  
  59.     }  
  60.     return 0;  
  61. }  
解答二:

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include "tup.h"  
  3. bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c)  
  4. {  
  5.     int i=0,j=0,k=0;  
  6.     ElemType v;  
  7.     if (a.rows!=b.rows || a.cols!=b.cols)  
  8.         return 0;        //行数或列数不等时不能进行相加运算  
  9.     c.rows=a.rows;  
  10.     c.cols=a.cols;       //c的行列数与a的相同  
  11.     while (i<a.nums && j<b.nums)         //处理a和b中的每个元素  
  12.     {  
  13.         if (a.data[i].r==b.data[j].r)    //行号相等时  
  14.         {  
  15.             if(a.data[i].c<b.data[j].c)  //a元素的列号小于b元素的列号  
  16.             {  
  17.                 c.data[k].r=a.data[i].r;//将a元素添加到c中  
  18.                 c.data[k].c=a.data[i].c;  
  19.                 c.data[k].d=a.data[i].d;  
  20.                 k++;  
  21.                 i++;  
  22.             }  
  23.             else if (a.data[i].c>b.data[j].c)//a元素的列号大于b元素的列号  
  24.             {  
  25.                 c.data[k].r=b.data[j].r;      //将b元素添加到c中  
  26.                 c.data[k].c=b.data[j].c;  
  27.                 c.data[k].d=b.data[j].d;  
  28.                 k++;  
  29.                 j++;  
  30.             }  
  31.             else                    //a元素的列号等于b元素的列号  
  32.             {  
  33.                 v=a.data[i].d+b.data[j].d;  
  34.                 if (v!=0)           //只将不为0的结果添加到c中  
  35.                 {  
  36.                     c.data[k].r=a.data[i].r;  
  37.                     c.data[k].c=a.data[i].c;  
  38.                     c.data[k].d=v;  
  39.                     k++;  
  40.                 }  
  41.                 i++;  
  42.                 j++;  
  43.             }  
  44.         }  
  45.         else if (a.data[i].r<b.data[j].r) //a元素的行号小于b元素的行号  
  46.         {  
  47.             c.data[k].r=a.data[i].r;      //将a元素添加到c中  
  48.             c.data[k].c=a.data[i].c;  
  49.             c.data[k].d=a.data[i].d;  
  50.             k++;  
  51.             i++;  
  52.         }  
  53.         else                              //a元素的行号大于b元素的行号  
  54.         {  
  55.             c.data[k].r=b.data[j].r;      //将b元素添加到c中  
  56.             c.data[k].c=b.data[j].c;  
  57.             c.data[k].d=b.data[j].d;  
  58.             k++;  
  59.             j++;  
  60.         }  
  61.         c.nums=k;  
  62.     }  
  63.     return true;  
  64. }  
  65.   
  66. int main()  
  67. {  
  68.     TSMatrix ta,tb,tc;  
  69.     int A[M][N]=  
  70.     {  
  71.         {0,0,1,0,0,0,0},  
  72.         {0,2,0,0,0,0,0},  
  73.         {3,0,0,0,0,0,0},  
  74.         {0,0,0,5,0,0,0},  
  75.         {0,0,0,0,6,0,0},  
  76.         {0,0,0,0,0,7,4}  
  77.     };  
  78.     int B[M][N]=  
  79.     {  
  80.         {0,0,10,0,0,0,0},  
  81.         {0,0,0,20,0,0,0},  
  82.         {0,0,0,0,0,0,0},  
  83.         {0,0,0,50,0,0,0},  
  84.         {0,0,20,0,0,0,0},  
  85.         {0,0,0,10,0,0,4}  
  86.     };  
  87.     CreatMat(ta,A);  
  88.     CreatMat(tb,B);  
  89.     printf("A:\n");  
  90.     DispMat(ta);  
  91.     printf("B:\n");  
  92.     DispMat(tb);  
  93.     if(MatAdd(ta, tb, tc))  
  94.     {  
  95.         printf("A+B:\n");  
  96.         DispMat(tc);  
  97.     }  
  98.     else  
  99.     {  
  100.         printf("相加失败\n");  
  101.     }  
  102.     return 0;  
  103. }  

运行结果:

阅读全文
0 0
原创粉丝点击