📄 稀疏矩阵.cpp
字号:
#include <stdio.h>
#include"stdlib.h"
#include"conio.h"
#define MaxSize 10
typedef int Datatype;
typedef struct
{ int i,j;
Datatype e;
}Triple;
typedef struct
{ Triple data[MaxSize];
int mu,nu,tu;
}TSMatrix;
//--------------------输出稀疏矩阵----------------//
void ShowTSMatrix(TSMatrix *a)
{
int p,C;
int tu=0;
for(p=0;p<a->mu;p++)
{
for(C=0;C<a->nu;C++)
{
if(a->data[tu].i==p&&a->data[tu].j==C)
{
printf("%d ",a->data[tu].e);
tu++;
}
else printf("0 ");
}//for
printf("\n");
}
}
//-------------------矩阵加算法----------------/
void AddTSMatrix( TSMatrix *A, TSMatrix *B, TSMatrix *C)
{
int p,q,k,l;
C->mu=A->mu;
C->nu=A->nu;
C->tu=0;
C->data[C->tu].e=0; //三元组元素初值
k=0; l=0;
for(p=0;p<C->mu;p++)
for(q=0;q<C->nu;q++)
if(A->data[k].i==p&&A->data[k].j==q)
{
//如果该元素在A表中有
C->data[C->tu].e=0;//初始化三元组值
C->data[C->tu].i=p;
C->data[C->tu].j=q;
C->data[C->tu].e+=A->data[k].e;
if(B->data[l].i==p&&B->data[l].j==q)
{ //同时在B中也有
C->data[C->tu].e+=B->data[l].e;
l++; //指向B表下一元素
}
k++;C->tu++;//指向A表下一元素,C表长增1
}
else if(B->data[l].i==p&&B->data[l].j==q)
{
//若A中无,而B中有该元素
C->data[C->tu].e=0;//初始化三元组值
C->data[C->tu].i=p;
C->data[C->tu].j=q;
C->data[C->tu].e+=B->data[l].e;
l++;C->tu++;//指向B表下一元素,C表长增1
}
}
//-------------------矩阵乘法运算的算法-------------//
void muulityTSMatrix(TSMatrix *A,TSMatrix *B,TSMatrix *Q)
{int ka,kb,row,col;
ka=kb=1; Q->tu=0;
Q->mu=A->mu;
Q->nu=A->nu;
Q->tu=0;
Q->data[Q->tu].e=0; //三元组元素初值
if(A->tu*B->tu!=0){
for(row=0;row<A->mu;row++) {
for(col=0;col<B->nu;col++)
if(A->data[ka].j==B->data[kb].i){
Q->data[Q->tu].i=A->data[ka].i;
Q->data[Q->tu].j=B->data[kb].j;
Q->data[Q->tu].e+=A->data[ka].e*B->data[kb].e;
ka++;
kb++;}
Q->tu++;}
}
}
//------------------矩阵的减法运算----------------//
void Dec_TSMatrix(TSMatrix *A,TSMatrix *B,TSMatrix *D)
{ int p,q,k,l;
D->mu=A->mu;
D->nu=A->nu;
D->tu=0;
D->data[D->tu].e=0; //三元组元素初值
k=0; l=0;
for(p=0;p<D->mu;p++)
for(q=0;q<D->nu;q++)
if(A->data[k].i==p&&A->data[k].j==q)
{
//如果该元素在A表中有
D->data[D->tu].e=0;//初始化三元组值
D->data[D->tu].i=p;
D->data[D->tu].j=q;
D->data[D->tu].e+=A->data[k].e;
if(B->data[l].i==p&&B->data[l].j==q)
{ //同时在B中也有
D->data[D->tu].e-=B->data[l].e;
l++; //指向B表下一元素
}
k++;D->tu++;//指向A表下一元素,C表长增1
}
else if(B->data[l].i==p&&B->data[l].j==q)
{
//若A中无,而B中有该元素
D->data[D->tu].e=0;//初始化三元组值
D->data[D->tu].i=p;
D->data[D->tu].j=q;
D->data[D->tu].e-=B->data[l].e;
l++;D->tu++;//指向B表下一元素,C表长增1
} }
//--------------矩阵转置的算法---------------//
void Transpose(TSMatrix *A,TSMatrix *T)
{T->mu=A->mu;T->nu=A->nu;T->tu=A->tu;
int col=0,t=0,p=0,q=0;
if(T->tu){ int q=0;
for(int col=0;col<A->nu;++col)
for(int p=0;p<A->tu;++p)
if(A->data[p].j==col)
{T->data[q].i=A->data[p].j;
T->data[q].j=A->data[p].i;
T->data[q].e=A->data[p].e;
++q;}
} }
void main()
{
int choice,t;
TSMatrix A,B,C,Q,T,D;
inp: if(A.tu*B.tu==0)
{ printf("A、B为能零矩阵!\n");
getche();system("cls");goto ip;}
ip: printf("---------------------------稀疏矩阵计算器-----------------------------\n");
printf("=========================================================================\n");
printf(" 初始化-1 加法-2 乘法-3 转置-4 减法-5 退出-0\n");
printf("=========================================================================\n");
printf("测试数据为:A:(1,3,4),(2,2,4),(2,4,3),(3,3,9),A.tu=4,A.nu=5,A.mu=5.\n");
printf(" B:(2,3,4),(2,4,5),B.mu=5,B.nu=5,B.tu=2.\n");
printf("操作(0-5):");
scanf("%d",&choice);
printf("\n\n");
switch(choice)
{case 1:
{ printf("输入A矩阵的行数、列数,非零元数目:");
scanf("%d%d%d",&A.mu,&A.nu,&A.tu);
printf("输入非零元的坐标、值(i,j,e):");
for(t=0;t<A.tu;t++)
{scanf("%d%d%d",&A.data[t].i,&A.data[t].j,&A.data[t].e);}
printf("输入B矩阵的行数、列数,非零元数目:");
scanf("%d%d%d",&B.mu,&B.nu,&B.tu);
printf("输入非零元的坐标、值(i,j,e):");
for(t=0;t<B.tu;t++)
{scanf("%d%d%d",&B.data[t].i,&B.data[t].j,&B.data[t].e);}
printf("矩阵A为:\n\n");
ShowTSMatrix(&A);
printf("矩阵B为:\n\n");
ShowTSMatrix(&B);
}
getche();system("cls");
goto inp;
case 2:AddTSMatrix(&A,&B,&C);
printf("矩阵A+B的矩阵为:\n\n");
ShowTSMatrix(&C);
getche();system("cls");
goto inp;
case 3:
muulityTSMatrix(&A,&B,&Q);
printf("矩阵A*B的矩阵为:\n\n");
ShowTSMatrix(&Q);
getche();system("cls");goto inp;
case 4:
printf("矩阵A的转置矩阵为:\n\n");
Transpose(&A,&T);
ShowTSMatrix(&T);
getche();system("cls");
goto inp;
case 5:
printf("矩阵A-B的矩阵为:\n\n");
Dec_TSMatrix(&A,&B,&D);
ShowTSMatrix(&D);
getche();system("cls");
goto inp;
case 0:printf("谢谢使用!再见!\n\n");
exit(0);
default:printf("错误命令!\n\n");
getche();system("cls");
goto inp;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -