实验六、稀疏矩阵的建立与转置一、实验目的:1、了解稀疏矩阵的三元组存储形式。2、熟悉掌握三元表存储矩阵的转置算法。二、实验内容:矩阵是很多的科学与工程计算中研究的数学对象。在此,我们感兴趣的是,从数学结构这门学科着眼,如何存储矩阵的元从而使矩阵的各种运算有效的进行。本来,用二维数组存储矩阵,在逻辑上意义是很明确的,也很容易理解,操作也很容易和方便。但是在数值分析中经常出现一些阶数很高的矩阵,同时,在矩阵中又有很多值相同或者都为零的元素,可以对这种矩阵进行压缩存储:对多个值相同的元素只分配一个存储空间;对零元素不分配空间。稀疏矩阵的定义是一个模糊的定义:即非零元个数较零元个数较少的矩阵。例如下图所示的矩阵:0129000000000003000014000240000018000001500-7000为一个稀疏矩阵。为了实现稀疏矩阵的这种存储结构,引入三元组这种数据结构。三元组的线性表顺序存储形式如下图:MUNUTUIIVIJV……IJVA,B:ARRAY[1。。。MAXNUM]OFTUPLE3TP三、实验步骤看懂书上的算法,参考书上的程序编写程序上机调试、输入数据、检验结果。四、程序流程图YNYNCOL+1YP+1四、参考程序structtuple3tp/*稀疏矩阵的建立和转置*/{inti,j;开始调用建立稀疏矩阵过程调用转置矩阵过程调用输出矩阵过程结束开始置B为A的空转置矩阵非零元个数=0?Q=1;COL=1;COL≤列值?P≤非零元个数?若三元组的列号为所寻列,则置换之。Q=Q+1结束intv;};structsparmattp{intmu,nu,tu;structtuple3tpdata[31];};structsparmattpa,b;voidcrt_sparmat(){inti;printf(输入稀疏矩阵行值,列值,最大非零元个数:);scanf(%d%d%d,&a.mu,&a.nu,&a.tu);for(i=1;i=a.tu;i++){printf(输入行坐标,列坐标,非零元);scanf(%d%d%d,&a.data[i].i,&a.data[i].j,&a.data[i].v);}}voidtrans_sparmat(){intcol,p,q;b.mu=a.nu;b.nu=a.mu;b.tu=a.tu;if(b.tu!=0){q=1;for(col=1;col=a.nu;col++)for(p=1;p=a.tu;p++)if(a.data[p].j==col){b.data[q].i=a.data[p].j;b.data[q].j=a.data[p].i;b.data[q].v=a.data[p].v;q++;}}}out(structsparmattpx){inti,j,k,flag;for(i=1;i=x.mu;i++){for(j=1;j=x.nu;j++){flag=0;for(k=1;k=x.tu;k++){if(((x.data[k].i)==i)&&((x.data[k].j)==j)){flag=1;printf(%5d,x.data[k].v);}}if(flag==0)printf(0);}printf(\n);}}main(){printf(稀疏矩阵的建立与转置\n);crt_sparmat();trans_sparmat();printf(原矩阵为:\n);out(a);printf(转置矩阵为:\n);out(b);}