You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言稀疏矩阵相加函数add_matrix运行异常,求正确实现方法

问题根源

你现有代码的核心错误集中在add_matrix函数的实现逻辑,同时main函数中结果矩阵的内存申请也有问题:

  • 直接按下标对应A和B的非零元素相加:稀疏矩阵的非零元素存储顺序和位置没有固定对应关系,转置后的B的元素顺序和A完全不匹配,按相同下标相加的逻辑完全不成立
  • 没有给结果矩阵C的row、col字段赋值,也没有正确统计C的非零元素个数terms
  • 给C申请的内存空间不足:两个稀疏矩阵相加后,非零元素最多可达两个矩阵非零元素数之和,你只申请了和A、B相同的num个空间,会出现越界风险

修改方案

1. 调整main函数中C的内存分配

将原来给C分配内存的代码修改为最大可容纳2*num个非零元素:

C.data = (element*)malloc(sizeof(element) * 2 * num);

2. 重写add_matrix函数

正确的稀疏矩阵相加逻辑是按行优先、列次之的顺序遍历两个矩阵的非零元素,按位置匹配后合并:

void add_matrix(SparseMatrix a, SparseMatrix b, SparseMatrix* c)
{
    int i = 0, j = 0, k = 0;
    // 同时遍历A和B的非零元素
    while (i < a.terms && j < b.terms) {
        // A的当前元素位置更靠前
        if (a.data[i].row < b.data[j].row || 
            (a.data[i].row == b.data[j].row && a.data[i].col < b.data[j].col)) {
            c->data[k] = a.data[i];
            i++;
            k++;
        }
        // B的当前元素位置更靠前
        else if (a.data[i].row > b.data[j].row || 
                   (a.data[i].row == b.data[j].row && a.data[i].col > b.data[j].col)) {
            c->data[k] = b.data[j];
            j++;
            k++;
        }
        // 两个元素位置相同,值相加
        else {
            int sum = a.data[i].value + b.data[j].value;
            // 和不为0才存入结果
            if (sum != 0) {
                c->data[k].row = a.data[i].row;
                c->data[k].col = a.data[i].col;
                c->data[k].value = sum;
                k++;
            }
            i++;
            j++;
        }
    }
    // 存入A剩余的非零元素
    while (i < a.terms) {
        c->data[k++] = a.data[i++];
    }
    // 存入B剩余的非零元素
    while (j < b.terms) {
        c->data[k++] = b.data[j++];
    }
    // 更新结果矩阵的非零元素计数
    c->terms = k;
    // 可选优化:将内存缩容到实际使用的大小
    c->data = realloc(c->data, sizeof(element) * c->terms);
}

修改后运行你的测试输入即可得到预期的输出结果。

内容的提问来源于stack exchange,提问作者JeremyChang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:06:01