如何从存储稀疏矩阵的链表中获取矩阵尺寸并正确打印?
问题根因
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
相关产品推荐
相关产品推荐

