[求助]怎么进行调用并输出矩阵c,代码还可以优化吗!
大家好,下面代码是我用来实现两个稀疏矩阵的相加运算,
我先input()读入两个矩阵,然后再把这两个矩阵显示出来!
其中Status AddTSM是实现两个矩阵相加的,
但是调用不成功!!
还有怎么把相加后的矩阵c输出来呢!
还有我想把输出这个功能也单独提取出来,就是可以在输出举证a,b,c时分别调用,而不是每次都写一次!
我弄了很久也没有结果,
基础太差了!
希望大家帮帮!谢谢!
//#include "stdafx.h"
#include<stdio.h>
#define MAXSIZE 100
typedef int Status ;
typedef int ElemType;
typedef struct {
int i,j; // 行下标,列下标
ElemType e; // 非零元素值
}Triple;
typedef struct {
Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用
int mu,nu,tu; // 矩阵的行数、列数和非零元个数
}TSMatrix;
Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C)
///三元组表示的稀疏矩阵加法: C=A+B
{
int n=1,m=1,k=1;
ElemType temp;
if(A.mu==B.mu&&A.nu==B.nu)
{
while(m<=A.tu&&n<=B.tu)
{
//若A当前元素的行号等于B当前元素的行号,则比较其列号,将较小列的元素
//存入C中,如果列号也相等,则将对应的元素值相加后存入C中
if(A.data[m].i==B.data[n].i)
{
if(A.data[m].j<B.data[n].j)
{
C.data[k].i=A.data[m].i;
C.data[k].j=A.data[m].j;
C.data[k].e=A.data[m].e;
k++;
m++;
}
else if(A.data[m].j>B.data[n].j)
{
C.data[k].i=B.data[n].i;
C.data[k].j=B.data[n].j;
C.data[k].e=B.data[n].e;
k++;
n++;
}
else
{
temp=A.data[m].e+B.data[n].e;
if(temp!=0)//不为0才添加到C中
{
C.data[k].i=A.data[m].i;
C.data[k].j=A.data[m].j;
C.data[k].e=temp;
k++;
}
m++;
n++;
}
}
//若A当前元素的行号小于B当前元素的行号,则将A的元素存入C中
else if(A.data[m].i<B.data[n].i)
{
C.data[k].i=A.data[m].i;
C.data[k].j=A.data[m].j;
C.data[k].e=A.data[m].e;
k++;
m++;
}
//若A当前元素的行号大于B当前元素的行号,则将B的元素存入C中
else
{
C.data[k].i=B.data[n].i;
C.data[k].j=B.data[n].j;
C.data[k].e=B.data[n].e;
k++;
n++;
}
}
//把剩余部分元素存入C中
if(m>A.tu&&n<=B.tu)
for( ;n<=B.tu;n++)
{
C.data[k].i=B.data[n].i;
C.data[k].j=B.data[n].j;
C.data[k].e=B.data[n].e;
k++;
}
if(n>B.tu&&m<=A.tu)
for( ;m<=A.tu;m++)
{
C.data[k].i=A.data[m].i;
C.data[k].j=A.data[m].j;
C.data[k].e=A.data[m].e;
k++;
}
C.mu=A.mu;
C.nu=A.nu;
C.tu=k-1;
return true;
}
else
return false;
}
input()
{
int k;
TSMatrix A,B;
int a[100][100]={0};
int b[100][100]={0};
printf("输入稀疏矩阵A的行数,列数和非零元个数:");
scanf("%d %d %d",&A.mu,&A.nu,&A.tu);
for(k=1;k<=A.tu;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].e);
}
printf("输入稀疏矩阵B的行数,列数和非零元个数:");
scanf("%d %d %d",&B.mu,&B.nu,&B.tu);
for(k=1;k<=B.tu;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&B.data[k].i,&B.data[k].j,&B.data[k].e);
}
/*
if(A.mu!=B.mu||A.nu!=B.nu)
{
printf("输入错误:A与B的行数或列数不相同,请重新输入\n");
return;
}*/
for(k=1;k<=A.tu;k++)
{
a[A.data[k].i][A.data[k].j]=A.data[k].e;
}
printf("A输入为:\n");
for(k=1;k<=A.mu;k++)
{
for(int l=1;l<=A.nu;l++)
printf("%d ",a[k][l]);
printf("\n");
}
for(k=1;k<=B.tu;k++)
{
b[B.data[k].i][B.data[k].j]=B.data[k].e;
}
printf("B输入为:\n");
for(k=1;k<=B.mu;k++)
{
for(int l=1;l<=B.nu;l++)
printf("%d ",b[k][l]);
printf("\n");
}
}
int main(int argc, char* argv[])
{
input();
Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C);
return 0;
}