这一篇写的非常好:大佬文章
#include<stdio.h>
#include<stdlib.h>// 定义三元组结构体
typedef struct{
int i, j; // 该元素的行和列
int val; // 该元素的值
}Triple;// 定义三元组表结构体
typedef struct{
Triple *data; // 三元组数组
int mu, nu, tu; // 最大行数、最大列数、有效元素个数
}TSMatrix;// 创建一个容量为n的三元组表
void CreatTSMatrix(TSMatrix *p, int n){
p->data = (Triple*)malloc(sizeof(Triple)*n);
p->tu = n;
}// 实现两个稀疏矩阵相加的功能,结果存入另一个三元组表中
void AddTwoTSMatrix(TSMatrix *A, TSMatrix *B, TSMatrix *C){
int i=0, j=0, sum, C_tu=0;
while(i<A->tu && j<B->tu){ // 当两个数组均有元素未进行加法运算时
if(A->data[i].i==B->data[j].i && A->data[i].j==B->data[j].j){ // 当两个元素在同一行同一列时
sum = A->data[i].val + B->data[j].val;
if(sum!=0){ // 如果和不为零,则存入结果矩阵中
C->data[C_tu].i = A->data[i].i;
C->data[C_tu].j = A->data[i].j;
C->data[C_tu].val = sum;
C_tu++;
}
i++; // 指向下一个元素
j++;
}
else if(A->data[i].i < B->data[j].i){ // A中的元素在B中没有
C->data[C_tu].i = A->data[i].i;
C->data[C_tu].j = A->data[i].j;
C->data[C_tu].val = A->data[i].val;
C_tu++;
i++;
}
else if(A->data[i].i > B->data[j].i){ // B中的元素在A中没有
C->data[C_tu].i = B->data[j].i;
C->data[C_tu].j = B->data[j].j;
C->data[C_tu].val = B->data[j].val;
C_tu++;
j++;
}
else if(A->data[i].j < B->data[j].j){ // 当两个元素在同一行,A的元素在B的元素前面
C->data[C_tu].i = A->data[i].i;
C->data[C_tu].j = A->data[i].j;
C->data[C_tu].val = A->data[i].val;
C_tu++;
i++;
}
else{ // 当两个元素在同一行,B的元素在A的元素前面
C->data[C_tu].i = B->data[j].i;
C->data[C_tu].j = B->data[j].j;
C->data[C_tu].val = B->data[j].val;
C_tu++;
j++;
}
}// 处理未加法运算的剩余元素
while(i<A->tu){
C->data[C_tu].i = A->data[i].i;
C->data[C_tu].j = A->data[i].j;
C->data[C_tu].val = A->data[i].val;
C_tu++;
i++;
}
while(j<B->tu){
C->data[C_tu].i = B->data[j].i;
C->data[C_tu].j = B->data[j].j;
C->data[C_tu].val = B->data[j].val;
C_tu++;
j++;
}
C->tu = C_tu; // 更新结果矩阵的有效元素个数
}// 打印三元组表
void PrintTSMatrix(TSMatrix *C){
for(int i=0;i<C->tu;i++){
printf("%d %d %d\n",C->data[i].i,C->data[i].j,C->data[i].val);
}
}int main(){
int t1,t2;
scanf("%d %d",&t1,&t2);
TSMatrix *pa,*pb,*pc;
pa = (TSMatrix*)malloc(sizeof(TSMatrix));
pb = (TSMatrix*)malloc(sizeof(TSMatrix));
pc = (TSMatrix*)malloc(sizeof(TSMatrix));
CreatTSMatrix(pa,t1); // 创建第一个三元组表
CreatTSMatrix(pb,t2); // 创建第二个三元组表
CreatTSMatrix(pc,t1+t2); // 创建结果三元组表
for(int i=0;i<t1;i++){ // 输入第一个三元组表中各元素的行、列、值
scanf("%d %d %d",&pa->data[i].i,&pa->data[i].j,&pa->data[i].val);
}
for(int i=0;i<t2;i++){ // 输入第二个三元组表中各元素的行、列、值
scanf("%d %d %d",&pb->data[i].i,&pb->data[i].j,&pb->data[i].val);
}
AddTwoTSMatrix(pa,pb,pc); // 计算结果矩阵
PrintTSMatrix(pc); // 输出结果矩阵
return 0;
}