稀疏矩阵加法运算
对于矩阵的加法运算,只有两个“加数矩阵”为同型矩阵才能进行。两个·同型矩阵相加,其“和矩阵”仍为同型矩阵,其各个位置上的值等于两个“加数矩阵”对应位置的元素之和。
#include<stdio.h>
#define MAXSIZE 1000
typedef struct node
{
int row,col,value; //行、列、值
}Triple;
typedef struct lnode
{
Triple data[MAXSIZE]; //非零元素信息
int m,n,nums; //矩阵总行数、列数、非零元素个数
}TSMatrix;
void Input(TSMatrix *tm); //矩阵输入
void Print(TSMatrix tm); //矩阵输出
int MAdd(TSMatrix *c,TSMatrix a,TSMatrix b); //矩阵加法
void Transpose(TSMatrix A,TSMatrix *B); //矩阵转置
int main()
{
TSMatrix A,B,C,D;
Input(&A);
Input(&C);
Transpose(A,&B);
printf("A转置后矩阵:\n");
Print(B);
if (MAdd(&D,A,C))
{
printf("A、C相加后矩阵:\n");
Print(D);
}
return 0;
}
void Input(TSMatrix *tm)
{
int i;
printf("输入总行数、总列数、非零元素个数:\n");
scanf("%d %d %d",&(tm->m),&(tm->n),&(tm->nums));
for ( i = 0; i < tm->nums; i++)
{
printf("请输入行、列、值:\n");
scanf("%d %d %d",&(tm->data[i].row),&(tm->data[i].col),&(tm->data[i].value));
}
}
void Print(TSMatrix tm)
{
int i;
printf("行列数:%d %d %d\n",tm.m,tm.n,tm.nums);
for ( i = 0; i < tm.nums; i++)
{
printf("%d %d %d\n",tm.data[i].row,tm.data[i].col,tm.data[i].value);
}
}
void Transpose(TSMatrix A,TSMatrix *B)
{
int i,j,k;
B->m = A.n;
B->n = A.m;
B->nums = A.nums;
if (B->nums>0)
{
j = 0;
for ( k = 0; k < A.n; k++)
{
for ( i = 0; i < A.nums; i++)
{
if (A.data[i].col==k)
{
B->data[j].col = A.data[i].row;
B->data[j].row = A.data[i].col;
B->data[j].value = A.data[i].value;
j++;
if(j > A.nums) return;
}
}
}
}
}
int MAdd(TSMatrix *c,TSMatrix a,TSMatrix b)
{
if (a.m!=b.m||a.n!=b.n)
return 0; /* A,B行列数不相等 */
int i,j;
i=0; j=0; /* i,j分别指向两个矩阵三元表下标 */
c->m = a.m;
c->n = a.n;
c->nums = 0;
while (i<a.nums&&j<b.nums)
{
if (a.data[i].row<b.data[j].row) /* 情况1 */
c->data[c->nums++]=a.data[i++];
else if (a.data[i].row>b.data[j].row) /* 情况2 */
c->data[c->nums++]=b.data[j++];
else /* 3:行相同位置 */
{
if (a.data[i].col<b.data[j].col) /* 情况3.1 */
c->data[c->nums++]=a.data[i++];
else if (a.data[i].col>b.data[j].col) /* 情况3.2 */
c->data[c->nums++]=b.data[j++];
else /* 列相同位置 */
{
int sum = a.data[i].value + b.data[j].value;
if (sum)
{
c->data[c->nums] = a.data[i];
c->data[c->nums].value = sum;
c->nums++;
}
i++; j++;
}
}
}
while (i < a.nums) c->data[c->nums++] = a.data[i++];
while (j < b.nums) c->data[c->nums++] = b.data[j++];
return 1;
}