1、我给你源码记得顶我啊!!最主要的是把分给我哦!! include
2、否则继续循环直到,是零为止*/ } flag1=1; a->base[i*a->aa[1]+j]=rand()%10;/*赋值10以内*/ n=rand()%10; if(n<5) a->base[i*a->aa[1]+j]*=-1;/*输入正负*/ m++; } } } void inittsmatrix(array *a,tsmatrix *m)/*稀疏矩阵非零原初始化*/ { int i,j,k=0,*num; for(i=0;iaa[0];i++)/*输入非零原坐标及数据*/ for(j=0;jaa[1];j++) if(a->base[i*a->aa[1]+j]!=0) { m->data[k+1].i=i+1; m->data[k+1].j=j+1; m->data[k+1].e=a->base[i*a->aa[1]+j]; k++; } m->mu=a->aa[0];/*记录行*/ m->nu=a->aa[1];/*记录列*/ m->tu=k;/*记录非零原数量*/ if(!(num=(int *)malloc((m->mu+1)*sizeof(int))))/*num用于记录每行的非零原的个数*/ { printf("空间开辟失败"); exit(1); } if(!(m->rpos=(int *)malloc((m->mu+1)*sizeof(int))))/*本人认为数据结构上的rpos定义有错误,如果某一行全都是非零元那m->rpos[i]=0并不是m->rpos[i-1]+num[i-1]所以以下的rpos操作可能与书上的原意不符*/ { printf("空间开辟失败"); exit(1); } for(i=0;i<=m->mu;i++)/*初始化num*/ num[i]=0; for(i=1;i<=m->tu;i++)/*记录每行非零原的个数*/ ++num[m->data[i].i]; if(num[1]==0)/*如果第一行没有非零原的话那m->rops[1]=0。
(相关资料图)
3、这就是我修改的原因,如果按照书上写的话,那应该是1。
4、对以后的操作有麻烦*/ { m->rpos[1]=0; j=0; } else/*否则记1*/ { m->rpos[1]=1; j=num[1]; } for(i=2;i<=m->mu;i++)/*运算*/ { if(num[i]==0) m->rpos[i]=0;/*当前这一行并没有非零元所以记录1*/ else/*否则记录所对应的序列号*/ { m->rpos[i]=j+1; j+=num[i]; } if(j>=m->tu)/*如果j的数量已经等于所有非零原的数量,那就应该退出循环*/ break; } while(i<=m->mu)/*如果半路退出循环,那么剩下的每行,都没有非零原*/ i++,m->rpos[i]=0; } void outputtsmatrix(tsmatrix *m)/*输出稀疏矩阵*/ { int i; printf("三元组表为"); for(i=1;i<=m->tu;i++) printf("%d行 %d列 %d",m->data[i].i,m->data[i].j,m->data[i].e); printf("行为%d列为%d",m->mu,m->nu); for(i=1;i<=m->mu;i++) printf("%d行的第一个元素所在位置表的位置是%d",i,m->rpos[i]); } void destroysmatrix(array *a)/*销毁稀疏矩阵*/ { if(!a->base)exit(1); free(a->base);a->base=NULL; printf("稀疏矩阵数组销毁成功(*^__^*) "); } void outputarray(array *a)/*输出数组*/ { int i,j; for(i=0;iaa[0];i++) { for(j=0;jaa[1];j++) printf("%2d ",a->base[i*a->aa[1]+j]); printf(""); } } void copysmatrix(tsmatrix *m,tsmatrix *t)/*复制稀疏矩阵*/ { int i; t->mu=m->mu,t->nu=m->nu,t->tu=m->tu; if(!(t->rpos=(int *)malloc((t->mu+1)*sizeof(int)))) { printf("开辟控件失败"); exit(1); } if(t->tu) { for(i=1;i<=m->tu;i++) { t->data[i].i=m->data[i].i; t->data[i].j=m->data[i].j; t->data[i].e=m->data[i].e; } } for(i=1;i<=t->mu;i++) t->rpos[i]=m->rpos[i]; } void subtmatrix(tsmatrix *m,tsmatrix *n,tsmatrix *q)/*稀疏矩阵相减*/ { int i,j,k,a,b,c,x,y,z,*num; q->mu=m->mu>n->mu?m->mu:n->mu; q->nu=m->nu>n->nu?m->nu:n->nu; q->tu=0; if(!(num=(int *)malloc((q->mu+1)*sizeof(int)))) { printf("创建空间失败"); exit(1); } if(!(q->rpos=(int *)malloc((q->mu+1)*sizeof(int)))) { printf("创建空间失败"); exit(1); } for(i=1;i<=q->mu;i++) num[i]=0; if(m->tu==0) copysmatrix(n,q); else if(n->tu==0) copysmatrix(m,q); else { i=j=k=1; while(i<=m->tu&&j<=n->tu) { a=m->data[i].i; b=m->data[i].j; c=m->data[i].e;/*分别记录m的3元组的数据*/ x=n->data[j].i; y=n->data[j].j; z=n->data[j].e; if(a==x)/*如果m,n行相等*/ { if(b==y)/*如果行列都相等*/ { if(c-z!=0)/*如果m-n!=0*/ { num[a]++; q->data[k].i=a; q->data[k].j=b; q->data[k].e=c-z; k++; } i++,j++;/*无论是否m-n==0i,j都要+1*/ } else if(b
5、这就是我修改的原因,如果按照书上写的话,那应该是1。
6、对以后的操作有麻烦*/ { q->rpos[1]=0; j=0; } else/*否则记1*/ { q->rpos[1]=1; j=num[1]; } for(i=2;i<=q->mu;i++)/*运算*/ { if(num[i]==0) q->rpos[i]=0;/*当前这一行并没有非零元所以记录1*/ else/*否则记录所对应的序列号*/ { q->rpos[i]=j+1; j+=num[i]; } if(j>=q->tu)/*如果j的数量已经等于所有非零原的数量,那就应该退出循环*/ break; } while(i<=q->mu)/*如果半路退出循环,那么剩下的每行,都没有非零原*/ { i++; q->rpos[i]=0; } } } void addsmatrix(tsmatrix *m,tsmatrix *n,tsmatrix *q)/*稀疏矩阵相加*/ { int i,j,k,a,b,c,x,y,z,*num; q->mu=m->mu>n->mu?m->mu:n->mu; q->nu=m->nu>n->nu?m->nu:n->nu; q->tu=0; if(!(num=(int *)malloc((q->mu+1)*sizeof(int)))) { printf("创建空间失败"); exit(1); } if(!(q->rpos=(int *)malloc((q->mu+1)*sizeof(int)))) { printf("创建空间失败"); exit(1); } for(i=1;i<=q->mu;i++) num[i]=0; if(m->tu==0) copysmatrix(n,q); else if(n->tu==0) copysmatrix(m,q); else { i=j=k=1; while(i<=m->tu&&j<=n->tu) { a=m->data[i].i; b=m->data[i].j; c=m->data[i].e;/*分别记录m的3元组的数据*/ x=n->data[j].i; y=n->data[j].j; z=n->data[j].e; if(a==x)/*如果m,n行相等*/ { if(b==y)/*如果行列都相等*/ { if(c+z!=0)/*如果m+n!=0*/ { num[a]++; q->data[k].i=a; q->data[k].j=b; q->data[k].e=c+z; k++; } i++,j++;/*无论是否m+n==0i,j都要+1*/ } else if(b
7、这就是我修改的原因,如果按照书上写的话,那应该是1。
8、对以后的操作有麻烦*/ { q->rpos[1]=0; j=0; } else/*否则记1*/ { q->rpos[1]=1; j=num[1]; } for(i=2;i<=q->mu;i++)/*运算*/ { if(num[i]==0) q->rpos[i]=0;/*当前这一行并没有非零元所以记录1*/ else/*否则记录所对应的序列号*/ { q->rpos[i]=j+1; j+=num[i]; } if(j>=q->tu)/*如果j的数量已经等于所有非零原的数量,那就应该退出循环*/ break; } while(i<=q->mu)/*如果半路退出循环,那么剩下的每行,都没有非零原*/ { i++; q->rpos[i]=0; } } } void multsmatrix(tsmatrix *m,tsmatrix *n,tsmatrix *q)/*稀疏矩阵相乘*/ { int i,j,k,l,o,p,x,y,*a,*num; if(!(a=(int *)malloc(((m->mu+1)*(n->nu+1))*sizeof(int))))/*创建一个跟q相同大小的空间用来记录此坐标是否已经输入一个数*/ { printf("开辟空间失败"); exit(1); } if(m->nu!=n->mu) { printf("不匹配"); exit(1); } q->mu=m->mu,q->nu=n->nu,q->tu=0;/*初始化*/ if(!(num=(int *)malloc((m->mu+1)*sizeof(int)))) { printf("开辟空间失败"); exit(1); } if(!(q->rpos=(int *)malloc((q->mu+1)*sizeof(int)))) { printf("空间开辟失败"); exit(1); } for(i=1;i<=q->mu;i++) num[i]=0; if(m->tu*n->tu!=0) { for(i=1;i<=m->mu;i++)/*初始化a数组*/ for(j=1;j<=n->nu;j++) a[i*n->nu+j]=0; for(i=1;i<=m->tu;i++) { o=m->data[i].i; p=m->data[i].j; if(n->rpos[p]==0) continue; l=p+1; while(n->rpos[l]==0&&l<=n->mu) l++; if(l>n->mu) j=n->tu+1; else j=n->rpos[l]; for(k=n->rpos[p];k
9、那么在相应的位置累加*/ else { q->data[++q->tu].e=m->data[i].e*n->data[k].e; q->data[q->tu].i=o; q->data[q->tu].j=y; a[o*n->nu+y]=q->tu;/*此位置记录q->tu*/ num[o]++; } } } for(i=1;i<=q->mu;i++) printf("%d ",num[i]); if(num[1]==0)/*如果第一行没有非零原的话那m->rops[1]=0,这就是我修改的原因,如果按照书上写的话。
10、那应该是1,对以后的操作有麻烦*/ { q->rpos[1]=0; j=0; } else/*否则记1*/ { q->rpos[1]=1; j=num[1]; } for(i=2;i<=q->mu;i++)/*运算*/ { if(num[i]==0) q->rpos[i]=0;/*当前这一行并。
本文分享完毕,希望对大家有所帮助。