稀疏矩阵加法_数据结构实验题(稀疏矩阵加法)


题目描述:

81eef454f86e135da78de7fa1cb9d719.png

50695847e64b83fb7cfe25e51b708a39.png


思路:

  先使用一个结构体对稀疏矩阵进行压缩存储
typedef struct{    int row, col;    int elem;} Array;
之后用归并的思想,将A矩阵与B矩阵相加的结果存放在C矩阵中
if (A[i].row //若A行号小于B行号,则将A放入C        {            C[k++] = A[i++];        }        else if (A[i].row > B[j].row)//若A行号大于B行号,则存B        {            C[k++] = B[j++];        }        else  //若都不是,则代表A行号等于B行号        {            if (A[i].col == B[j].col) //若A列号再等于B列号            {                         //值要相加                C[k].col = A[i].col;                C[k].row = A[i].row;                C[k++].elem = A[i++].elem + B[j++].elem;            }            //否则按照列号从小到大存进C            else if (A[i].col                 C[k++] = A[i++];            else                C[k++] = B[j++];        }
若A,B矩阵还有剩余元素,全部放入C即可
while (i < lenA)    {        C[k++] = A[i++];    }    while (j < lenB)    {        C[k++] = B[j++];    }

完整代码如下:
#include #include using namespace std;typedef struct{    int row, col;    int elem;} Array;int main(){    Array A[100];    Array B[100];    Array C[100];    int m, n;    cin >> m >> n;    int n1, n2;    cin >> n1;    int i = 0;    int j = 0;    while (n1--)    {        int r, c, e;        cin >> r >> c >> e;        A[i].row = r;        A[i].col = c;        A[i].elem = e;        i++;    }    cin >> n2;    while (n2--)    {        int r, c, e;        cin >> r >> c >> e;        B[j].row = r;        B[j].col = c;        B[j].elem = e;        j++;    }    int lenA = i;    int lenB = j;    i = 0;    j = 0;    int k = 0;    while (i < lenA && j < lenB)    {        if (A[i].row < B[j].row)        {            C[k++] = A[i++];        }        else if (A[i].row > B[j].row)        {            C[k++] = B[j++];        }        else        {            if (A[i].col == B[j].col)            {                C[k].col = A[i].col;                C[k].row = A[i].row;                C[k++].elem = A[i++].elem + B[j++].elem;            }            else if (A[i].col < B[j].col)                C[k++] = A[i++];            else                C[k++] = B[j++];        }    }    while (i < lenA)    {        C[k++] = A[i++];    }    while (j < lenB)    {        C[k++] = B[j++];    }    int lenc = k;    int cnt = 0;    for (k = 0; k < lenc; k++)    {        if (fabs(C[k].elem) > 0.1)            cnt++;    }    cout << cnt << endl;    for (k = 0; k < lenc; k++)    {        if (fabs(C[k].elem) > 0.1)        {            cout << C[k].row << " " << C[k].col << " " << C[k].elem << endl;        }    }    return 0;}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值