1、AddSMatrix(M,N,&Q); 稀疏矩阵M与N的行数和列数对应相等.求稀疏矩阵的和Q=M+N. SubSMatrix(M,N,&求稀疏矩阵的差Q=M-N. MultSMatrix(M,N,& 稀疏矩阵M的列数等于N的行数. 求稀疏矩阵的乘积Q=M*N.2、 本程序包含四个模块1) 主程序模块Void main() 初始化Do 接受命令; 处理命令;while(命令!=“退出”)2) 模块调用关系图主程序模块创建稀疏矩阵模块运算稀疏矩阵模块三、 详细设计#define MAXSIZE 20#define MAXRC 10#includeusing namespace std;typede
2、f struct int i,j; int e;Triple;typedef struct Triple dataMAXSIZE+1; int rposMAXRC+1; int mu,nu,tu;/mu是行,nu是列,tu是非零元个数Matrix;void creatematrix(Matrix& M) int m,n,t,e; int numMAXSIZE+1;/每行非零元素个数 do coutm;矩阵列数:n;非零元个数:t; if(m0|n0|tm*n) couterror while(mm*n);/检测输入是否合法 M.mu = m, M.nu = n, M.tu = t;/保存数据
3、int i,j,k,a; int flagMAXSIZEMAXSIZE;/标记数组:此位置是否已经有非零元素 for(i=0;iMAXSIZE;i+) /标记数组的初始化 for(j=0;jj+) flagij=0; for(k=1;k=t;k+) do输入第个非零元(共tije; if(im|jn) cout if(flagij!=0) 重复! flagij=2; if(e=0) while(in|flagij=2|e=0); for(a=1;aM.dataa.i|(i=M.dataa.i&M.dataa.j);a+);/找到此三元组插入的位置 for(int b=k-1;b=a;b-) M
4、.datab+1=M.datab;/行序比它大的三元组依次向后移动 M.dataa.i=i; M.dataa.j=j; M.dataa.e=e; for(i=1;=M.mu;i+) numi=0; for(t=1;=M.tu;t+) numM.datat.i+;/求M中每一行含非零元素个数 M.rpos1=1; for(i=2; M.rposi=M.rposi-1+numi-1;void printmatrix(Matrix M)/输出矩阵 for(int i=1, k=1; for(int j=1;=M.nu; if(M.datak.i=i&M.datak.j=j)M.datak.et k+
5、; else0t cout矩阵共有M.mu行M.nu列M.tu个非零元元素void jiafa(Matrix M,Matrix N,Matrix& Q) if(M.mu!=N.mu|M.nu!=N.nu) Q.mu=M.mu; Q.nu=M.nu; Q.tu=0; int m,n,t; m=n=t=1; for(int row=1;rowrow+) if(M.datam.i=row&N.datan.i=row)/矩阵行数相等 if(M.datam.j=N.datan.j)/矩阵列数相等 int sum=M.datam.e+N.datan.e; if(sum! Q.datat.i=row; Q.
6、datat.j=M.datam.j; Q.datat.e=sum; Q.tu+; +m; +n; +t; else while(M.datam.i=row)/M矩阵剩下的元素 Q.datat.i=row; Q.datat.j=M.datam.j; Q.datat.e=M.datam.e; Q.tu+; +m; +t; while(N.datan.i=row)/N矩阵剩下的元素 Q.datat.j=N.datan.j; Q.datat.e=N.datan.e; +n;矩阵相加结果为: printmatrix(Q);void jianfa(Matrix M,Matrix N,Matrix&=M.n
7、u) int cha=M.datam.e-N.datan.e; if(cha! Q.datat.e=cha; m+; n+; t+; m+; t+; int e1=N.datan.e; e1=0-e1; Q.datat.e=e1; n+;矩阵相减结果为void chengfa(Matrix M,Matrix N,Matrix& int ctempMAXSIZE+1; int tp,t,col,p,q; int arow=1,brow=1; if(M.nu!=N.mu)/稀疏矩阵M的列数和N的行数不相等,不能相乘 Q.nu=N.nu; if(M.tu*N.tu! for(arow=1;arowa
8、row+) for(int i=1;=Q.nu; ctempi=0;/当前行各元素累加器清零 Q.rposarow=Q.tu+1; if(arowM.mu) tp=M.rposarow+1; tp=M.tu+1; for( p=M.rposarow;ptp;p+)/对当前行中的每一个非零元 brow=M.datap.j; /找到对应元在N中的行号 if(browN.mu) t=N.rposbrow+1; t=N.tu+1; for( q=N.rposbrow;qq+) col=N.dataq.j;/乘积元素在Q中列号 ctempcol+=M.datap.e * N.dataq.e; for(c
9、ol=1;colMAXSIZE) cout Q.dataQ.tu.i=arow; Q.dataQ.tu.j=col; Q.dataQ.tu.e=ctempcol;矩阵相乘结果为:int main() int chioce; Matrix M,N,Q; int i;1、输入矩阵1:2、输入矩阵2:3、矩阵相加4、矩阵相减5、矩阵相乘6、结束输入选择功能:chioce; switch(chioce) case 1:creatematrix(M);printmatrix(M);i=1;break; case 2:creatematrix(N);printmatrix(N); case 3:jiafa(M,N,Q); case 4:jianfa(M,N,Q); case 5:chengfa(M,N,Q); case 6:i=0; while(i!=0); return 0;四、 调试分析1、 开始对三元组了解不彻底,致使代码总是出现基本错误2、 对于矩阵相乘的算法参考了书很久,并请教了同学3、 矩阵乘法运算在调试中出现多次错误,反复试验才调试好5、用户手册1.本程序的运行环境为DOS操作系统,执行文件为TestMaze.exe2.进入演示程序后即显示文本方式的用户界面:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1