📄 shujujiegousuanfa.cpp
字号:
#include <stdio.h>
#include <malloc.h>
#define MAX 1000
typedef struct
{
int row;
int col;
int val;
}tb;
typedef struct
{
int m,n,t;
tb data[MAX];
} TB;
TB *third( int a[4][4])
//将数组形式的存储的矩阵转化为三元组表示
{
int i,j,k=0;
TB *c;
c=(TB *)malloc(sizeof(TB));
c->m=4;
c->n=4;
c->t=0 ;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(a[i][j]!=0)
{ k++;
c->data[k].row=i+1;
c->data[k].col=j+1;
c->data[k].val=a[i][j];
c->t++;
}
}
return c;
}
void print(TB *c) //输出矩阵的三元组表
{
int i=1;
if(c)
{
printf("所对应的三元组表为:\n");
printf(" k row col val\n");
printf("%3d%3d%4d%4d\n",i-1,c->m,c->n,c->t);
while(i<=c->t)
printf("%3d%3d%4d%4d\n",i++,c->data[i].row,c->data[i].col,c->data[i].val);
}
}
TB *zhuangzhi(TB *c) //矩阵的转置
{
TB *p;
p=(TB *)malloc(sizeof(TB));
int i,j,k=0;
p->m=c->n;
p->n=c->m;
p->t=c->t;
for(i=1;i<=c->n;i++)
for(j=1;j<=c->t;j++)
{if(c->data[j].col==i)
{
k++;
p->data[k].row=c->data[j].col;
p->data[k].col=c->data[j].row;
p->data[k].val=c->data[j].val;
}
}
return p;
}
TB *jia(TB *A,TB *B) //矩阵的加法
{
TB *c;
int i=1,j=1,k=0;
c=(TB*)malloc(sizeof(TB));
c->m=A->m;
c->n=A->n;
if(A->m==B->m&&A->n==B->n)
{ while(i<=A->t&&j<=B->t)
{
if(A->data[i].row==B->data[j].row)
if(A->data[i].col==B->data[j].col)
{
k++;
c->data[k].row=A->data[i].row;
c->data[k].col=A->data[i].col;
c->data[k].val=A->data[i].val+B->data[j].val;
i++;j++;
}
else
if(A->data[i].col<B->data[j].col)
{
k++;
c->data[k].row=A->data[i].row;
c->data[k].col=A->data[i].col;
c->data[k].val=A->data[i].val;
i++;
}
else
{
k++;
c->data[k].row=B->data[j].row;
c->data[k].col=B->data[j].col;
c->data[k].val=B->data[j].val;
j++;
}
else
if(A->data[i].row<B->data[j].row)
{
k++;
c->data[k].row=A->data[i].row;
c->data[k].col=A->data[i].col;
c->data[k].val=A->data[i].val;
i++;
}
else
{
k++;
c->data[k].row=B->data[j].row;
c->data[k].col=B->data[j].col;
c->data[k].val=B->data[j].val;
j++;
}
}
c->t=k;
return c;
}
else
{
printf("所输入的矩阵无法进行加法运算。\n");
return NULL;
}
}
TB *chengfa(TB *A,TB *B) //矩阵的乘法
{
TB *c;
int i,j,k=0,t,p,q,s;
c=(TB*)malloc(sizeof(TB));
if(A->n==B->m)
{for(t=1;t<=A->m;t++)
for(p=1;p<=B->n;p++)
{s=0;
for(i=1;i<=A->t;i++)
for(j=1;j<=B->t;j++)
if(A->data[i].row ==t&&B->data[j].col ==p)
for(q=1;q<=A->n;q++)
if(A->data[i].col ==q&&B->data[j].row ==q)
s=s+A->data[i].val*B->data[j].val;
if(s!=0)
{
k++;
c->data[k].row=t;
c->data[k].col=p;
c->data[k].val=s;
}
}
c->m=A->m;
c->n=B->n;
c->t=k;
return c;
}
else
{
printf("所输入的矩阵无法进行乘法运算。\n");
return NULL;
}
}
int main()
{
int i,j; TB *c,*d,*f;
int a1[4][4]={{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}};
int b1[4][4]={{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}};
printf("矩阵a1:\n");
for (i=0;i<4;i++)
{for (j=0;j<4;j++)
printf("%5d",a1[i][j]);
printf("\n");
}
printf("矩阵b1:\n");
for (i=0;i<=3;i++)
{for (j=0;j<=3;j++)
printf("%5d",b1[i][j]);
printf("\n");}
c=third(a1);
d=third(b1);
f=zhuangzhi(c);
printf("矩阵a1的转置矩阵");
print(f);
printf("a1+b1");
f=jia(c,d);
print(f);
printf("a1*b1");
f=chengfa(c,d);
print(f);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -