实验5:数组
一、实验目的
深切研究数组的存储表示和实现技术,着重掌握对稀疏矩阵的表示方式及其运算的实现。
二、问题描述
稀疏矩阵是指那些多数元素为零的矩阵。利用‘稀疏’特点进行存储和计算能够大大节省存储空间,提高效率。通过对稀疏矩阵的存储表示,实现矩阵的大体操作。
三、实验要求
1、要求矩阵的输入形式采用三元组表示,以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵。
2、设计矩阵的逆置算法,实现矩阵的逆置。 3、实现两个稀疏矩阵的相加、相减和相乘等运算。 4、要求运算结果的矩阵则以通常的数组形式出现。
四、实验环境
PC微机
DOS操作系统或 Windows 操作系统
Turbo C 程序集成环境或 Visual C++ 程序集成环境
五、实验步骤
实验程序:
1、 #include
11、 Triple data[MAXSIZE+1]; 12、 int mu,nu,tu; 13、 }TSMatrix; 14、 typedef struct {
15、 Triple data[MAXSIZE+2]; 16、 int rpos[MAXROW+1]; 17、 int mu,nu,tu; 18、 }RLSMatrix; 19、 template
20、
bool InPutTSMatrix(P & T,int
y){ 21、 cout<<\输入矩阵的行,列和非零元素个数:\
22、 cin>>>>>>;
23、 cout<<\请输出非零元素的位置和值:\
24、 int k=1; 25、 for(;k<=;k++)
26、 cin>>[k].i>>[k].j>>[k].e; 27、
28、 return true; 29、 }
30、 template
35、 if([k].i-1)==m&&[k].j-1)==n){ 36、 (4);
37、
cout<<[k++].e;} 38、 else{
39、 (4); cout<<\ 40、 }
41、 cout< 45、 bool TransposeSMatrix( ){ 46、 TSMatrix M,T; ]; 47、 cpot[1]=1; 48、 for(int i=2;i<=;i++) cpot[i]=cpot[i-1]+num[i-1]; ; q=cpot[col]; 49、 [q].i=col; [q].j=[p].i; 50、 [q].e=[p].e; ++cpot[col]; 51、 } 52、 } 53、 cout<<\输入矩阵的转置矩阵为\ 54、 OutPutSMatrix(T); 55、 return true; 56、 } 57、 58、 bool Count(RLSMatrix &T) 59、 { 60、 int num[MAXROW+1]; 61、 for(int col=1;col<=;col++) num[col]=0; 62、 for(col=1;col<=;col++) ++num[[col].i]; 63、 [1]=1; 64、 for(int i=2;i<=;i++) [i]=[i-1]+num[i-1]; 65、 return true; 66、 } 67、 bool MultSMatrix ( ){ 68、 RLSMatrix M,N,Q; 69、 InPutTSMatrix(M,1); 70、 InPutTSMatrix(N,1); 71、 Count(M); Count(N); 72、 if!= return false; 73、 =; =; =0; ; 74、 if(brow< t=[brow+1]; 75、 else t=+1; 76、 for(q=[brow];q 78、 ctemp[ccol] += [p].e*[q].e; 79、 } 80、 } 81、 for(ccol=1;ccol<=;ccol++) 82、 if(ctemp[ccol]){ 83、 if(++>MAXSIZE) return false; 84、 [].e=ctemp[ccol]; 85、 [].i=arow; 86、 [].j=ccol; 87、 } 88、 } 89、 } 90、 OutPutSMatrix(Q); 91、 return true; 92、 } 93、 typedef struct OLNode{ 94、 int i,j; 95、 int e; 96、 struct OLNode *right,*down; 97、 }OLNode,*OLink; 98、 typedef struct{ 99、 OLink *rhead,*chead; 100、 int mu,nu,tu; 101、 }CrossList; 102、 bool CreateSMatrix_OL(CrossList & M){ 103、 int x,y,m; 104、 cout<<\请输入矩阵的行,列,及非零元素个数\ 105、 cin>>>>>>; 106、 if(!=(OLink*)malloc(+1)*sizeof(OLink)))) exit(0); 107、 if(!=(OLink*)malloc(+1)*sizeof( OLink)))) exit(0); 108、 for(x=0;x<=;x++) 109、 [x]=NULL; / 110、 for(x=0;x<=;x++) 111、 [x]=NULL; 112、 cout<<\请按三元组的格式输入数组:\ 113、 for(int i=1;i<=;i++){ 114、 cin>>x>>y>>m; 115、 OLink p,q; 116、 if(!(p=(OLink)malloc(sizeof(OLNode)))) exit(0); 117、 p->i=x; p->j=y; p->e=m; 118、 if[x]==NULL||[x]->j>y){ 119、 p->right=[x]; [x]=p; 120、 } 121、 else{ 122、 for(q=[x];(q->right)&&(q->right->j 124、 } 125、 if[y]==NULL||[y]->i>x){ 126、 p->down=[y]; [y]=p; 127、 } 128、 else{ 129、 for(q=[y];(q->down)&&(q->down->i 131、 132、 } 133、 } 134、 return true; 135、 } 136、 bool OutPutSMatrix_OL(CrossList T){ 137、 for(int i=1;i<=;i++){ 138、 OLink p=[i]; 139、 for(int j=1;j<=;j++){ 140、 if((p)&&(j==p->j)){