实现稀疏矩阵采用三元组表示的基本运算实验报告.docx
《实现稀疏矩阵采用三元组表示的基本运算实验报告.docx》由会员分享,可在线阅读,更多相关《实现稀疏矩阵采用三元组表示的基本运算实验报告.docx(8页珍藏版)》请在冰豆网上搜索。
![实现稀疏矩阵采用三元组表示的基本运算实验报告.docx](https://file1.bdocx.com/fileroot1/2023-6/16/66099d85-136b-47df-a1bd-ea51b287c258/66099d85-136b-47df-a1bd-ea51b287c2581.gif)
实现稀疏矩阵采用三元组表示的基本运算实验报告
实现稀疏矩阵(采用三元组表示)的基本运算实验报告
一实验题目:
实现稀疏矩阵(采用三元组表示)的基本运算
二实验要求:
(1)生成如下两个稀疏矩阵的三元组a和b;(上机实验指导P92)
(2)输出a转置矩阵的三元组;
(3)输出a+b的三元组;
(4)输出a*b的三元组;
三实验内容:
稀疏矩阵的抽象数据类型:
ADT SparseMatrix {
数据对象:
D={aij| i = 1,2,3,….,m; j =1,2,3,……,n;
ai,j∈ElemSet,m和n分别称为矩阵的行数和列数 }
数据关系 :
R={ Row , Col }
Row ={ | 1≤ i≤m , 1≤ j≤ n-1}
Col ={| 1≤i≤m-1,1≤j≤n}
基本操作:
CreateSMatrix(&M)
操作结果:
创建稀疏矩阵M
PrintSMatrix(M)
初始条件:
稀疏矩阵M已经存在
操作结果:
打印矩阵M
DestroySMatrix(&M)
初始条件:
稀疏矩阵M已经存在
操作结果:
销毁矩阵M
CopySMatrix(M, &T)
初始条件:
稀疏矩阵M已经存在
操作结果:
复制矩阵M到T
AddSMatrix(M, N, &Q)
初始条件:
稀疏矩阵M、N已经存在
操作结果:
求矩阵的和Q=M+N
SubSMatrix(M, N, &Q)
初始条件:
稀疏矩阵M、N已经存在
操作结果:
求矩阵的差Q=M-N
TransposeSMatrix(M, & T)
初始条件:
稀疏矩阵M已经存在
操作结果:
求矩阵M的转置T
MultSMatrix(M, N, &Q)
初始条件:
稀疏矩阵M已经存在
操作结果:
求矩阵的积Q=M*N
}ADTSparseMatrix
存储结构的定义
#defineN4
typedefintElemType;
#defineMaxSize100=i;[].c=j;
[].d=A[i][j];++;
}
}
}
voidDispMat(TSMatrixt)
{
inti;
if<=0)
return;
printf("\t%d\t%d\t%d\n",,,;
printf("\t------------------\n");
for(i=0;i<;i++)
printf("\t%d\t%d\t%d\n",[i].r,[i].c,[i].d);
}
解题思路:
1.转置矩阵:
只要判定原矩阵有值,那么只要遍历一遍原矩阵,把原来矩阵中非0元素行列变换一下赋值到新的矩阵中即可。
2.矩阵加法:
用各种if判断,区分出矩阵进行加法时的可能情况,分情况处理即可。
3.矩阵乘法:
通过getvalue(c,i,j)函数查找矩阵c中i行j列,所储存的元素的值。
然后便是模拟矩阵乘法的过程进行求解。
解题过程:
实验源代码如下:
顺序表的各种运算
#include<>
#defineN4
typedefintElemType;
#defineMaxSize100=i;[].c=j;
[].d=A[i][j];++;
}
}
}
voidDispMat(TSMatrixt){
inti;
if<=0)
return;
printf("\t%d\t%d\t%d\n",,,;
printf("\t------------------\n");
for(i=0;i<;i++)
printf("\t%d\t%d\t%d\n",[i].r,[i].c,[i].d);
}
voidTranMat(TSMatrixt,TSMatrix&tb){
intp,q=0,v;==v)
{
[q].r=[p].c;
[q].c=[p].r;
[q].d=[p].d;
q++;
}
}
}
boolMatAdd(TSMatrixa,TSMatrixb,TSMatrix&c){
inti=0,j=0,k=0;
ElemTypev;
if!
=||!
=
returnfalse;==[j].r)<[j].c)=[i].r;=[i].c;
[k].d=[i].d;
k++;i++;
}
elseif[i].c>[j].c)=[j].r;=[j].c;
[k].d=[j].d;
k++;j++;
}
else+[j].d;
if(v!
=0)=[i].r;
[k].c=[i].c;
[k].d=v;
k++;
}
i++;j++;
}
}
elseif[i].r<[j].r)=[i].r;=[i].c;
[k].d=[i].d;
k++;i++;
}
else=[j].r;=[j].c;
[k].d=[j].d;
k++;j++;
}
=k;
}
returntrue;
}
intgetvalue(TSMatrixc,inti,intj)
{
intk=0;
while(k<&&[k].r!
=i||[k].c!
=j))
k++;
if(k<
return[k].d);
else
return(0);
}
boolMatMul(TSMatrixa,TSMatrixb,TSMatrix&c)
{
inti,j,k,p=0;
ElemTypes;
if!
==i;
[p].c=j;
[p].d=s;
p++;
}
}
=;
=;
=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;
}
四实验结果