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

如何从存储稀疏矩阵的链表中获取矩阵尺寸并正确打印?

问题根因

1. insert_value调用参数顺序错误

你dump输出的row/col值1073741824是浮点数1.0的二进制数据按int类型解析的结果,说明你插入数据时把浮点数数值、行号、列号的参数顺序传反了:把float值传给了int类型的行/列参数,把行/列号传给了float参数,导致所有节点存储的行列数、数值全部错误。

比如你想插入(行0,列0,值1),错误调用写为insert_value(m, 0, 0, 1),正确调用应为insert_value(m, 1.0f, 0, 0)。

2. 节点匹配逻辑错误

print_matrix中查找对应行列节点的判断逻辑错误:

// 错误:只要行或列任意一个匹配就停止遍历,会匹配到错误节点
while(aux != NULL && aux->row != i && aux->col != j)

正确逻辑是行和列同时匹配才停止,修改为:

while(aux != NULL && !(aux->row == i && aux->col == j))

3. 数组越界访问

你遍历得到的r是最大行号、c是最大列号(从0开始计数),因此矩阵实际有r+1行、c+1列,但你定义的VLA数组长度是[r][c],循环又使用了i<=r、j<=c,会触发数组越界,直接导致程序崩溃闪退。

4. 打印格式符错误

你使用的%2.f会省略小数点后的部分,不符合你要求的0.0输出格式,需要调整格式符。


修复方案

修正insert_value调用顺序

以插入3x3矩阵1-9的测试场景为例,正确的调用写法:

Matrix* m = create_matrix();
int cnt = 1;
for(int i=0; i<3; i++){
    for(int j=0; j<3; j++){
        insert_value(m, (float)cnt++, i, j);
    }
}

修正print_matrix函数

int print_matrix(Matrix* m){
    if(empty_matrix(m)) return 0;
    int max_r = 0, max_c = 0;
    node *n = *m;
    // 先获取最大行列号
    while(n != NULL){
        if(n->row > max_r) max_r = n->row;
        if(n->col > max_c) max_c = n->col;
        n = n->next;
    }
    // 数组长度按实际行列数定义
    float matrix[max_r + 1][max_c + 1];
    for(int i = 0; i <= max_r; i++){
        for(int j = 0; j <= max_c; j++){
            node *aux = *m;
            // 修正匹配逻辑
            while(aux != NULL && !(aux->row == i && aux->col == j)){
                aux = aux->next;
            }
            matrix[i][j] = aux ? aux->value : 0.0f;
            // 修正打印格式,对齐输出
            printf("%.1f  ", matrix[i][j]);
        }
        printf("\n");
    }
    return 1;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:15:06