使用C语言结构体获取正确矩阵转置的代码问题排查求助
稀疏矩阵转置函数调用失败排查
我编写了一个程序,通过结构体term实现矩阵转置,但无法得到正确结果。编译无错误,反复检查transpose函数逻辑未发现问题,调用函数后转置矩阵输出乱码值。以下是完整代码、实际输出与预期结果:
完整代码
结构体定义
#include <stdio.h> typedef struct { int row; int col; int value; } term;
转置函数
void transpose(term a[], term b[]) { int n, currentb; n = a[0].value; // 非零元素总数 b[0].row = a[0].col; // 转置矩阵行数 = 原矩阵列数 b[0].col = a[0].row; // 转置矩阵列数 = 原矩阵行数 b[0].value = n; if (n > 0) // 非零矩阵处理 { currentb = 1; for (int i = 0; i < a[0].col; i++) // 遍历原矩阵每一列 { for (int j = 1; j <= n; j++) // 遍历所有非零元素 { if (a[j].col == i) { // 将当前列元素存入转置矩阵 b[currentb].row = a[j].col; b[currentb].col = a[j].row; b[currentb].value = a[j].value; currentb++; } } } } }
主函数
int main() { term a[3] = { {1,2,3}, {4,5,6}, {7,8,9} }; term b[3]; // 输出原矩阵 printf("original matrix\n"); for (int i = 0; i < 3; i++) { printf(" %d %d %d\n", a[i].row, a[i].col, a[i].value); } printf("\n\n"); // 调用转置函数(此处错误) void transpose(term a[], term b[]); // 输出转置矩阵 printf("transpose matrix\n"); for (int i = 0; i < 3; i++) { printf(" %d %d %d\n", b[i].row, b[i].col, b[i].value); } return 0; }
实际输出
original matrix 1 2 3 4 5 6 7 8 9 transpose matrix -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460
预期输出
original matrix 1 2 3 4 5 6 7 8 9 transpose matrix 1 4 7 2 5 8 3 6 9
错误分析与修正
1. 未真正调用转置函数
主函数中void transpose(term a[], term b[]);是函数声明,不是函数调用。正确的调用方式是:
transpose(a, b);
2. 稀疏矩阵存储格式错误
你的transpose函数是针对稀疏矩阵的三元组存储格式设计的:
a[0]存储矩阵的总行数、总列数、非零元素总数a[1]到a[n]存储每个非零元素的行号、列号、值
但你初始化的a数组是把每个元素当成普通矩阵的一行,完全不符合函数预期格式。
修正后的完整代码
如果要实现普通3元素矩阵的转置,需要调整逻辑;如果坚持用稀疏矩阵格式,正确代码如下:
#include <stdio.h> typedef struct { int row; int col; int value; } term; void transpose(term a[], term b[]) { int n, currentb; n = a[0].value; b[0].row = a[0].col; b[0].col = a[0].row; b[0].value = n; if (n > 0) { currentb = 1; for (int i = 0; i < a[0].col; i++) { for (int j = 1; j <= n; j++) { if (a[j].col == i) { b[currentb].row = a[j].col; b[currentb].col = a[j].row; b[currentb].value = a[j].value; currentb++; } } } } } int main() { // 稀疏矩阵三元组格式:a[0]=(行数,列数,非零元素数),后续为每个元素的(行,列,值) // 对应原矩阵: // 1 4 // 2 5 // 3 6 term a[7] = { {3,2,6}, {0,0,1}, {0,1,4}, {1,0,2}, {1,1,5}, {2,0,3}, {2,1,6} }; term b[7]; printf("original sparse matrix (三元组格式)\n"); for (int i = 0; i <= a[0].value; i++) { printf(" %d %d %d\n", a[i].row, a[i].col, a[i].value); } printf("\n\n"); // 正确调用转置函数 transpose(a, b); printf("transposed sparse matrix (三元组格式)\n"); for (int i = 0; i <= b[0].value; i++) { printf(" %d %d %d\n", b[i].row, b[i].col, b[i].value); } return 0; }
如果要实现普通矩阵的转置,需重新设计逻辑,比如直接用二维数组或调整结构体存储方式。
内容的提问来源于stack exchange,提问作者SeoYeong Yoon
相关产品推荐
相关产品推荐

