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
相关产品推荐
相关产品推荐

