求数据结构课程设计——稀疏矩阵运算器源代码

要求: 以“带行逻辑链接信息”的三元组顺序表示稀疏矩阵,实现两个矩阵相加,相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵形式则以通常的阵列形式列出。 很急,希望程序员朋友能够帮助我,小弟非常感谢!

第1个回答  2012-12-15
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define Max 250
typedef int ElemType;
typedef int Status;
typedef struct data{
int i,j,e;}data;
typedef struct SMatrix{
data data[Max+1];
int rpos[Max+1];
int mu,nu,tu;}SMatrix;
Status InitSMatrix(SMatrix* M)
{ int i,j,e,t;
if(!M) return ERROR;
printf("请输入稀疏矩阵的行数与列数\n");
scanf("%d %d",&M->mu,&M->nu);
M->tu=0;
printf("请输入矩阵\n");
for(i=1;i<=M->mu;i++)
{ t=0;
M->rpos[i]=0;
for(j=1;j<=M->nu;j++)
{ scanf("%d",&e);
if(e!=0){
M->tu++; M->data[M->tu].i=i;M->data[M->tu].j=j;M->data[M->tu].e=e;
if(t==0){ M->rpos[i]=M->tu;t++; } }
}
}
return OK; }
Status PrintSMatrix(SMatrix M)
{ int i,j,t=1;
printf("输出矩阵:\n");
for(i=1;i<=M.mu;i++)
{
for(j=1;j<=M.nu;j++)
{ if(M.data[t].i==i&&M.data[t].j==j){ printf("%-2d",M.data[t].e); t++; }
else printf("%-2d",0);
}
printf("\n");
}
return OK; }
Status AddSMatrix(SMatrix M,SMatrix N,SMatrix *Q)
{ int m=1,n=1,t=0,i;
if(M.mu!=N.mu&&M.nu!=N.nu) return ERROR;
Q->mu=M.mu,Q->nu=M.nu; Q->tu=0;
for(i=1;i<=Q->mu;i++) Q->rpos[i]=0;
while(m<=M.tu&&n<=N.tu)
{ if(M.data[m].i<N.data[n].i){
t++; Q->tu++;
Q->data[t].e=M.data[m].e; Q->data[t].i=M.data[m].i; Q->data[t].j=M.data[m].j;
m++; }
if(M.data[m].i>N.data[n].i){
t++; Q->tu++;
Q->data[t].e=N.data[n].e; Q->data[t].i=N.data[n].i; Q->data[t].j=N.data[n].j;
n++; }
else if(M.data[m].i==N.data[n].i){
if(M.data[m].j<N.data[n].j){
t++; Q->tu++;
Q->data[t].e=M.data[m].e;Q->data[t].i=M.data[m].i;Q->data[t].j=M.data[m].j;
m++; }
if(M.data[m].j>N.data[n].j){
Q->tu++; t++;
Q->data[t].e=N.data[n].e;Q->data[t].i=N.data[n].i;Q->data[t].j=N.data[n].j;
n++; }
else{ if(M.data[m].e+N.data[n].e!=0){
t++; Q->tu++;
Q->data[t].e=M.data[m].e+N.data[n].e;
Q->data[t].i=M.data[m].i;
Q->data[t].j=M.data[m].j;
m++; n++; } } }
if(t==1) Q->rpos[Q->data[t].i]=1;
else if(Q->data[t-1].i<Q->data[t].i) Q->rpos[Q->data[t].i]=t;
}
if(m<=M.tu){
for(m;m<=M.tu;m++){ t++; Q->tu++;
Q->data[t].e=M.data[m].e; Q->data[t].i=M.data[m].i; Q->data[t].j=M.data[m].j;
if(Q->data[t-1].i<Q->data[t].i) Q->rpos[Q->data[t].i]=t; } }
if(n<=N.tu){
for(n;n<=N.tu;n++){ t++; Q->tu++;
Q->data[t].e=N.data[n].e; Q->data[t].i=N.data[n].i; Q->data[t].j=N.data[n].j;
if(Q->data[t-1].i<Q->data[t].i) Q->rpos[Q->data[t].i]=t; } }
return OK; }
Status MultSMatrix(SMatrix M,SMatrix N,SMatrix* Q)
{ if(M.nu!=N.mu) return ERROR;
int arow,p,q,t,tp,brow,ccol,ctemp[Max];
Q->mu=M.mu; Q->nu=N.nu; Q->tu=0;
if(M.tu*N.tu!=0){
for(arow=1;arow<=M.mu;arow++){
for(ccol=1;ccol<=M.nu;ccol++) ctemp[ccol]=0;
Q->rpos[arow]=Q->tu+1;
if(arow<M.mu) tp=M.rpos[arow+1];
else {tp=M.tu+1; }
for(p=M.rpos[arow];p<tp;p++){
brow=M.data[p].j;
if(brow<N.mu) t=N.rpos[brow+1];
else { t=N.tu+1; }
for(q=N.rpos[brow];q<t;++q){
ccol=N.data[q].j;
ctemp[ccol]+=M.data[p].e*N.data[q].e;
}
}
for(ccol=1;ccol<=Q->nu;++ccol){
if(ctemp[ccol]){
if(++Q->tu>Max) return ERROR;
Q->data[Q->tu].i=arow;
Q->data[Q->tu].j=ccol;
Q->data[Q->tu].e=ctemp[ccol]; } }
}
}
return OK; }
Status TransSMatrix(SMatrix M,SMatrix* T)
{ int col,t,p,q,num[Max],cot[Max];
T->mu=M.nu;T->nu=M.mu;T->tu=M.tu;
if(T->tu){
for(col=1;col<=M.nu;++col) num[col]=0;
for(t=1;t<=M.tu;++t) ++num[M.data[t].j];
cot[1]=1;
for(col=2;col<=M.nu;col++) cot[col]=cot[col-1]+num[col-1];
for(p=1;p<=M.tu;p++){
col=M.data[p].j; q=cot[col];
T->data[q].e=M.data[p].e; T->data[q].i=M.data[p].j;
T->data[q].j=M.data[p].i; ++cot[col]; } }
return OK; }
void main()
{ int i;
char c,j;
SMatrix M,N,T,Q,P;
printf("请输入矩阵a:\n"); InitSMatrix(&M);
printf("请输入矩阵b:\n"); InitSMatrix(&N);
printf("请选择操作,1-矩阵相加,2-矩阵相乘,3-矩阵转置,4-退出\n");
while(scanf("%d",&i),i!=4){
switch(i){
case 1:{
if(AddSMatrix(M,N,&Q)==OK){ printf("矩阵a+b=\n"); PrintSMatrix(Q); }
else printf("矩阵不符合运算规则\n"); break;}
case 2:{
if(MultSMatrix(M,N,&P)==OK){ printf("矩阵a*b=\n"); PrintSMatrix(P); }
else printf("矩阵不符合运算规则\n"); break;}
case 3:{
printf("转置哪个矩阵:"); scanf("%c%c",&j,&c);
if(c=='a') TransSMatrix(M,&T);
else TransSMatrix(N,&T);
PrintSMatrix(T); break;} }
}
}
这个是矩阵输入的,把InitSMatrix()输入函数改一下就可以了,