当前位置:文档之家› 数据结构算法之矩阵相乘

数据结构算法之矩阵相乘

#include
#include
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define MAXSIZE 20 /*非0元个数最大值*/
#define MAXRC 10
typedef int Status;
typedef int ElemType;
typedef struct
{
int i,j; //行下标,列下标
ElemType e; //非0元值
}Triple;
typedef struct
{
Triple data[MAXSIZE+1];
int rpos[MAXRC+1];
int mu,nu,tu; //矩阵的行数、列数、非0元数个数
}TSMatrix;

Status CreateSMatrix1(TSMatrix &M) //创建第一个稀疏矩阵
{
int p=1,a,b,c;
printf("请输入稀疏矩阵的行数、列数、非0元个数,并用逗号隔开数据!");
scanf("%d,%d,%d",&M.mu,&M.nu,&M.tu);
if(M.tu>MAXSIZE||M.tu<=0||M.tu>M.mu*M.nu)
{
printf("非0元个数超过最大值!\n");
return ERROR;
}
while(p<=M.tu){
printf("请输入第%d个非0元素的行、列、元素值,并用逗号隔开!",p);
scanf("%d ,%d ,%d",&a,&b,&c);
M.data[0].i=0;M.data[0].j=0;
if(a<=M.mu&&b<=M.nu&&c!=0)
{
if(a>M.data[p-1].i||(a==M.data[p-1].i&&b>M.data[p-1].j))
{
M.data[p].i=a;
M.data[p].j=b;
M.data[p].e=c;
p++;
}
else
printf("请从行到列,从小到大输入!\n");
}
else
printf("输入的数据超出范围!\n");
if(a==M.mu&&b==M.nu&&p<=M.tu)
{
printf("输入顺序有错,请重输入\n");
p=1;
}
}
printf("输入成功!\n");
return OK;
}

