稀疏矩阵运算器 c语言,数据结构——稀疏矩阵运算器(C语言)

/*****************稀疏矩阵运算器 ****************/

#include

#include

#define OK 1

#define TRUE 1

#define ERROR 0

#define FALSE 0

#define MAX_SIZE 100

typedef struct{ //构造三元组

int x;

int y;

int e;

}Triad;

typedef struct {

int mrow,mcol,ms;

Triad data[MAX_SIZE];

}Rtriad;

void Input(Rtriad &S){ //以三元组方式输入矩阵

printf("请输入行,列(row col):");

scanf("%d%d",&S.mrow,&S.mcol);

printf("请以行序为主序,以三元组的方式输入矩阵元素,'-1 -1 -1'表示结束:\n");

int x,y,z;

scanf("%d%d%d",&x,&y,&z);

S.ms=0;

while(!(x==-1&&y==-1&&z==-1)){ //长度为S.ms+1,从0开始到S.ms

S.data[S.ms].x=x;

S.data[S.ms].y=y;

S.data[S.ms].e=z;

S.ms++;

scanf("%d%d%d",&x,&y,&z);

}

S.ms--;

}

void Add(Rtriad S1,Rtriad S2,Rtriad &S3){ //矩阵相加

if(S1.mcol!=S2.mcol||S1.mrow!=S2.mrow){

printf("ERROR!!!\n");

return ;

}

S3.mcol=S1.mcol ;

S3.mrow=S1.mrow ;

S3.ms=0;

int row,col,s,x,y,z;

for(row=1;row<=S3.mrow;row++){

for(col=1;col<=S3.mcol;col++){

z=0;

for(s=0;s<=S1.ms;s++){

if(S1.data[s].x==row&&S1.data[s].y==col){

S3.data[S3.ms].x=row;

S3.data[S3.ms].y=col;

S3.data[S3.ms].e=S1.data[s].e;

z++;

}

}

for(s=0;s<=S2.ms;s++){

if(S2.data[s].x==row&&S2.data[s].y==col){

S3.data[S3.ms].x=row;

S3.data[S3.ms].y=col;

if(z==0)

S3.data[S3.ms].e=S2.data[s].e;

else

S3.data[S3.ms].e+=S2.data[s].e;

z++;

}

}

if(z!=0)

S3.ms++;

}

}

int m=0;

for(int t=0;t<=S3.ms;t++){

if(S3.data[t].e==0){ //删除

for(int i=t+1;i

S3.data[i-1]=S3.data[i];

}

m++;

}

}

S3.ms-=m;

}

void Printf(Rtriad S){ //打印矩阵

int a[S.mrow][S.mcol];

for(int i=0;i

for(int j=0;j

a[i][j]=0;

for(int k=0;k<=S.ms;k++)

a[S.data[k].x-1][S.data[k].y-1]=S.data[k].e;

//printf("\n\n矩阵为:\n");

for(int i=0;i

for(int j=0;j

printf("%-2d ",a[i][j]);

printf("\n");

}

}

void Sub(Rtriad S1,Rtriad S2,Rtriad &S3){ //矩阵相减

for(int i=0;i<=S2.ms;i++)

S2.data[i].e*=-1;

Add(S1,S2,S3);

for(int i=0;i<=S2.ms;i++)

S2.data[i].e*=-1;

}

void Mult(Rtriad S1,Rtriad S2,Rtriad &S3){ //矩阵相乘

if(S1.mcol!=S2.mrow){

printf("ERROR!!!\n");

return ;

}

S3.mrow=S1.mrow;

S3.mcol=S2.mcol;

S3.ms=0;

int s1[S1.mrow][S1.mcol];

int s2[S2.mrow][S2.mcol];

int s3[S3.mrow][S3.mcol];

for(int i=0;i

for(int j=0;j

s1[i][j]=0;

for(int i=0;i

for(int j=0;j

s2[i][j]=0;

for(int i=0;i

for(int j=0;j

s3[i][j]=0;

for(int k=0;k<=S1.ms;k++)

s1[S1.data[k].x-1][S1.data[k].y-1]=S1.data[k].e;

for(int k=0;k<=S2.ms;k++)

s2[S2.data[k].x-1][S2.data[k].y-1]=S2.data[k].e;

for(int row=0;row

for(int col=0;col

for(int k=0;k

s3[row][col]+=(s1[row][k]*s2[k][col]);

if(s3[row][col]!=0){

S3.data[S3.ms].x=row+1;

S3.data[S3.ms].y=col+1;

S3.data[S3.ms].e=s3[row][col];

S3.ms++;

}

}

}

}

void Tran(Rtriad &S1,Rtriad &S2){ //矩阵的快速转置

S2.ms=S1.ms;

S2.mcol=S1.mrow;

S2.mrow=S1.mcol;

int num[MAX_SIZE]; //每一列的元素个数 ,从1开始计数

int pos[MAX_SIZE];

for(int col=1;col<=S1.mcol;col++) //初始化num

num[col]=0;

for(int i=0;i<=S1.ms;i++) //给num赋值 ,num从1开始

num[S1.data[i].y]++;

pos[1]=1; //给pos赋值 ,pos从1开始

for(int col=2;col<=S1.mcol;col++)

pos[col]=pos[col-1]+num[col-1];

for(int k=0;k<=S1.ms;k++){ //S1,S2都是从data[0]开始的

int col=S1.data[k].y;

int q=pos[col];

S2.data[q-1].e=S1.data[k].e;

S2.data[q-1].x=S1.data[k].y;

S2.data[q-1].y=S1.data[k].x;

pos[col]++;

}

}

int main(){

printf("/*****************稀疏矩阵运算器 ****************/\n\n");

printf("功能选择:\n1.矩阵相加\n2.矩阵相减\n3.矩阵相乘\n4.矩阵转置\n");

int n;

printf("选择功能:");

scanf("%d",&n);

Rtriad S1,S2,S3;

switch(n){

case 1:

printf("\n请输入矩阵1:\n");

Input(S1);

printf("\n请输入矩阵2:\n");

Input(S2);

Add(S1,S2,S3);

printf("\n结果为:\n");

Printf(S3);

break;

case 2:

printf("\n请输入矩阵1:\n");

Input(S1);

printf("\n请输入矩阵2:\n");

Input(S2);

Sub(S1,S2,S3);

printf("\n结果为:\n");

Printf(S3);

break;

case 3:

printf("\n请输入矩阵1:\n");

Input(S1);

printf("\n请输入矩阵2:\n");

Input(S2);

Mult(S1,S2,S3);

printf("\n结果为:\n");

Printf(S3);

break;

case 4:

printf("\n请输入矩阵1:\n");

Input(S1);

Tran(S1,S2);

printf("\n结果为:\n");

Printf(S3);

break;

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值