资源描述:
《数据结构c语言版稀疏矩阵的三元组顺序表存储表示和实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、/*数据结构C语言版稀疏矩阵的三元组顺序表存储表示和实现P98编译环境:Dev-C++4.9.9.2日期:2011年2月8日typedefintElemType;//稀疏矩阵的三元组顺序表存储表示^defineMAXSIZE100//非零元个数的最大值typedefstruct{inti,j;//行下标,列下标ElemTypee;//非零元素值}Triple;typedefstruct{Tripledata[MAXSIZE+l];//非零元三元组表,data[0]未用intmu,nu,tu;//矩阵的行数
2、、列数和非零元个数}TSMatrix;//创建稀疏矩阵MintCreateSMatrix(TSMatrix*M){inti,m,n;ElemTypee;intk;printfC请输入矩阵的行数,列数,非零元素个数:(逗号)〃);scanf(〃%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);(*M).data[0].i=0;//为以下比佼顺序做准备for(i=1;i<=(*M).tu;i++){do{printfC请按行序顺序输入第%d个非零元素所在的行(1〜%d),〃"列(
3、l〜%d),元素值:(逗号)〃,i,(*M).mu,(*M).nu);scanf("%d,%d,%d",&m,&n,&e);k二0;//行或列超出范围if(m<1
4、
5、m>(*M).mu
6、
7、n<1
8、
9、n>(*M).nu)k=l;if(m<(*M).data[i~l].i
10、
11、m==(*M).data[iT].i&&n<=(*M).data[iT].j)//行或列的顺序有错k=l;}while(k);(*M).data[i].i=m;//行下标(*M).data[i].j=n;//列下标(*M).data[
12、i].e=e;〃该下标所对应的值}return1;}//销毁稀疏矩阵M,所有元素置空voidDestroySMatrix(TSMatrix*M){(*M).mu=0;(*M).nu=0;(*M).tu=0;}//输出稀疏矩阵MvoidPrintSMatrix(TSMatrixM){inti;printf("%d行%d歹lj%d个非零元素。",M.mu,M.nu,M.tu);printf(/,%4s%4s%8szz行〃,〃列〃,〃元素值〃);for(i=l;i<=M.tu;i卄)printf(
13、"%4d%4d%8d〃,M.data[i].i,M.data[i].j,M.data[i].e);}//由稀疏矩阵M复制得到TintCopySMatrix(TSMatrixM,TSMatrix*T){(*T)二M;return1;}//AddSMatrix函数要用到intcomp(intcl,intc2){inti;if(cl14、N,TSMatrix*Q){Triple*Mp,*Mc,*p,*Qh,*Qc;if(M.mu!=N.mu)return0;if(M.nu!=N.nu)return0;(*Q)•mu=M.mu;(*Q)・nu二M・nu;Mp二&M.data[l];//Mp的初值指向矩阵M的非零元素首地址Np二&汕data[l];//Np的初值指向矩阵N的非零元素首地址Me二&M.data[M.tu];//Me指向矩阵M的非零元素尾地址Ne=&N.data[N.tu];//Ne指向矩阵N的非零元素尾地址Qh二Qe=(*Q)
15、.data;//Qh、Qc的初值指向矩阵Q的非零元素首地址的前一地址while(Mp<=Me&&Np<=Ne){Qe++;switch(comp(Mp_〉i,Np->i)){case1:*Qe二*Mp;Mp++;break;case0://M、N矩阵当前非零元素的行相等,继续比较列switch(comp(Mp->j,Np->j)){case1:*Qe二*Mp;Mp++;break;case0:*Qe二*Mp;Qe->e+二Np->e;if(!Qe-〉e)//元素值为0,不存入压缩矩阵Qe——;Mp++;N
16、p++;break;caseT:*Qe二*Np;Np++;}break;caseT:*Qe二*Np;Np++;}}if(Mp>Me)//矩阵M的元素全部处理完毕while(Np<=Ne){Qe++;*Qe二*Np;Np++;}if(Np>Ne)//矩阵N的元素全部处理完毕while(Mp<=Me){Qe++;*Qe=*Mp;Mp++;}(*Q).tu二Qe-Qh;//矩阵Q的非零元素个数return1;}//求稀疏矩阵的差Q=