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

  1. /*  
  2. Copyright (c)2016,烟台大学计算机与控制工程学院  
  3. All rights reserved.  
  4. 文件名称:项目3-1.cbp  
  5. 作    者:陈晓琳
  6. 完成日期:2016年10月27日  
  7. 版 本 号:v1.0   
  8. 问题描述:(1)建立稀疏矩阵三元组表示的算法库,包括:   
  9.   
  10. ① 头文tup.h,定义数据类型,声明函数;   
  11. ② 源文件tup.cpp,实现稀疏矩阵三元组表示的基本运算,主要算法包括:  
  12.     void CreatMat(TSMatrix &t,ElemType A[M][N]);  //从一个二维稀疏矩阵创建其三元组表示  
  13.     bool Value(TSMatrix &t,ElemType x,int i,int j);  //三元组元素赋值  
  14.     bool Assign(TSMatrix t,ElemType &x,int i,int j);  //将指定位置的元素值赋给变量  
  15.     void DispMat(TSMatrix t); //输出三元组  
  16.     void TranTat(TSMatrix t,TSMatrix &tb);//矩阵转置  
  17. ③ 设计main函数,测试上面实现的算法    
  18. 输入描述:无  
  19. 程序输出:测试数据  
  20. */    

tup.h头文件代码:

[cpp]  view plain  copy
  1. #include <stdio.h>    
  2. #define M 6    
  3. #define N 7    
  4. #define MaxSize  100         //矩阵中非零元素最多个数    
  5. typedef int ElemType;    
  6.     
  7.     
  8. typedef struct    
  9. {    
  10.     int r;                  //行号    
  11.     int c;                  //列号    
  12.     ElemType d;             //元素值    
  13. } TupNode;                  //三元组定义    
  14.     
  15.     
  16. typedef struct    
  17. {    
  18.     int rows;               //行数    
  19.     int cols;               //列数    
  20.     int nums;               //非零元素个数    
  21.     TupNode data[MaxSize];    
  22. } TSMatrix;                 //三元组顺序表定义    
  23.     
  24.     
  25. void CreatMat(TSMatrix &t,ElemType A[M][N]);  //从一个二维稀疏矩阵创建其三元组表示    
  26. bool Value(TSMatrix &t,ElemType x,int i,int j);  //三元组元素赋值    
  27. bool Assign(TSMatrix t,ElemType &x,int i,int j); //将指定位置的元素值赋给变量    
  28. void DispMat(TSMatrix t);//输出三元组    
  29. void TranTat(TSMatrix t,TSMatrix &tb);//矩阵转置    
  30.     
tup.cpp代码:

[cpp]  view plain  copy
  1. #include "tup.h"    
  2.     
  3.     
  4. void CreatMat(TSMatrix &t,ElemType A[M][N])  //从一个二维稀疏矩阵创建其三元组表示    
  5. {    
  6.     int i,j;    
  7.     t.rows=M;    
  8.     t.cols=N;    
  9.     t.nums=0;    
  10.     for (i=0; i<M; i++)    
  11.     {    
  12.         for (j=0; j<N; j++)    
  13.             if (A[i][j]!=0)     //只存储非零元素    
  14.             {    
  15.                 t.data[t.nums].r=i;    
  16.                 t.data[t.nums].c=j;    
  17.                 t.data[t.nums].d=A[i][j];    
  18.                 t.nums++;    
  19.             }    
  20.     }    
  21. }    
  22.     
  23.     
  24. bool Value(TSMatrix &t,ElemType x,int i,int j)  //三元组元素赋值    
  25. {    
  26.     int k=0,k1;    
  27.     if (i>=t.rows || j>=t.cols)    
  28.         return false;               //失败时返回false    
  29.     while (k<t.nums && i>t.data[k].r) k++;                  //查找行    
  30.     while (k<t.nums && i==t.data[k].r && j>t.data[k].c) k++;//查找列    
  31.     if (t.data[k].r==i && t.data[k].c==j)   //存在这样的元素    
  32.         t.data[k].d=x;    
  33.     else                                    //不存在这样的元素时插入一个元素    
  34.     {    
  35.         for (k1=t.nums-1; k1>=k; k1--)    
  36.         {    
  37.             t.data[k1+1].r=t.data[k1].r;    
  38.             t.data[k1+1].c=t.data[k1].c;    
  39.             t.data[k1+1].d=t.data[k1].d;    
  40.         }    
  41.         t.data[k].r=i;    
  42.         t.data[k].c=j;    
  43.         t.data[k].d=x;    
  44.         t.nums++;    
  45.     }    
  46.     return true;                        //成功时返回true    
  47. }    
  48.     
  49.     
  50. bool Assign(TSMatrix t,ElemType &x,int i,int j)  //将指定位置的元素值赋给变量    
  51. {    
  52.     int k=0;    
  53.     if (i>=t.rows || j>=t.cols)    
  54.         return false;           //失败时返回false    
  55.     while (k<t.nums && i>t.data[k].r) k++;                  //查找行    
  56.     while (k<t.nums && i==t.data[k].r && j>t.data[k].c) k++;//查找列    
  57.     if (t.data[k].r==i && t.data[k].c==j)    
  58.         x=t.data[k].d;    
  59.     else    
  60.         x=0;                //在三元组中没有找到表示是零元素    
  61.     return true;            //成功时返回true    
  62. }    
  63.     
  64.     
  65. void DispMat(TSMatrix t)        //输出三元组    
  66. {    
  67.     int i;    
  68.     if (t.nums<=0)          //没有非零元素时返回    
  69.         return;    
  70.     printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);    
  71.     printf("\t------------------\n");    
  72.     for (i=0; i<t.nums; i++)    
  73.         printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d);    
  74. }    
  75.     
  76.     
  77. void TranTat(TSMatrix t,TSMatrix &tb)       //矩阵转置    
  78. {    
  79.     int p,q=0,v;                    //q为tb.data的下标    
  80.     tb.rows=t.cols;    
  81.     tb.cols=t.rows;    
  82.     tb.nums=t.nums;    
  83.     if (t.nums!=0)                  //当存在非零元素时执行转置    
  84.     {    
  85.         for (v=0; v<t.cols; v++)        //tb.data[q]中的记录以c域的次序排列    
  86.             for (p=0; p<t.nums; p++)    //p为t.data的下标    
  87.                 if (t.data[p].c==v)    
  88.                 {    
  89.                     tb.data[q].r=t.data[p].c;    
  90.                     tb.data[q].c=t.data[p].r;    
  91.                     tb.data[q].d=t.data[p].d;    
  92.                     q++;    
  93.                 }    
  94.     }    
  95. }    

main函数代码:

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


知识点总结:

稀疏矩阵三元组的表示方法。

心得:

学习是个循序渐进的过程,要一点一点的进步


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值