稀疏矩阵的存储和快速转置和相乘的算法

#include
#include

#define MAXSIZE 100
typedef struct
{ int i,j;
int e;
} Triple;
typedef struct
{ Triple data[MAXSIZE+1];
int mu,nu,tu;
} TSMatrix;
int InputMatrix(TSMatrix &M)
{ int a=0,b=0,m,n,c,p=1;
printf("请输入数组的行数和列数:");
scanf("%d",&a);
scanf("%d",&b);
printf("请依次输入数组:\n");
for(m=1;m<=a;m++)
for(n=1;n<=b;n++)
{ scanf("%d",&c);
if(c!=0)
{ M.data[p].e=c;
M.data[p].i=m;
M.data[p].j=n;
p++;
}
}
M.tu=p; M.mu=a; M.nu=b;
return b;
}


/* 按数组方式输出三元组表 */

void PrintM(TSMatrix M)
{int k=1,p=1,n;
printf("\nM:\n");
if (M.tu)
{n=(M.data[p].i-1)*M.nu+M.data[p].j;
for(k=1;k<=M.mu*M.nu;k++)
{if (kn)
printf(" 0");
else
{ system(" ");
system(" ");
system(" ");
system(" ");
printf("%3d",M.data[p].e);
p++;
if (p<=M.tu) n=(M.data[p].i-1)*M.nu+M.data[p].j;
}
if (k%M.nu==0) printf("\n");
}
}
}

/* 按三元组方式输出三元组表 */

void PrintM3(TSMatrix M)
{int k;
printf("M:");
printf("\n 行数 列数 数值\n");
printf("\n%3d%6d%6d\n",M.mu,M.nu,M.tu-1);
for(k=1;k{
printf("\n%3d%6d%6d",M.data[k].i,M.data[k].j,M.data[k].e);
system(" ");
system(" ");
system(" ");
}
}

/*矩阵的转置*/

void trantup(TSMatrix M, TSMatrix &T)
{
int q,col,p;
T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if (T.tu)
{
q=1;
for(col=1; col<=M.nu; ++col)
for(p=1; p<=M.tu; ++p)
if (M.data[p].j==col)
{
T.data[q].i=M.data[p].j;
T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e;
++q;
}
}
}

/*矩阵的相乘*/

void MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q)
{ int k1,k2,k3,m;
Q.mu=M.mu;
Q.nu=N.nu;
Q.tu=0;
if(M.nu==N.mu)
{ for(k1=1;k1<=M.tu;k1++)
for(k2=1;k2<=N.tu;k2++)
{
if(M.data[k1].j==N.data[k2].i)
{
m=M.data[k1].e*N.data[k2].e;
if(Q.tu==0)
{
Q.data[1].e=m;
Q.data[1].i=M.data[k1].i;
Q.data[1].j=N.data[k2].j;
Q.tu++;
}
else
{
for(k3=1;k3<=Q.tu;k3++)
{
if(Q.data[k3].i==M.data[k1].i&&Q.data[k3].j==N.data[k2].j)
{
Q.data[k3].e+=m;break; }
}
if(k3==Q.tu+1)
{
Q.data[k3].e=m;
Q.data[k3].i=M.data[k1].i;
Q.data[k3].j=N.data[k2].j;
Q.tu++;
}
}
}
}
}
}
/* 主函数 */
void main()
{ int a;
TSMatrix M,N,T,Q;
a=InputMatrix(M);
printf("\n按三元组方式输出:\n");
PrintM3(M);
printf("\n下面进行矩阵转置的操作:");
system("PAUSE");
system("cls");
printf("\n要转置的矩阵为:");
PrintM(M);
trantu

p(M,T);
printf("\n转置后的矩阵为:");
PrintM(T);
printf("下面进行矩阵相乘的操作:\n");
system("PAUSE");
system("cls");
printf("请再输入一个矩阵用于计算(矩阵的行数须与前一矩阵的列数一致即:%d\n",a);
InputMatrix(N);
if(M.nu==N.mu)
{
printf("参与相乘的矩阵分别为:\n");
PrintM(M);
PrintM(N);
MultSMatrix(M,N,Q);
printf("相乘后的矩阵为:\n");
PrintM(Q);
}
else
printf("前一矩阵的列数与后一矩阵的行数不相等,拒绝进行相乘运算!\n");
printf("本程序结束!\n");
system("PAUSE");
}

相关文档
最新文档