稀疏矩阵的算术
程序代码:
#include<stdio.h> #define MAXSIZE 400 typedef struct {int i,j,e;}Triple; typedef struct RLSMatrix {Triple data[MAXSIZE+1]; int rpos[21]; int mu,nu,tu; }RLSMatrix; void main() { void AddSubtract(RLSMatrix,RLSMatrix,RLSMatrix *,char); void MultSMatrix(RLSMatrix,RLSMatrix,RLSMatrix *); void print(RLSMatrix); char c; int num,cnt=0; Triple *p; RLSMatrix M,N,Q; RLSMatrix *s; s=&Q; printf("请输入你要做的运算('+'代表加法,'-'代表减法,'*'代表乘法)!\n"); scanf("%c",&c); printf("请分别输入第一个矩阵的行数,列数以及非零元素个数!\n"); scanf("%d,%d,%d",&M.mu,&M.nu,&M.tu); printf("请分别输入第二个矩阵的行数,列数以及非零元素个数!\n"); scanf("%d,%d,%d",&N.mu,&N.nu,&N.tu); while((c=='*')&&(M.nu!=N.mu)||(c=='+'||c=='-')&&!((M.nu==N.nu)&&(M.mu==N.mu))) { printf("输入有错,请重新输入!\n"); printf("请分别输入第一个矩阵的行数,列数以及非零元素个数!\n"); scanf("%d,%d,%d",&M.mu,&M.nu,&M.tu); printf("请分别输入第二个矩阵的行数,列数以及非零元素个数!\n"); scanf("%d,%d,%d",&N.mu,&N.nu,&N.tu); } printf("请按行优先原则依次输入第一个稀疏矩阵的非零元素的行,列以及值!\n"); for(num=1;num<=M.tu;++num) scanf("%d,%d,%d",&M.data[num].i,&M.data[num].j,&M.data[num].e); printf("请按行优先原则依次输入第二个稀疏矩阵的非零元素的行,列以及值!\n"); for(num=1;num<=N.tu;++num) scanf("%d,%d,%d",&N.data[num].i,&N.data[num].j,&N.data[num].e); //请M,N矩阵对应的rpos数组,从下标0开始存储每一行的第一个非零元素在data数组中的位置,虚设一个rpos[mu+1]单元来指示矩阵最后一行非零元素的范围 M.rpos[0]=1; for(num=1,p=M.data+1;num<=M.mu;++num) {while(num==p->i) {cnt++; p++;} M.rpos[num]=M.rpos[num-1]+cnt; cnt=0;} N.rpos[0]=1; for(num=1,p=N.data+1;num<=N.mu;++num) {while(num==p->i) {cnt++; p++;} N.rpos[num]=N.rpos[num-1]+cnt; cnt=0;} if(c=='*') MultSMatrix(M,N,s); else AddSubtract(M,N,s,c); print(Q); } void AddSubtract(RLSMatrix M,RLSMatrix N,RLSMatrix *s,char c) {s->mu=M.mu; s->nu=M.nu; s->tu=0; int tp,t,cnt=1,arow; for(arow=1;arow<=M.mu;++arow) {s->rpos[arow-1]=s->tu+1; tp=M.rpos[arow-1]; t=N.rpos[arow-1]; while(tp<M.rpos[arow]&&t<N.rpos[arow]) {if (M.data[tp].j<N.data[t].j) {s->data[cnt++]=M.data[tp]; tp++;} else if(N.data[t].j<M.data[tp].j) { s->data[cnt].i=N.data[t].i; s->data[cnt].j=N.data[t].j; s->data[cnt].e=(c=='+')?N.data[t].e:-N.data[t].e; cnt++; t++;} else {if((M.data[tp].e+N.data[t].e)!=0&&(c=='+')||(c=='-')&&(M.data[tp].e-N.data[t].e)!=0) {s->data[cnt].i=N.data[t].i; s->data[cnt].j=N.data[t].j; s->data[cnt].e=(c=='+')?N.data[t].e+M.data[tp].e:M.data[tp].e-N.data[t].e; cnt++; } tp++; t++; }} while(tp<M.rpos[arow]) {s->data[cnt++]=M.data[tp]; tp++;} while(t<N.rpos[arow]) { s->data[cnt].i=N.data[t].i; s->data[cnt].j=N.data[t].j; s->data[cnt].e=(c=='+')?N.data[t].e:-N.data[t].e; cnt++; t++;} s->tu=cnt-1; }} void MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *s) {int p,q,arow,brow,ctemp[21],ccol; s->mu=M.mu; s->nu=N.nu; s->tu=0; for(arow=1;arow<=M.mu;++arow) {for(p=1;p<=M.nu;p++) ctemp[p]=0; s->rpos[arow-1]=s->tu+1; for(p=M.rpos[arow-1];p<M.rpos[arow];++p) {brow=M.data[p].j; for(q=N.rpos[brow-1];q<N.rpos[brow];++q) {ccol=N.data[q].j; ctemp[ccol]+=M.data[p].e*N.data[q].e;}} for(ccol=1;ccol<=s->nu;++ccol) if(ctemp[ccol]) {++s->tu; s->data[s->tu].i=arow; s->data[s->tu].j=ccol; s->data[s->tu].e=ctemp[ccol];} }} void print(RLSMatrix Q) { int arow,brow,p=1; for(arow=1;arow<=Q.mu;arow++) { for(brow=1;brow<=Q.nu;brow++) {if(Q.data[p].j==brow&&Q.data[p].i==arow) {printf(" %d",Q.data[p].e); p++;} else printf(" 0"); } printf("\n");} }