实验:矩阵的压缩存储及相关操作一、实验目的1理解稀疏矩阵的三元组顺序表类型定义,2掌握稀疏矩阵的输入(即根据输入数据创建矩阵的三元组顺序表)3掌握稀疏矩阵输出(即根据矩阵的三元组顺序表在屏幕上输出完整的矩阵)4掌握稀疏矩阵的转置算法。二、实验内容1.编写程序任意输入一个稀疏矩阵M,用三元组顺序表压缩存储该稀疏矩阵M,然后求其转置矩阵T,并输出转置矩阵T。运行效果图:注意:矩阵要求用三元组顺序表存储三、思考与提高如何计算两个三元组表表示的稀疏矩阵的乘积?【方案一】程序代码:#includeiostream#includemalloc.h#includecmath#includeiomanipusingnamespacestd;#defineMAXSIZE12500#defineOK1#defineERROR0typedefintStatus;typedefintElemType;//#defineTripleMtypedefstruct{inti,j;ElemTypee;}Triple;typedefstruct{Tripledata[MAXSIZE+1];intmu,nu,tu;}TSMatrix;CreateSMatrix(TSMatrix&M){inti,m,n;ElemTypee;Statusk;cout输入矩阵的行、列数、非零元素个数:\n;//McinM.muM.nuM.tu;M.data[0].i=0;//为以下比较顺序做准备for(i=1;i=M.tu;i++){do{//printf(请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:,i,M.mu,M.nu);cout第i个数所在的行列号元素值\n;//scanf(%d,%d,%d,&m,&n,&e);cinmne;k=0;if(m1||mM.mu||n1||nM.nu)//行或列超出范围k=1;if(mM.data[i-1].i||m==M.data[i-1].i&&n=M.data[i-1].j)//行或列的顺序有错k=1;}while(k);//对于非法操作不予存储,直到输入正确位置M.data[i].i=m;M.data[i].j=n;M.data[i].e=e;}returnOK;}StatusTransposeSMatrix(TSMatrixM,TSMatrix&T){//求稀疏矩阵M的转置矩阵T。算法5.1分析详见“第五章矩阵转置”intp,q,col;T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;if(T.tu){q=1;for(col=1;col=M.nu;++col)for(p=1;p=M.tu;++p)if(M.data[p].j==col){T.data[q].i=M.data[p].j;T.data[q].j=M.data[p].i;T.data[q].e=M.data[p].e;++q;}}returnOK;}/*StatusDisplay(TSMatrixT)//{intx,y,n;intk;//矩阵中的零元for(x=1;x=T.mu;++x)for(y=1;y=T.nu;++y){////coutT.data[T.tu];for(n=0;nT.tu;++n)if(T.data[n].i==x&&T.data[n].j==y){k=1;//当该值为非零时令其为1coutsetw(3)T.data[n].e;}elsek=0;if(k==0)coutsetw(3)k;if((y)%T.nu==0)coutendl;//换行}coutendl;returnOK;}*/StatusDisplay(TSMatrixM)//{intx,y,n;intk;//矩阵中的零元for(x=1;x=M.mu;x++)for(y=1;y=M.nu;y++){////coutT.data[T.tu];for(n=1;n=M.tu;n++)//等价干(n=0;nM.Tu;++N)吗?{if(M.data[n].i==x&&M.data[n].j==y){k=1;//当该值为非零时令其为1coutsetw(3)M.data[n].e;break;//此break由为重要!!!!!!-WHY?}elsek=0;}if(k==0)coutsetw(3)k;if((y)%M.nu==0)coutendl;//换行}coutendl;returnOK;}intmain(){TSMatrixM,T;CreateSMatrix(M);coutM矩阵:\n;Display(M);TransposeSMatrix(M,T);coutM的转置矩阵T:\n;Display(T);returnOK;}截个图:【方案二】程序代码:#includeiostream#includemalloc.h#includecmath#includeiomanipusingnamespacestd;#defineMAXSIZE12500#defineOK1#defineERROR0typedefintStatus;typedefintElemType;//#defineTripleMtypedefstruct{inti,j;ElemTypee;}Triple;typedefstruct{Tripledata[MAXSIZE+1];intmu,nu,tu;}TSMatrix;CreateSMatrix(TSMatrix&M){ElemTypee;cout输入矩阵的行、列数:\n;//McinM.muM.nu;intp=1;coutInputtheMatrixM:(apartwithBLANKSPACE)\n;for(intx=1;x=M.mu;x++){for(inty=1;y=M.nu;y++){cine;if(e!=0){M.data[p].i=x;M.data[p].j=y;M.data[p].e=e;p++;}}//coutendl;//??????有问题吗?没有!}M.tu=--p;/*--p;for(intx1=1;x1=p;x1++)coutM.data[x1].e;*///测试用的returnOK;}StatusTransposeSMatrix(TSMatrixM,TSMatrix&T){//求稀疏矩阵M的转置矩阵T。算法5.1分析详见“第五章矩阵转置”intp,q,col;T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;if(T.tu){q=1;for(col=1;col=M.nu;++col)for(p=1;p=M.tu;++p)//p,q的值是相等的,可以用for(p=1,q=1;p=M.tu;++p,++q)不?if(M.data[p].j==col){T.data[q].i=M.data[p].j;T.data[q].j=M.data[p].i;T.data[q].e=M.data[p].e;++q;}}returnOK;}StatusDisplay(TSMatrixM)//{intx,y,n;intk;//矩阵中的零元for(x=1;x=M.mu;x++){for(y=1;y=M.nu;y++){////coutT.data[T.tu];for(n=1;n=M.tu;n++)//等价干(n=0;nM.Tu;++N)吗?{if(M.data[n].i==x&&M.data[n].j==y){k=1;//当该值为非零时令其为1coutsetw(3)M.data[n].e;break;//此break由为重要!!!!!!-WHY?}elsek=0;}if(k==0)coutsetw(3)k;//if((y)%M.nu==0)coutendl;//换行}coutendl;//换行,同上}returnOK;}intmain(){TSMatrixM,T;CreateSMatrix(M);coutM矩阵:\n;Display(M);TransposeSMatrix(M,T);coutM的转置矩阵T:\n;Display(T);returnOK;}运行截个图