文章参考过网上的内容,如果侵权,请联系
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 50 //假设非零元素最大个数为50
typedef struct{
int i,j; //该非零元的行下标和列下标
int e; //非零值
}Triple;
typedef struct{
Triple data[MAXSIZE+1]; //非零元三元组表,data[0]未用
int mu,nu,tu; //矩阵的行数、列数和非零元个数
}TSMatrix;
int CreateSMatrix(TSMatrix &M)
{ //创建稀疏矩阵M
int j,i=1;
printf("输入矩阵的行数、列数、非零元个数\n");
scanf("%d%d%d",&M.mu,&M.nu,&M.tu); j=M.tu;
if(M.tu>MAXSIZE) return 0;
printf("输入矩阵非零值及其行下标和列下标\n");
while(j--)
{
scanf("%d%d%d",&M.data[i].e,&M.data[i].i,&M.data[i].j);
i++;
}
}
void disp(TSMatrix M)
{ //输出函数
int k=1;
for(int i=0;i<M.mu;i++)
{
for(int j=0;j<M.nu;j++)
{
if(i==M.data[k].i-1&&j==M.data[k].j-1)
{
printf("%d ",M.data[k].e);
++k;
}
else printf("0 ");
if(j==M.nu-1) printf("\n");
}
}
}
int AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{ //用矩阵Q返回矩阵M和矩阵N的和
int s=1,flag=0;
if(M.mu!=N.mu||M.nu!=N.nu) {printf("矩阵大小不同,无法运算\n"); return 0;}
else
{
Q.mu=M.mu;Q.nu=M.nu; //设置Q的行列数
for(int i=1;i<=M.tu;i++)
{ for(int j=1;j<=N.tu;j++)
{
if(M.data[i].i==N.data[j].i&&M.data[i].j==N.data[j].j)
{
Q.data[s].e=M.data[i].e+N.data[j].e; Q.data[s].i=M.data[i].i; Q.data[s].j=M.data[i].j;
++s;//计数
flag=1;
}//if
}//for j
if(flag==0)
{
Q.data[s].e=M.data[i].e; Q.data[s].i=M.data[i].i; Q.data[s].j=M.data[i].j;
s++;
}
}//for i
for(int i=1;i<=N.tu;i++)
{ flag=0;
for(int j=1;j<=M.tu;j++)
{
if(N.data[i].i==M.data[j].i&&N.data[i].j==M.data[j].j)
flag=1;
}
if(flag==0)
{
Q.data[s].e=N.data[i].e; Q.data[s].i=N.data[i].i; Q.data[s].j=N.data[i].j;
s++;
}//if
}
}//else
Q.tu=s-1;
return 1;
}
int SubSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{ //用矩阵Q返回矩阵M减去矩阵N的值
int s=1,flag=0;
if(M.mu!=N.mu||M.nu!=N.nu) {printf("矩阵大小不同,无法运算\n"); return 0;}
else
{
Q.mu=M.mu;Q.nu=M.nu; //设置Q的行列数
for(int i=1;i<=M.tu;i++)
{ for(int j=1;j<=N.tu;j++)
{
if(M.data[i].i==N.data[j].i&&M.data[i].j==N.data[j].j)
{
Q.data[s].e=M.data[i].e-N.data[j].e; Q.data[s].i=M.data[i].i; Q.data[s].j=M.data[i].j;
++s;//计数
flag=1;
}//if
}//for j
if(flag==0)
{
Q.data[s].e=M.data[i].e; Q.data[s].i=M.data[i].i; Q.data[s].j=M.data[i].j;
++s;
}
}//for i
for(int i=1;i<=N.tu;i++)
{ flag=0;
for(int j=1;j<=M.tu;j++)
{
if(N.data[i].i==M.data[j].i&&N.data[i].j==M.data[j].j)
flag=1;
}
if(flag==0)
{
Q.data[s].e=-N.data[i].e; Q.data[s].i=N.data[i].i; Q.data[s].j=N.data[i].j;
++s;
}//if
}
}//else
Q.tu=s-1;
return 1;
}
int TransposeSMatrix(TSMatrix M,TSMatrix &T)
{ //求矩阵M的转置矩阵T
T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if(T.tu)
{
int q=1;
for(int col=1;col<=M.nu;++col)
for(int 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;
}
}
return 1;
}
int MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{ //用Q返回矩阵M和矩阵N的积(Q=M*N)
TSMatrix T; int m=1,flag=0;
Q.data[m].e=0;
if(M.nu!=N.mu){printf("不能相乘\n"); return 0;}
else
{
Q.mu=M.mu; Q.nu=N.nu;
TransposeSMatrix(N,T);
for(int cola=1;cola<=M.mu;cola++)
{
for(int colb=1;colb<=T.mu;colb++){
for(int s=1;s<=M.tu;s++)
{
if(M.data[s].i==cola)
{
for(int k=1;k<=T.tu;k++)
{
if(T.data[k].i==colb)
{
if(T.data[k].j==M.data[s].j)
{
Q.data[m].e+=T.data[k].e*M.data[s].e;
Q.data[m].i=cola; Q.data[m].j=colb;
}
}
else continue;
}//for T.tu
}//for colb
}
if(Q.data[m].e!=0) {++m;Q.data[m].e=0;} //Q.tu加一
}
}
}
Q.tu=m-1;
return 1;
}
int main()
{
TSMatrix M,N,Q;
printf("矩阵运算\n");
printf("加法\n");
printf("输入矩阵一\n");
CreateSMatrix(M);
printf("输入矩阵二\n");
CreateSMatrix(N);
AddSMatrix(M,N,Q);
printf("结果\n");
disp(Q);
printf("减法\n");
printf("输入矩阵一\n");
CreateSMatrix(M);
printf("输入矩阵二\n");
CreateSMatrix(N);
SubSMatrix(M,N,Q);
printf("结果\n");
disp(Q);
printf("乘法\n");
printf("输入矩阵一\n");
CreateSMatrix(M);
printf("输入矩阵二\n");
CreateSMatrix(N);
MultSMatrix(M,N,Q);
printf("结果\n");
disp(Q);
}