作者在 2008-06-03 15:01:22 发布以下内容
#include<stdio.h>
#define MAX 40
typedef struct
{
int i,j;
int e;
}Triple;
typedef struct
{
Triple data[MAX+1];
int mu,nu,tu;
int rpos[MAX+1];
{
int i,j;
int e;
}Triple;
typedef struct
{
Triple data[MAX+1];
int mu,nu,tu;
int rpos[MAX+1];
}Matrix;
void InitMatrix(Matrix *W)
{ int i,p,num[MAX],rpos[MAX],r;
printf("please input the number of row,col and fei ling yuan:\n");
scanf("%d,%d,%d",&W->mu,&W->nu,&W->tu);
printf("please input the data:\n");
{ int i,p,num[MAX],rpos[MAX],r;
printf("please input the number of row,col and fei ling yuan:\n");
scanf("%d,%d,%d",&W->mu,&W->nu,&W->tu);
printf("please input the data:\n");
for(i=1;i<=W->tu;i++)
scanf("%d,%d,%d",&W->data[i].i,&W->data[i].j,&W->data[i].e);
scanf("%d,%d,%d",&W->data[i].i,&W->data[i].j,&W->data[i].e);
for(r=1;r<=W->mu;r++)
num[r]=0;
for(p=1;p<=W->tu;p++)
num[W->data[p].i]=num[W->data[p].i]+1;
W->rpos[1]=1;
for(r=2;r<=W->mu+1;r++)
W->rpos[r]=W->rpos[r-1]+num[r-1];
num[r]=0;
for(p=1;p<=W->tu;p++)
num[W->data[p].i]=num[W->data[p].i]+1;
W->rpos[1]=1;
for(r=2;r<=W->mu+1;r++)
W->rpos[r]=W->rpos[r-1]+num[r-1];
}
void fasttrans(Matrix A,Matrix *B)
{
int col,cpot[MAX],num[MAX],t,p,q;
(*B).mu=A.nu;
(*B).nu=A.mu;
(*B).tu=A.tu;
void fasttrans(Matrix A,Matrix *B)
{
int col,cpot[MAX],num[MAX],t,p,q;
(*B).mu=A.nu;
(*B).nu=A.mu;
(*B).tu=A.tu;
if(B->tu)
{
for(col=0;col<A.nu;++col)
num[col]=0;
for(t=1;t<=A.tu;++t)
++num[A.data[t].j];
cpot[1]=1;
for(col=2;col<=A.nu;++col)
cpot[col]=cpot[col-1]+num[col-1];
for(p=1;p<=A.tu;++p)
{
col=A.data[p].j;
q=cpot[col];
(*B).data[q].i=A.data[p].j;
(*B).data[q].j=A.data[p].i;
(*B).data[q].e=A.data[p].e;
++cpot[col];
}
}
{
for(col=0;col<A.nu;++col)
num[col]=0;
for(t=1;t<=A.tu;++t)
++num[A.data[t].j];
cpot[1]=1;
for(col=2;col<=A.nu;++col)
cpot[col]=cpot[col-1]+num[col-1];
for(p=1;p<=A.tu;++p)
{
col=A.data[p].j;
q=cpot[col];
(*B).data[q].i=A.data[p].j;
(*B).data[q].j=A.data[p].i;
(*B).data[q].e=A.data[p].e;
++cpot[col];
}
}
}
void MulMatrix(Matrix M,Matrix N,Matrix *Q)
{
int t,p,q,tp,k,arow,brow,ccol,ctemp[MAX],num[MAX];
if(M.nu!=N.mu) printf("error");
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(k=1;k<=M.mu;k++)
ctemp[k]=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])
{ ++Q->tu ;
if(++Q->tu>MAX) printf("error");
Q->data[Q->tu].i=arow;
Q->data[Q->tu].j=ccol;
Q->data[Q->tu].e=ctemp[ccol];
void MulMatrix(Matrix M,Matrix N,Matrix *Q)
{
int t,p,q,tp,k,arow,brow,ccol,ctemp[MAX],num[MAX];
if(M.nu!=N.mu) printf("error");
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(k=1;k<=M.mu;k++)
ctemp[k]=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])
{ ++Q->tu ;
if(++Q->tu>MAX) printf("error");
Q->data[Q->tu].i=arow;
Q->data[Q->tu].j=ccol;
Q->data[Q->tu].e=ctemp[ccol];
}
}
}
for(t=1;t<=(*Q).tu;t++)
++num[(*Q).data[t].i];
(*Q).rpos[1]=0;
for(t=2;t<=(*Q).mu;t++)
(*Q).rpos[t]=(*Q).rpos[t-1]+num[t-1];
}
}
}
for(t=1;t<=(*Q).tu;t++)
++num[(*Q).data[t].i];
(*Q).rpos[1]=0;
for(t=2;t<=(*Q).mu;t++)
(*Q).rpos[t]=(*Q).rpos[t-1]+num[t-1];
}
void output(Matrix *P)
{ int i,j,t,k=0;
t=1;
printf(" the array is: \n");
for(i=1;i<=P->mu;i++)
{for(j=1;j<=P->nu;j++)
{ if(P->data[t].i==i&&P->data[t].j==j)
{ printf("%4d",P->data[t].e);t++;}
else printf("%4d",k);
}
printf("\n");
}
}
{ int i,j,t,k=0;
t=1;
printf(" the array is: \n");
for(i=1;i<=P->mu;i++)
{for(j=1;j<=P->nu;j++)
{ if(P->data[t].i==i&&P->data[t].j==j)
{ printf("%4d",P->data[t].e);t++;}
else printf("%4d",k);
}
printf("\n");
}
}
void main( )
{ int i;
Matrix A,B,C;
printf("1 mult array,A*B=C\n");
printf("2 transpose array,A->B\n");
printf("3 exsit\n");
{ int i;
Matrix A,B,C;
printf("1 mult array,A*B=C\n");
printf("2 transpose array,A->B\n");
printf("3 exsit\n");
while(1)
{ printf("please select item to operarting:");
scanf("%d",&i);
switch(i)
{ case 1: InitMatrix(&A);output(&A);InitMatrix(&B);output(&B);MulMatrix(A,B,&C);output(&C);break;
case 2: InitMatrix(&A);output(&A);fasttrans(A,&B);output(&B);break;
case 3: exit(0);break;
}
{ printf("please select item to operarting:");
scanf("%d",&i);
switch(i)
{ case 1: InitMatrix(&A);output(&A);InitMatrix(&B);output(&B);MulMatrix(A,B,&C);output(&C);break;
case 2: InitMatrix(&A);output(&A);fasttrans(A,&B);output(&B);break;
case 3: exit(0);break;
}
}
}
希望有人可以帮忙修改一下,多谢啦!!现在的程序是正确的啦 !