第九周项目3-稀疏矩阵的三元组表示的实现及应用(1)

来源:互联网 发布:国行a1533支持什么网络 编辑:程序博客网 时间:2024/06/02 01:59
  1. /* 
  2.  
  3. copyright (t) 2016,烟台大学计算机学院 
  4.  
  5. *All rights reserved. 
  6.  
  7. *文件名称:1.cpp 
  8.  
  9. *作者:车金阳
  10.  
  11. *完成日期:2016年12月15日 
  12.  
  13. *版本号:v1.0 
  14.  
  15. *问题描述:建立稀疏矩阵三元组表示的算法库,包括:  
  16. ① 头文tup.h,定义数据类型,声明函数;  
  17. ② 源文件tup.cpp,实现稀疏矩阵三元组表示的基本运算,主要算法包括: 
  18.     void CreatMat(TSMatrix &t,ElemType A[M][N]);      //从一个二维稀疏矩阵创建其三元组表示 
  19.     bool Value(TSMatrix &t,ElemType x,int i,int j);   //三元组元素赋值 
  20.     bool Assign(TSMatrix t,ElemType &x,int i,int j);  //将指定位置的元素值赋给变量 
  21.     void DispMat(TSMatrix t);                         //输出三元组 
  22.     void TranTat(TSMatrix t,TSMatrix &tb);            //矩阵转置 
  23. ③ 设计main函数,测试上面实现的算法  
  24.  
  25. *输入描述:无 
  26.  
  27. *程序输出:测试结果 
  28.  
  29. */  

tup.h:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2. #define MaxSize 100  
  3. #define M 6  
  4. #define N 7  
  5. typedef int ElemType;  
  6. typedef struct  
  7. {  
  8.     int r;  
  9.     int c;  
  10.     ElemType d;  
  11. } TupNode;  
  12. typedef struct  
  13. {  
  14.     int rows;  
  15.     int cols;  
  16.     int nums;  
  17.     TupNode data[MaxSize];  
  18. } TSMatrix;  
  19. void CreatMat(TSMatrix &t,ElemType A[M][N]);          //从一个二维稀疏矩阵创建其三元组表示  
  20. bool Assign(TSMatrix t,ElemType &x,int i,int j);      //将指定位置的元素值赋给变量  
  21. bool Value(TSMatrix &t,ElemType x,int i,int j);       //三元组元素取值  
  22. void DispMat(TSMatrix t);                             //输出三元组  
  23. void TranTat(TSMatrix t,TSMatrix &tb);                //矩阵转置  

