C语言以三元组表存贮的稀疏矩阵A,B,两个矩阵均为10X10矩阵,非零元个数分别为m 和n。试完成程序,完成A+B。【样例输入】 2 1 1 2 3 1 3 4 1 3 3 【样例输出】 1 2 3 1 3 7
时间: 2024-05-27 11:12:18 浏览: 2
#include<stdio.h>
#define M 10
#define N 10
#define Max 100
typedef struct{
int x;//行
int y;//列
int data;//值
}Triple;
void print(int a[M][N],int m,int n){
int i,j;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}
void Transpose(Triple A[],Triple B[],int m,int n){
//A为原矩阵,B为转置后的矩阵
int num[N]={0};//num[j]表示第j列非零元个数
int cpot[N]={0};//cpot[j]表示第j列第一个非零元在B中的位置
int i,j,t;
B[0].x=n;//行列互换
B[0].y=m;
B[0].data=A[0].data;
for(i=1;i<=m;i++){
num[A[i].y]++;
}
for(i=1;i<n;i++){
cpot[i]=cpot[i-1]+num[i-1];
}
for(i=1;i<=m;i++){
j=cpot[A[i].y]++;
B[j].x=A[i].y;
B[j].y=A[i].x;
B[j].data=A[i].data;
}
}
void Mult(Triple A[],Triple B[],Triple C[],int m,int n,int t){
//A为稀疏矩阵A,B为稀疏矩阵B,C为稀疏矩阵C
int i,j,k,p=1,q=1,sum=0;
Triple Bt[Max];
Transpose(B,Bt,n,t);//将B矩阵转置
for(i=1;i<=m;i++){
j=A[i].x;//A的行号
while(j==A[i].x){
k=Bt[p].x;//B的行号
while(k==Bt[p].x){
if(A[i].y==Bt[p].y){
sum+=A[i].data*Bt[p].data;//累加
q=p;
}
p++;
}
if(q!=1){
C[++C[0].x].x=j-1;
C[C[0].x].y=Bt[q].x-1;
C[C[0].x].data=sum;
sum=0;
}
k=Bt[p].x;
}
i=p;
p=q;
}
}
int main(){
Triple A[Max],B[Max],C[Max];
int m,n,i;
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++){
scanf("%d%d%d",&A[i].x,&A[i].y,&A[i].data);
}
for(i=1;i<=n;i++){
scanf("%d%d%d",&B[i].x,&B[i].y,&B[i].data);
}
C[0].x=0;
Mult(A,B,C,m,n,m);
for(i=1;i<=C[0].x;i++){
printf("%d %d %d\n",C[i].x,C[i].y,C[i].data);
}
return 0;
}
相关推荐
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)