Status PrintMatrix(TSMatrix M) //输出一个矩阵
{
int i,j,p=1;
if(M.tu==0)
{
printf("找不到此矩阵");
return ERROR;
}
printf("---%d, 行 %d, 列 %d, 个非0元素---\n 以矩阵方式输出为:\n",M.mu,M.nu,M.tu);
for(i=1;i<=M.mu;i++)
{
for(j=1;j{
if(i==M.data[p].i&&j==M.data[p].j)
{
printf("%d ",M.data[p].e);
p++;
}
else
printf("%d ",0);
}
if(i==M.data[p].i&&j==M.data[p].j)
{
printf("%d\n",M.data[p].e);
p++;
}
else
printf("%d\n",0);
}
return OK;
}



Status CreateSMatrix2(TSMatrix &W) //创建第二个稀疏矩阵
{
int p=1,a,b,c;
printf("请输入稀疏矩阵的行数、列数、非0元个数,并用逗号隔开数据!");
scanf("%d,%d,%d",&W.mu,&W.nu,&W.tu);
if(W.tu>MAXSIZE||W.tu<=0||W.tu>W.mu*W.nu)
{
printf("非0元个数超过最大值!\n");
return ERROR;
}
while(p<=W.tu){
printf("请输入第%d个非0元素的行、列、元素值,并用逗号隔开!",p);
scanf("%d ,%d ,%d",&a,&b,&c);
W.data[0].i=0;
W.data[0].j=0;
if(a<=W.mu&&b<=W.nu&&c!=0)
{
if(a>W.data[p-1].i||(a==W.data[p-1].i&&b>W.data[p-1].j))
{
W.data[p].i=a;
W.data[p].j=b;
W.data[p].e=c;
p++;
}
else
printf("请从行到列,从小到大输入!\n");
}
else
printf("输入的数据超出范围!\n");
if(a==W.mu&&b==W.nu&&p<=W.tu)
{
printf("输入

顺序有错,请重输入\n");
p=1;
}
}
printf("输入成功!\n");
return OK;
}

Status PrintMatrix1(TSMatrix M) //输出第一个矩阵
{
int i,j,p=1;
if(M.tu==0)
{
printf("找不到此矩阵");
return ERROR;
}
printf("---%d 行, %d 列, %d 个非0元素---\n 以矩阵方式输出为:\n",M.mu,M.nu,M.tu);
for(i=1;i<=M.mu;i++)
{
for(j=1;j{
if(i==M.data[p].i&&j==M.data[p].j)
{
printf("%d ",M.data[p].e);
p++;
}
else
printf("%d ",0);
}
if(i==M.data[p].i&&j==M.data[p].j)
{
printf("%d\n",M.data[p].e);
p++;
}
else
printf("%d\n",0);
}
return OK;
}





Status PrintMatrix2(TSMatrix W) //输出第二个矩阵
{
int i,j,p=1;
if(W.tu==0)
{
printf("找不到此矩阵");
return ERROR;
}
printf("---%d 行, %d 列, %d 个非0元素---\n 以矩阵方式输出为:\n",W.mu,W.nu,W.tu);
for(i=1;i<=W.mu;i++)
{
for(j=1;j{
if(i==W.data[p].i&&j==W.data[p].j)
{
printf("%d ",W.data[p].e);
p++;
}
else
printf("%d ",0);
}
if(i==W.data[p].i&&j==W.data[p].j)
{
printf("%d\n",W.data[p].e);
p++;
}
else
printf("%d\n",0);
}
return OK;
}





Status MultSMatrix(TSMatrix M,TSMatrix W,TSMatrix &Q) // 求稀疏矩阵的乘机
{
int arow,brow,p,q,ccol,ctemp[MAXRC+1],t,tp,k=1;
if(M.tu==0||W.tu==0)
{
printf("找不到所需的矩阵");
return ERROR;
}
if(M.nu!=W.mu)
{
printf("此矩阵不能被运算,请检查行列数!\n");
return ERROR;
}
for(p=1;p<=M.tu;p++) //为M.rpos[]赋值
{
if(M.data[p].i==k)
{
M.rpos[k]=p;
k++;
}
else if(M.data[p].i>k)
{
M.rpos[k]=p--;
k++;
}
}
for(;k<=M.mu;k++)
M.rpos[k]=M.tu;
k=1;
for(q=1;q<=W.tu;q++) //为N.rpos[]赋值
{
if(W.data[q].i==k)
{
W.rpos[k]=q;
k++;
}
else if(W.data[q].i>k)
{
W.rpos[k]=p--;
k++;
}
}
for(;k<=W.mu;k++)
W.rpos[k]=W.tu;
Q.mu=M.mu; //初始化Q
Q.nu=W.nu;
Q.tu=0;
for(arow=1;arow<=M.mu;++arow)
{
for(ccol=1;ccol<=W.nu;ccol++)
ctemp[ccol]=0;
if(arowtp=M.rpos[arow+1];
else tp=M.tu+1;
for(p=M.rpos[arow];p{
brow=M.data[p].j;
if(browt=W.rpos[brow+1];
else
t=W.tu+1;
for(q=W.rpos[brow];q{
ccol=W.data[q].j;
ctemp[ccol]+=M.data[p].e*W.data[q].e;
}
}
for(ccol=1;ccol<=Q.nu;++ccol) //将数组的值压缩存到Q
{
if(ctemp[ccol]!=0)
{
Q.tu++;
if(Q.tu>MAXSIZE)
{
printf("非0元个数超出最大值!\n");
return ERROR;
}
Q.data[Q.tu].i=arow;
Q.data[

Q.tu].j=ccol;
Q.data[Q.tu].e=ctemp[ccol];
}
}
}
printf("运算成功!\n");
return OK;
}
void Show()
{
printf("*****************************************************************\n");
printf("0.退出程序;1.创建矩阵A;2.创建矩阵B;3.输出矩阵A;4.输出矩阵B;5.矩阵相乘;6.输出矩阵相乘结果!\n");
printf("*****************************************************************\n");
printf("\n");
}

void main()
{
int select;
TSMatrix A,B,C;
A.tu=0;
B.tu=0;
C.tu=0;
Show();
while(1){
printf("请选择: ");
scanf("%d",&select);
if(select==0)
break;
switch(select){
case 1: CreateSMatrix1(A);
break;
case 2: CreateSMatrix2(B);
break;
case 3: PrintMatrix1(A);
break;
case 4: PrintMatrix2(B);
break;
case 5: MultSMatrix(A,B,C);
break;
case 6: PrintMatrix(C);
break;
default:printf("输入错误,请检查!\n");
break;
}
}
}

相关主题
文本预览
相关文档 最新文档