第八周项目四

来源:互联网 发布:阿里云购买虚拟主机 编辑:程序博客网 时间:2024/06/05 04:56
  1. 烟台大学计算机学院   
  2.   
  3. 作者:王雪行 
  4.   
  5. 问题描述:稀疏矩阵的三元组表示的实现及应用 
  6.   
  7. 输入描述:无 
  8.   
  9. 输出描述:三元组表示的形式的各元素 
  10.   
  11. */   
  12.   
  13.   
  14.   
  15.   
  16. //tup.h:  
  17.   
  18. #define M 6  
  19. #define N 7  
  20. #define MaxSize  100         //矩阵中非零元素最多个数  
  21. typedef int ElemType;  
  22.   
  23. typedef struct  
  24. {  
  25.     int r;                  //行号  
  26.     int c;                  //列号  
  27.     ElemType d;             //元素值  
  28. } TupNode;                  //三元组定义  
  29.   
  30. typedef struct  
  31. {  
  32.     int rows;               //行数  
  33.     int cols;               //列数  
  34.     int nums;               //非零元素个数  
  35.     TupNode data[MaxSize];  
  36. } TSMatrix;                 //三元组顺序表定义  
  37.   
  38. void CreatMat(TSMatrix &t,ElemType A[M][N]);  //从一个二维稀疏矩阵创建其三元组表示  
  39. bool Value(TSMatrix &t,ElemType x,int i,int j);  //三元组元素赋值  
  40. bool Assign(TSMatrix t,ElemType &x,int i,int j); //将指定位置的元素值赋给变量  
  41. void DispMat(TSMatrix t);//输出三元组  
  42. void TranTat(TSMatrix t,TSMatrix &tb);//矩阵转置  
  43.   
  44.   
  45. //tup.cpp  
  46.   
  47.   
  48. #include "stdio.h"  
  49. #include "tup.h"  
  50.   
  51. void CreatMat(TSMatrix &t,ElemType A[M][N])  //从一个二维稀疏矩阵创建其三元组表示  
  52. {  
  53.     int i,j;  
  54.     t.rows=M;  
  55.     t.cols=N;  
  56.     t.nums=0;  
  57.     for (i=0; i<M; i++)  
  58.     {  
  59.         for (j=0; j<N; j++)  
  60.             if (A[i][j]!=0)     //只存储非零元素  
  61.             {  
  62.                 t.data[t.nums].r=i;  
  63.                 t.data[t.nums].c=j;  
  64.                 t.data[t.nums].d=A[i][j];  
  65.                 t.nums++;  
  66.             }  
  67.     }  
  68. }  
  69.   
  70. bool Value(TSMatrix &t,ElemType x,int i,int j)  //三元组元素赋值  
  71. {  
  72.     int k=0,k1;  
  73.     if (i>=t.rows || j>=t.cols)  
  74.         return false;               //失败时返回false  
  75.     while (k<t.nums && i>t.data[k].r) k++;                  //查找行  
  76.     while (k<t.nums && i==t.data[k].r && j>t.data[k].c) k++;//查找列  
  77.     if (t.data[k].r==i && t.data[k].c==j)   //存在这样的元素  
  78.         t.data[k].d=x;  
  79.     else                                    //不存在这样的元素时插入一个元素  
  80.     {  
  81.         for (k1=t.nums-1; k1>=k; k1--)  
  82.         {  
  83.             t.data[k1+1].r=t.data[k1].r;  
  84.             t.data[k1+1].c=t.data[k1].c;  
  85.             t.data[k1+1].d=t.data[k1].d;  
  86.         }  
  87.         t.data[k].r=i;  
  88.         t.data[k].c=j;  
  89.         t.data[k].d=x;  
  90.         t.nums++;  
  91.     }  
  92.     return true;                        //成功时返回true  
  93. }  
  94.   
  95. bool Assign(TSMatrix t,ElemType &x,int i,int j)  //将指定位置的元素值赋给变量  
  96. {  
  97.     int k=0;  
  98.     if (i>=t.rows || j>=t.cols)  
  99.         return false;           //失败时返回false  
  100.     while (k<t.nums && i>t.data[k].r) k++;                  //查找行  
  101.     while (k<t.nums && i==t.data[k].r && j>t.data[k].c) k++;//查找列  
  102.     if (t.data[k].r==i && t.data[k].c==j)  
  103.         x=t.data[k].d;  
  104.     else  
  105.         x=0;                //在三元组中没有找到表示是零元素  
  106.     return true;            //成功时返回true  
  107. }  
  108.   
  109. void DispMat(TSMatrix t)        //输出三元组  
  110. {  
  111.     int i;  
  112.     if (t.nums<=0)          //没有非零元素时返回  
  113.         return;  
  114.     printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);  
  115.     printf("\t------------------\n");  
  116.     for (i=0; i<t.nums; i++)  
  117.         printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d);  
  118. }  
  119.   
  120. void TranTat(TSMatrix t,TSMatrix &tb)       //矩阵转置  
  121. {  
  122.     int p,q=0,v;                    //q为tb.data的下标  
  123.     tb.rows=t.cols;  
  124.     tb.cols=t.rows;  
  125.     tb.nums=t.nums;  
  126.     if (t.nums!=0)                  //当存在非零元素时执行转置  
  127.     {  
  128.         for (v=0; v<t.cols; v++)        //tb.data[q]中的记录以c域的次序排列  
  129.             for (p=0; p<t.nums; p++)    //p为t.data的下标  
  130.                 if (t.data[p].c==v)  
  131.                 {  
  132.                     tb.data[q].r=t.data[p].c;  
  133.                     tb.data[q].c=t.data[p].r;  
  134.                     tb.data[q].d=t.data[p].d;  
  135.                     q++;  
  136.                 }  
  137.     }  
  138. }  
  139.   
  140.   
  141. //main  
  142.   
  143.   
  144. #include <stdio.h>  
  145. #include "tup.h"  
  146. int main()  
  147. {  
  148.     TSMatrix t,tb;  
  149.     int x,y=10;  
  150.     int A[6][7]=  
  151.     {  
  152.         {0,0,1,0,0,0,0},  
  153.         {0,2,0,0,0,0,0},  
  154.         {3,0,0,0,0,0,0},  
  155.         {0,0,0,5,0,0,0},  
  156.         {0,0,0,0,6,0,0},  
  157.         {0,0,0,0,0,7,4}  
  158.     };  
  159.     CreatMat(t,A);  
  160.     printf("b:\n");  
  161.     DispMat(t);  
  162.     if (Assign(t,x,2,5)==true)  //调用时返回true  
  163.         printf("Assign(t,x,2,5)=>x=%d\n",x);  
  164.     else  //调用时返回false  
  165.         printf("Assign(t,x,2,5)=>参数错误\n");  
  166.     Value(t,y,2,5);  
  167.     printf("执行Value(t,10,2,5)\n");  
  168.     if (Assign(t,x,2,5)==true)  //调用时返回true  
  169.         printf("Assign(t,x,2,5)=>x=%d\n",x);  
  170.     else  //调用时返回false  
  171.         printf("Assign(t,x,2,5)=>参数错误\n");  
  172.     printf("b:\n");  
  173.     DispMat(t);  
  174.     TranTat(t,tb);  
  175.     printf("矩阵转置tb:\n");  
  176.     DispMat(tb);  
  177.     return 0;  
  178. }  

运行结果:

原创粉丝点击