试编写一算法实现两个稀疏矩阵相加(C=A+B),要求稀疏矩阵用三元组表示。
算法思路:
当三元组A和B均未结束时
(1)若 A、B中当前三元组行、列号相同,则将A、B对应元素值相加 ,赋与C矩阵;
(2)若A中当前三元组的行号小于B,或A中当前三元组的行号与B相同,但A中列号小于 B,则将A当前三元组赋与C矩阵;
(3)若B中当前三元组的行号小于A,或B中当前三元组的行号与A相同,但B中列号小于A,则将B当前三元组赋与C矩阵;
当B处理结束,而A中尚有未处理完的三元组时,则将A中剩余三元组全部赋与C矩阵 ;
当A处理结束,而B中尚有未处理完的三元组时,则将B中剩余三元组全部赋与C矩阵 。
#include <stdio.h>
#include <stdlib.h>
#define SMAX 16 //非零元素个数
typedef int datatype;
typedef struct
{
int i;
int j;
datatype val;
}node;
typedef struct
{
node data[SMAX];
int m; //行数
int n; //列数
int t; //非零元素个数
}spmatrix;
int main()
{
spmatrix *a, *b, *c;
spmatrix * Add(spmatrix *AA, spmatrix *BB);
spmatrix * InitTriple();
void Out(spmatrix *S);
printf("初始化第一个矩阵:\n");
a = InitTriple();
printf("第一个矩阵为:\n");
Out(a);
printf("初始化第二个矩阵:\n");
b = InitTriple();
printf("第二个矩阵为:\n");
Out(b);
printf("两个矩阵相加得:\n");
c = Add(a, b);
Out(c);
printf("两个矩阵相加得三元组:\n");
printf("m=%d,n=%d,t=%d",c->m,c->n,c->t);
return 0;
}
spmatrix * Add(spmatrix *A, spmatrix *B)
{
void Out(spmatrix *S);
spmatrix *C;
int i = 0;
int j = 0;
int t = 0;
C = (spmatrix *)malloc(sizeof(spmatrix));
if (!C)
{
printf("分配空间失败!\n");
exit(-1);
}
C->m = A->m;
C->n = A->n;
if (A->m != B->m || A->n != B->n)
{
printf("矩阵形状不一致!无法进行加法运算!\n");
}
while (i < A->t && j < B->t)
{
if (A->data[i].i > B->data[j].i)
{
C->data[t].i = B->data[j].i;
C->data[t].j = B->data[j].j;
C->data[t].val = B->data[j].val;
j++;
t++;
}
else if (A->data[i].i < B->data[j].i)
{
C->data[t].i = A->data[i].i;
C->data[t].j = A->data[i].j;
C->data[t].val = A->data[i].val;
i++;
t++;
}
else
{
if (A->data[i].j < B->data[j].j)
{
C->data[t].i = A->data[i].i;
C->data[t].j = A->data[i].j;
C->data[t].val = A->data[i].val;
i++;
t++;
}
else if (A->data[i].j > B->data[j].j)
{
C->data[t].i = A->data[i].i;
C->data[t].j = A->data[i].j;
C->data[t].val = A->data[i].val;
i++;
t++;
}
else
{
C->data[t].i = A->data[i].i;
C->data[t].j = A->data[i].j;
C->data[t].val = A->data[i].val + B->data[j].val;
j++;
i++;
t++;
}
}
}
while (i < A->t)
{
C->data[t].i = A->data[i].i;
C->data[t].j = A->data[i].j;
C->data[t].val = A->data[i].val;
i++;
t++;
}
while (j < B->t)
{
C->data[t].i = B->data[j].i;
C->data[t].j = B->data[j].j;
C->data[t].val = B->data[j].val;
j++;
t++;
}
C->t = t;
return C;
}
spmatrix * InitTriple()
{
int i;
spmatrix* S;
S = (spmatrix*)malloc(sizeof(spmatrix));
if (!S)
{
printf("分配空间失败!\n");
exit(-1);
}
printf("请输入矩阵的行数和列数(m,n):\n");
scanf("%d,%d", &S->m, &S->n);
//printf("%d,%d", S->m, S->n);
getchar();
printf("请输入矩阵非零元的个数:\n");
//getchar();
scanf("%d", &S->t);
//printf("%d", S->t);
for (i = 1; i <= S->t; i++)
{
printf("请输入%d个非零元素的行数,列数和值(m,n,t):\n", i);
scanf("%d,%d,%d", &S->data[i - 1].i, &S->data[i - 1].j, &S->data[i - 1].val);
}
return S;
}
void Out(spmatrix *S)
{
int i;
printf("m n val\n");
for (i = 0; i < S->t; i++)
{
printf("%d %d %d\n", S->data[i].i, S->data[i].j, S->data[i].val);
}
}