行逻辑链接的三元组顺序表实现,加减乘和转置运算,调的好累,这两天少了点劲头了,坚持住,
试了好几组数据应该没问题了,但也可能还有漏洞```
- #include<iostream>
- #include<malloc.h>
- #include<stdlib.h>
- using namespace std;
- #define OK 1
- #define ERROR 0
- #define OVERFLOW -2
- typedef int Status;
- typedef struct
- {
- int i,j;
- int e;}Triple;
- typedef struct
- {
- Triple *data;
- int *rpos;
- int mu,nu,tu;
- }RLSMatrix;
- Status CreateMatrix(RLSMatrix &a) //创建
- {
- cin>>a.mu>>a.nu>>a.tu;
- a.data=(Triple*)malloc(a.tu*sizeof(Triple));
- a.rpos=(int*)malloc((a.mu+1)*sizeof(int));
- if(!a.data||!a.rpos) exit(OVERFLOW);
- int curow=0,k;
- for(k=0;k<a.tu;k++)
- {
- do
- {
- cin>>a.data[k].i>>a.data[k].j>>a.data[k].e;
- }while(a.data[k].i>a.mu||a.data[k].j>a.nu);
- while(curow<a.data[k].i)
- a.rpos[curow++]=k; //如果当前行元素都为0,则指向下一行第一个非0元素
- }
- while(curow<=a.mu)
- a.rpos[curow++]=k;
- return OK;
- }
- /*
- Status TransposeSMatrix(RLSMatrix a,RLSMatrix &b) //转置
- {
- b.mu=a.nu;b.nu=a.mu;b.tu=a.tu;
- b.data=(Triple*)malloc(b.tu*sizeof(Triple));
- b.rpos=(int*)malloc((b.mu+1)*sizeof(int));
- if(!b.data||!b.rpos) exit(OVERFLOW);
- int curow=0,k,col,p;
- for(col=1,k=0;col<=a.nu;col++)
- for(p=0;p<a.tu;p++)
- if(a.data[p].j==col)
- {
- while(curow<a.data[k].j)
- b.rpos[curow++]=k;
- b.data[k].j=a.data[p].i;
- b.data[k].i=a.data[p].j;
- b.data[k].e=a.data[p].e;
- k++;
- }
- while(curow<=b.mu)
- b.rpos[curow++]=k;
- return OK;
- }
- */
- Status FastTransposeSMatrix(RLSMatrix a,RLSMatrix &b) //快速转置
- {
- b.mu=a.nu;b.nu=a.mu;b.tu=a.tu;
- b.data=(Triple*)malloc(b.tu*sizeof(Triple));
- int col,k,m,*num,*cpot;
- num=(int*)malloc(a.nu*sizeof(int));
- cpot=(int*)malloc(a.nu*sizeof(int));
- b.rpos=(int*)malloc((b.mu+1)*sizeof(int));
- if(!b.data||!b.rpos||!num||!cpot) exit(OVERFLOW);
- if(b.tu)
- {
- for(col=0;col<a.nu;col++) num[col]=0;
- for(k=0;k<a.tu;k++)
- ++num[a.data[k].j-1];
- b.rpos[0]=cpot[0]=0;
- for(col=1;col<a.nu;col++)
- b.rpos[col]=cpot[col]=cpot[col-1]+num[col-1];
- b.rpos[col]=cpot[col-1]+num[col-1];
- for(k=0;k<a.tu;k++)
- {
- col=a.data[k].j-1; m=cpot[col];
- b.data[m].i=a.data[k].j;b.data[m].j=a.data[k].i;
- b.data[m].e=a.data[k].e;
- cpot[col]++;}
- free(num);free(cpot);
- }
- return OK;}
- Status AddSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q) //加法
- {
- if(!(M.mu==N.mu&&M.nu==N.nu)) return ERROR;
- Q.mu=M.mu;Q.nu=M.nu;Q.tu=0;
- Q.data=(Triple*)malloc(Q.mu*Q.nu*sizeof(Triple));
- Q.rpos=(int*)malloc((Q.mu+1)*sizeof(int));
- if(!Q.data||!Q.rpos) exit(OVERFLOW);
- int t,tp,temp,p,q;
- for(int row=0;row<Q.mu;row++)
- {
- Q.rpos[row]=Q.tu;
- tp=M.rpos[row+1];
- t=N.rpos[row+1];
- for(p=M.rpos[row],q=N.rpos[row];p!=tp&&q!=t;p++)
- if(M.data[p].j<N.data[q].j) {
- Q.data[Q.tu].i=M.data[p].i;
- Q.data[Q.tu].j=M.data[p].j;
- Q.data[Q.tu++].e=M.data[p].e;}
- else if(M.data[p].j>N.data[q].j){
- Q.data[Q.tu].i=N.data[q].i;
- Q.data[Q.tu].j=N.data[q].j;
- Q.data[Q.tu++].e=N.data[q++].e;}
- else {
- temp=M.data[p].e+N.data[q].e;
- if(!temp) q++;
- else{
- Q.data[Q.tu].i=N.data[q].i;
- Q.data[Q.tu].j=N.data[q].j;
- Q.data[Q.tu++].e=temp;
- q++;}
- }
- while(p<tp) {Q.data[Q.tu].i=M.data[p].i;
- Q.data[Q.tu].j=M.data[p].j;
- Q.data[Q.tu++].e=M.data[p++].e;
- }
- while (q<t){
- Q.data[Q.tu].i=N.data[q].i;
- Q.data[Q.tu].j=N.data[q].j;
- Q.data[Q.tu++].e=N.data[q++].e;}
- }
- Q.rpos[Q.mu]=Q.tu;
- return OK;
- }
- Status SubSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q) //减法
- {
- if(!(M.mu==N.mu&&M.nu==N.nu)) return ERROR;
- Q.mu=M.mu;Q.nu=M.nu;Q.tu=0;
- Q.data=(Triple*)malloc(Q.mu*Q.nu*sizeof(Triple));
- Q.rpos=(int*)malloc((Q.mu+1)*sizeof(int));
- if(!Q.data||!Q.rpos) exit(OVERFLOW);
- int t,tp,temp,p,q;
- for(int row=0;row<Q.mu;row++)
- {
- Q.rpos[row]=Q.tu;
- tp=M.rpos[row+1];
- t=N.rpos[row+1];
- for(p=M.rpos[row],q=N.rpos[row];p!=tp&&q!=t;p++)
- if(M.data[p].j<N.data[q].j) {
- Q.data[Q.tu].i=M.data[p].i;
- Q.data[Q.tu].j=M.data[p].j;
- Q.data[Q.tu++].e=M.data[p].e;}
- else if(M.data[p].j>N.data[q].j){
- Q.data[Q.tu].i=N.data[q].i;
- Q.data[Q.tu].j=N.data[q].j;
- Q.data[Q.tu++].e=-N.data[q++].e;}
- else {
- temp=M.data[p].e-N.data[q].e;
- if(!temp) q++;
- else{
- Q.data[Q.tu].i=N.data[q].i;
- Q.data[Q.tu].j=N.data[q].j;
- Q.data[Q.tu++].e=temp;
- q++;}
- }
- while(p<tp) {Q.data[Q.tu].i=M.data[p].i;
- Q.data[Q.tu].j=M.data[p].j;
- Q.data[Q.tu++].e=M.data[p++].e;
- }
- while (q<t){
- Q.data[Q.tu].i=N.data[q].i;
- Q.data[Q.tu].j=N.data[q].j;
- Q.data[Q.tu++].e=-N.data[q++].e;}
- }
- Q.rpos[Q.mu]=Q.tu;
- return OK;
- }
- Status MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q) //乘法
- {
- if(M.nu!=N.mu) return ERROR;
- Q.mu=M.mu;Q.nu=N.nu;Q.tu=-1;
- Q.data=(Triple*)malloc(Q.mu*Q.nu*sizeof(Triple));
- Q.rpos=(int*)malloc((Q.mu+1)*sizeof(int));
- int *ctemp=(int*)malloc(Q.nu*sizeof(int));
- if(!Q.data||!Q.rpos||!ctemp) exit(OVERFLOW);
- int tp,t,ccol,brow;
- if(M.tu*N.tu!=0)
- {
- for(int arow=0;arow<M.mu;arow++)
- {
- for(int i=0;i<Q.nu;i++)
- ctemp[i]=0;
- Q.rpos[arow]=Q.tu+1;
- tp=M.rpos[arow+1];
- for(int p=M.rpos[arow];p<tp;p++)
- {
- brow=M.data[p].j-1;
- t=N.rpos[brow+1];
- for(int q=N.rpos[brow];q<t;q++)
- {
- ccol=N.data[q].j-1;
- ctemp[ccol]+=M.data[p].e*N.data[q].e;
- }
- }
- for(ccol=0;ccol<Q.nu;++ccol)
- if(ctemp[ccol])
- {
- ++Q.tu;
- Q.data[Q.tu].i=arow+1;
- Q.data[Q.tu].j=ccol+1;
- Q.data[Q.tu].e=ctemp[ccol];
- }
- }
- Q.tu++;
- Q.rpos[Q.mu]=Q.tu;
- }
- return OK;
- }
- /*
- void PrintSMatrix(RLSMatrix a) //输出rpos[]的值,用于测试
- {
- for(int i=0;i<=a.mu;i++)
- cout<<a.rpos[i]<<" ";
- cout<<endl;
- cout<<a.tu<<endl;}
- */
- void ShowSMatrix(RLSMatrix a) //输出矩阵
- {
- cout<<endl;
- for(int row=1,k=0;row<=a.mu;row++)
- {for(int col=1;col<=a.nu;col++)
- if(a.data[k].i==row&&a.data[k].j==col)
- {cout<<a.data[k].e<<" ";k++;}
- else cout<<"0"<<" ";
- cout<<endl;}
- cout<<endl;
- }
- int main()
- {
- RLSMatrix a,b,c,d,e,f;
- CreateMatrix(a);
- ShowSMatrix(a);
- //PrintSMatrix(a);
- CreateMatrix(b);
- ShowSMatrix(b);
- //PrintSMatrix(b);
- AddSMatrix(a,b,c);
- ShowSMatrix(c);
- //PrintSMatrix(c);
- SubSMatrix(a,b,d);
- ShowSMatrix(d);
- //PrintSMatrix(d);
- MultSMatrix(a,b,e);
- ShowSMatrix(e);
- //PrintSMatrix(e);
- FastTransposeSMatrix(a,f);
- ShowSMatrix(f);
- //PrintSMatrix(b);
- return 0;
- }