tup.cpp:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include "tup.h"  
  2. void CreatMat(TSMatrix &t,ElemType A[M][N])           //从一个二维稀疏矩阵创建其三元组表示  
  3. {  
  4.     int i,j;  
  5.     t.rows=M,t.cols=N,t.nums=0;                       //行号、列号、非零元素个数初始化  
  6.     for(i=0;i<M;i++)                                  //行序方式扫描二维稀疏矩阵A,非零元素插入三元组t  
  7.     {  
  8.         for(j=0;j<N;j++)  
  9.         {  
  10.             if(A[i][j]!=0)                            //记录非零元素所在行列号,元素值赋给data[],非零元素个数+1  
  11.             {  
  12.                 t.data[t.nums].r=i;  
  13.                 t.data[t.nums].c=j;  
  14.                 t.data[t.nums].d=A[i][j];  
  15.                 t.nums++;  
  16.             }  
  17.         }  
  18.     }  
  19. }  
  20. bool Assign(TSMatrix t,ElemType &x,int i,int j)       //将指定位置的元素值赋给变量  
  21. {  
  22.     int k=0;                                          //从第1个非零元素开始遍历  
  23.     if(i>=t.rows || j>=t.cols)                        //i.j不符合要求,返回false  
  24.         return false;  
  25.     while(k<t.nums && i>t.data[k].r)                  //按行查找  
  26.         k++;  
  27.     while(k<t.nums && i==t.data[k].r && j>t.data[k].c) //在查找到的行按列查找  
  28.         k++;  
  29.     if(t.data[k].r==i && t.data[k].c==j)              //找到第i行第j列的元素,将值赋给x  
  30.         x=t.data[k].d;  
  31.     else                                              //k=t.nums,未找到  
  32.         x=0;  
  33.     return true;  
  34. }  
  35. bool Value(TSMatrix &t,ElemType x,int i,int j)        //三元组元素取值  
  36. {  
  37.     int k=0;  
  38.     int k1;  
  39.     if(i>=t.rows || j>=t.cols)                        //i.j不符合要求,返回false  
  40.         return false;  
  41.     while(k<t.nums && i>t.data[k].r)                  //按行查找  
  42.         k++;  
  43.     while(k<t.nums && i==t.data[k].r && j>t.data[k].c) //在查找到的行按列查找  
  44.         k++;  
  45.     if(t.data[k].r==i && t.data[k].c==j)              //存在第i行第j列这样的元素,直接赋值x  
  46.         t.data[k].d=x;  
  47.     else                                              //其它情况,不存在这样的元素,插入一个元素  
  48.     {  
  49.         for(k1=t.nums-1;k1>=k;k1--)                   //依次移动“腾空位”  
  50.         {  
  51.             t.data[k1+1].r=t.data[k1].r;  
  52.             t.data[k1+1].c=t.data[k1].c;  
  53.             t.data[k1+1].d=t.data[k1].d;  
  54.         }  
  55.         t.data[k].r=i;                                //在腾出的空位处插入指定元素x的行列号及元素值  
  56.         t.data[k].c=j;  
  57.         t.data[k].d=x;  
  58.         t.nums++;  
  59.     }  
  60.     return true;  
  61. }  
  62. void DispMat(TSMatrix t)                              //输出三元组  
  63. {  
  64.     int i;  
  65.     if(t.nums<=0)  
  66.         return;  
  67.     printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);  
  68.     printf("\t------------------\n");  
  69.     for(i=0;i<t.nums;i++)  
  70.         printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d);  
  71. }  
  72. void TranTat(TSMatrix t,TSMatrix &tb)                 //矩阵转置  
  73. {  
  74.     int i,j;  
  75.     int k=0;  
  76.     tb.rows=t.cols,tb.cols=t.rows,tb.nums=t.nums;  
  77.     if(t.nums!=0)  
  78.     {  
  79.         for(i=0;i<t.cols;i++)  
  80.         {  
  81.             for(j=0;j<t.nums;j++)  
  82.             {  
  83.                 if(t.data[j].c==i)  
  84.                 {  
  85.                     tb.data[k].r=t.data[j].c;  
  86.                     tb.data[k].c=t.data[j].r;  
  87.                     tb.data[k].d=t.data[j].d;  
  88.                     k++;  
  89.                 }  
  90.             }  
  91.         }  
  92.     }  
  93. }  

main.cpp:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2. #include "tup.h"  
  3. int main()  
  4. {  
  5.     TSMatrix t,tb;  
  6.     int x,y=10;  
  7.     int A[6][7]=  
  8.     {  
  9.         {0,0,1,0,0,0,0},  
  10.         {0,2,0,0,0,0,0},  
  11.         {3,0,0,0,0,0,0},  
  12.         {0,0,0,5,0,0,0},  
  13.         {0,0,0,0,6,0,0},  
  14.         {0,0,0,0,0,7,4}  
  15.     };  
  16.     CreatMat(t,A);  
  17.     printf("b:\n");  
  18.     DispMat(t);  
  19.     if (Assign(t,x,2,5)==true)                      //调用时返回true  
  20.         printf("Assign(t,x,2,5)=>x=%d\n",x);  
  21.     else                                            //调用时返回false  
  22.         printf("Assign(t,x,2,5)=>参数错误\n");  
  23.     Value(t,y,2,5);  
  24.     printf("执行Value(t,10,2,5)\n");  
  25.     if (Assign(t,x,2,5)==true)                      //调用时返回true  
  26.         printf("Assign(t,x,2,5)=>x=%d\n",x);  
  27.     else                                            //调用时返回false  
  28.         printf("Assign(t,x,2,5)=>参数错误\n");  
  29.     printf("b:\n");  
  30.     DispMat(t);  
  31.     TranTat(t,tb);  
  32.     printf("矩阵转置tb:\n");  
  33.     DispMat(tb);  
  34.     return 0;  
  35. }  

运行结果:

0 0