数据结构C语言 稀疏矩阵的三元组顺序表存储表示和实现

/*数据结构C语言版稀疏矩阵的三元组顺序表存储表示和实现P98编译环境:Dev-C++4.9.9.2日期:2011年2月8日*/typedefintElemType;//稀疏矩阵的三元组顺序表存储表示#defineMAXSIZE100//非零元个数的最大值typedefstruct{inti,j;//行下标,列下标ElemTypee;//非零元素值}Triple;typedefstruct{Tripledata[MAXSIZE+1];//非零元三元组表,data[0]未用intmu,nu,tu;//矩阵的行数、列数和非零元个数}TSMatrix;//创建稀疏矩阵MintCreateSMatrix(TSMatrix*M){inti,m,n;ElemTypee;intk;printf("请输入矩阵的行数,列数,非零元素个数:(逗号)\n");scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);(*M).data[0].i=0;//为以下比较顺序做准备for(i=1;i<=(*M).tu;i++){do{printf("请按行序顺序输入第%d个非零元素所在的行(1~%d),""列(1~%d),元素值:(逗号)\n",i,(*M).mu,(*M).nu);scanf("%d,%d,%d",&m,&n,&e);k=0;//行或列超出范围---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---if(m<1||m>(*M).mu||n<1||n>(*M).nu)k=1;if(m<(*M).data[i-1].i||m==(*M).data[i-1].i&&n<=(*M).data[i-1].j)//行或列的顺序有错k=1;}while(k);(*M).data[i].i=m;//行下标(*M).data[i].j=n;//列下标(*M).data[i].e=e;//该下标所对应的值}return1;}//销毁稀疏矩阵M,所有元素置空voidDestroySMatrix(TSMatrix*M){(*M).mu=0;(*M).nu=0;(*M).tu=0;}//输出稀疏矩阵MvoidPrintSMatrix(TSMatrixM){inti;printf("\n%d行%d列%d个非零元素。\n",M.mu,M.nu,M.tu);printf("%4s%4s%8s\n","行","列","元素值");for(i=1;i<=M.tu;i++)printf("%4d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);}//由稀疏矩阵M复制得到TintCopySMatrix(TSMatrixM,TSMatrix*T){(*T)=M;return1;}//AddSMatrix函数要用到intcomp(intc1,intc2){inti;if(c1<c2)i=1;---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---elseif(c1==c2)i=0;elsei=-1;returni;}//求稀疏矩阵的和Q=M+NintAddSMatrix(TSMatrixM,TSMatrixN,TSMatrix*Q){Triple*Mp,*Me,*Np,*Ne,*Qh,*Qe;if(M.mu!=N.mu)return0;if(M.nu!=N.nu)return0;(*Q).mu=M.mu;(*Q).nu=M.nu;Mp=&M.data[1];//Mp的初值指向矩阵M的非零元素首地址Np=&N.data[1];//Np的初值指向矩阵N的非零元素首地址Me=&M.data[M.tu];//Me指向矩阵M的非零元素尾地址Ne=&N.data[N.tu];//Ne指向矩阵N的非零元素尾地址Qh=Qe=(*Q).data;//Qh、Qe的初值指向矩阵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++;Np++;break;case-1:*Qe=*Np;Np++;}break;case-1:*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=M-NintSubtSMatrix(TSMatrixM,TSMatrixN,TSMatrix*Q){inti;for(i=1;i<=N.tu;i++)N.data[i].e*=-1;AddSMatrix(M,N,Q);return1;}//求稀疏矩阵的乘积Q=M*NintMultSMatrix(TSMatrixM,TSMatrixN,TSMatrix*Q){---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---inti,j,h=M.mu,l=N.nu,Qn=0;//h,l分别为矩阵Q的行、列值,Qn为矩阵Q的非零元素个数,初值为0ElemType*Qe;if(M.nu!=N.mu)return0;(*Q).mu=M.mu;(*Q).nu=N.nu;Qe=(ElemType*)malloc(h*l*sizeof(ElemType));//Qe为矩阵Q的临时数组//矩阵Q的第i行j列的元素值存于*(Qe+(i-1)*l+j-1)中,初值为0for(i=0;i<h*l;i++)*(Qe+i)=0;//赋初值0for(i=1;i<=M.tu;i++)//矩阵元素相乘,结果累加到Qefor(j=1;j<=N.tu;j++)if(M.data[i].j==N.data[j].i)*(Qe+(M.data[i].i-1)*l+N.data[j].j-1)+=M.data[i].e*N.da...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

笔杆子文秘
机构认证
内容提供者

为您提供优质文档,供您参考!

确认删除?