实现稀疏矩阵(采用三元组表示)的基本运算实验报告一实验题目:实现稀疏矩阵(采用三元组表示)的基本运算二实验要求:(1)生成如下两个稀疏矩阵的三元组a和b;(上机实验指导P92)(2)输出a转置矩阵的三元组;(3)输出a+b的三元组;(4)输出a*b的三元组;三实验内容:3.1稀疏矩阵的抽象数据类型:ADTSparseMatrix{数据对象:D={aij|i=1,2,3,….,m;j=1,2,3,……,n;ai,j∈ElemSet,m和n分别称为矩阵的行数和列数}数据关系:R={Row,Col}Row={ai,j,ai,j+1|1≤i≤m,1≤j≤n-1}Col={ai,j,ai+1,j|1≤i≤m-1,1≤j≤n}基本操作:CreateSMatrix(&M)操作结果:创建稀疏矩阵MPrintSMatrix(M)初始条件:稀疏矩阵M已经存在操作结果:打印矩阵MDestroySMatrix(&M)初始条件:稀疏矩阵M已经存在操作结果:销毁矩阵MCopySMatrix(M,&T)初始条件:稀疏矩阵M已经存在操作结果:复制矩阵M到TAddSMatrix(M,N,&Q)初始条件:稀疏矩阵M、N已经存在操作结果:求矩阵的和Q=M+NSubSMatrix(M,N,&Q)初始条件:稀疏矩阵M、N已经存在操作结果:求矩阵的差Q=M-NTransposeSMatrix(M,&T)初始条件:稀疏矩阵M已经存在操作结果:求矩阵M的转置TMultSMatrix(M,N,&Q)初始条件:稀疏矩阵M已经存在操作结果:求矩阵的积Q=M*N}ADTSparseMatrix3.2存储结构的定义#defineN4typedefintElemType;#defineMaxSize100//矩阵中非零元素最多个数typedefstruct{intr;//行号intc;//列号ElemTyped;//元素值}TupNode;//三元组定义typedefstruct{introws;//行数值intcols;//列数值intnums;//非零元素个数TupNodedata[MaxSize];}TSMatrix;//三元组顺序表定义3.3基本操作实现:voidCreatMat(TSMatrix&t,ElemTypeA[N][N]){inti,j;t.rows=N;t.cols=N;t.nums=0;for(i=0;iN;i++){for(j=0;jN;j++)if(A[i][j]!=0){t.data[t.nums].r=i;t.data[t.nums].c=j;t.data[t.nums].d=A[i][j];t.nums++;}}}voidDispMat(TSMatrixt){inti;if(t.nums=0)return;printf(\t%d\t%d\t%d\n,t.rows,t.cols,t.nums);printf(\t------------------\n);for(i=0;it.nums;i++)printf(\t%d\t%d\t%d\n,t.data[i].r,t.data[i].c,t.data[i].d);}3.4解题思路:1.转置矩阵:只要判定原矩阵有值,那么只要遍历一遍原矩阵,把原来矩阵中非0元素行列变换一下赋值到新的矩阵中即可。2.矩阵加法:用各种if判断,区分出矩阵进行加法时的可能情况,分情况处理即可。3.矩阵乘法:通过getvalue(c,i,j)函数查找矩阵c中i行j列,所储存的元素的值。然后便是模拟矩阵乘法的过程进行求解。3.5解题过程:实验源代码如下:3.5.1顺序表的各种运算#includestdio.h#defineN4typedefintElemType;#defineMaxSize100//矩阵中非零元素最多个数typedefstruct{intr;//行号intc;//列号ElemTyped;//元素值}TupNode;//三元组定义typedefstruct{introws;//行数值intcols;//列数值intnums;//非零元素个数TupNodedata[MaxSize];}TSMatrix;//三元组顺序表定义voidCreatMat(TSMatrix&t,ElemTypeA[N][N]){inti,j;t.rows=N;t.cols=N;t.nums=0;for(i=0;iN;i++){for(j=0;jN;j++)if(A[i][j]!=0){t.data[t.nums].r=i;t.data[t.nums].c=j;t.data[t.nums].d=A[i][j];t.nums++;}}}voidDispMat(TSMatrixt){inti;if(t.nums=0)return;printf(\t%d\t%d\t%d\n,t.rows,t.cols,t.nums);printf(\t------------------\n);for(i=0;it.nums;i++)printf(\t%d\t%d\t%d\n,t.data[i].r,t.data[i].c,t.data[i].d);}voidTranMat(TSMatrixt,TSMatrix&tb){intp,q=0,v;//q为tb.data的下标tb.rows=t.cols;tb.cols=t.rows;tb.nums=t.nums;if(t.nums!=0){for(v=0;vt.cols;v++)//tb.data[q]中的记录以c域的次序排列for(p=0;pt.nums;p++)//p为t.data的下标if(t.data[p].c==v){tb.data[q].r=t.data[p].c;tb.data[q].c=t.data[p].r;tb.data[q].d=t.data[p].d;q++;}}}boolMatAdd(TSMatrixa,TSMatrixb,TSMatrix&c){inti=0,j=0,k=0;ElemTypev;if(a.rows!=b.rows||a.cols!=b.cols)returnfalse;//行数或列数不等时不能进行相加运算c.rows=a.rows;c.cols=a.cols;//c的行列数与a的相同while(ia.nums&&jb.nums)//处理a和b中的每个元素{if(a.data[i].r==b.data[j].r)//行号相等时{if(a.data[i].cb.data[j].c)//a元素的列号小于b元素的列号{c.data[k].r=a.data[i].r;//将a元素添加到c中c.data[k].c=a.data[i].c;c.data[k].d=a.data[i].d;k++;i++;}elseif(a.data[i].cb.data[j].c)//a元素的列号大于b元素的列号{c.data[k].r=b.data[j].r;//将b元素添加到c中c.data[k].c=b.data[j].c;c.data[k].d=b.data[j].d;k++;j++;}else//a元素的列号等于b元素的列号{v=a.data[i].d+b.data[j].d;if(v!=0)//只将不为0的结果添加到c中{c.data[k].r=a.data[i].r;c.data[k].c=a.data[i].c;c.data[k].d=v;k++;}i++;j++;}}elseif(a.data[i].rb.data[j].r)//a元素的行号小于b元素的行号{c.data[k].r=a.data[i].r;//将a元素添加到c中c.data[k].c=a.data[i].c;c.data[k].d=a.data[i].d;k++;i++;}else//a元素的行号大于b元素的行号{c.data[k].r=b.data[j].r;//将b元素添加到c中c.data[k].c=b.data[j].c;c.data[k].d=b.data[j].d;k++;j++;}c.nums=k;}returntrue;}intgetvalue(TSMatrixc,inti,intj){intk=0;while(kc.nums&&(c.data[k].r!=i||c.data[k].c!=j))k++;if(kc.nums)return(c.data[k].d);elsereturn(0);}boolMatMul(TSMatrixa,TSMatrixb,TSMatrix&c){inti,j,k,p=0;ElemTypes;if(a.cols!=b.rows)//a的列数不等于b的行数时不能进行相乘运算returnfalse;for(i=0;ia.rows;i++)for(j=0;jb.cols;j++){s=0;for(k=0;ka.cols;k++)s=s+getvalue(a,i,k)*getvalue(b,k,j);if(s!=0)//产生一个三元组元素{c.data[p].r=i;c.data[p].c=j;c.data[p].d=s;p++;}}c.rows=a.rows;c.cols=b.cols;c.nums=p;returntrue;}intmain(){ElemTypea1[N][N]={{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}};ElemTypeb1[N][N]={{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}};TSMatrixa,b,c;CreatMat(a,a1);CreatMat(b,b1);printf(a的三元组:\n);DispMat(a);printf(b的三元组:\n);DispMat(b);printf(a转置为c\n);TranMat(a,c);printf(c的三元组:\n);DispMat(c);printf(c=a+b\n);MatAdd(a,b,c);printf(c的三元组:\n);DispMat(c);printf(c=a×b\n);MatMul(a,b,c);printf(c的三元组:\n);DispMat(c);return0;}四实验结果