题干
已知两个稀疏矩阵A和B,其行数和列数均对应相等,编写一个程序,计算A和B之和,假设稀疏矩阵采用三元组表示。
测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示
1,1,2;2,1,3↵
1,2,5;2,1,-3↵
以文本方式显示
1,1,2;1,2,5↵
1秒 64M 0
我的代码
#include
#include
typedef struct
{
int row; // 行号
int col; // 列号
int value; // 元素值
} Triple;
typedef struct
{
Triple *data; // 三元组表
int rows; // 行数
int cols; // 列数
int nums; // 非零元素个数
} SparseMatrix;
// 创建稀疏矩阵
SparseMatrix* createSparseMatrix(int rows, int cols, int nums)
{
SparseMatrix *matrix = (SparseMatrix*)malloc(sizeof(SparseMatrix));
matrix->rows = rows;
matrix->cols = cols;
matrix->nums = nums;
matrix->data = (Triple*)malloc(sizeof(Triple) * nums);
return matrix;
}
// 释放稀疏矩阵
void freeSparseMatrix(SparseMatrix *matrix)
{
free(matrix->data);
free(matrix);
}
// 读取稀疏矩阵
SparseMatrix* readSparseMatrix()
{
int rows=2, cols=2, nums=2;
SparseMatrix *matrix = createSparseMatrix(rows, cols, nums);
for (int i = 0; i < nums; i++)
{
scanf("%d,%d,%d", &matrix->data[i].row, &matrix->data[i].col, &matrix->data[i].value);
}
return matrix;
}
// 打印稀疏矩阵
void printSparseMatrix(SparseMatrix *matrix)
{
for (int i = 0; i < matrix->nums; i++)
{
printf("%d,%d,%d;", matrix->data[i].row, matrix->data[i].col, matrix->data[i].value);
}
printf("\n");
}
// 计算两个稀疏矩阵的和
SparseMatrix* addSparseMatrix(SparseMatrix *matrixA, SparseMatrix *matrixB)
{
if (matrixA->rows != matrixB->rows || matrixA->cols != matrixB->cols)
{
printf("Error: the size of matrixA and matrixB must be equal!\n") ;
}
SparseMatrix *matrixC = createSparseMatrix(matrixA->rows, matrixA->cols, 0);
int i = 0, j = 0, k = 0;
while (i < matrixA->nums && j < matrixB->nums)
{
if (matrixA->data[i].row < matrixB->data[j].row ||
(matrixA->data[i].row == matrixB->data[j].row && matrixA->data[i].col < matrixB->data[j].col))
{
matrixC->data[k].row = matrixA->data[i].row;
matrixC->data[k].col = matrixA->data[i].col;
matrixC->data[k].value = matrixA->data[i].value;
i++;
}
else if (matrixA->data[i].row > matrixB->data[j].row ||
(matrixA->data[i].row == matrixB->data[j].row && matrixA->data[i].col > matrixB->data[j].col))
{
matrixC->data[k].row = matrixB->data[j].row;
matrixC->data[k].col = matrixB->data[j].col;
matrixC->data[k].value = matrixB->data[j].value;
j++;
}
else
{
matrixC->data[k].row = matrixA->data[i].row;
matrixC->data[k].col = matrixA->data[i].col;
matrixC->data[k].value = matrixA->data[i].value + matrixB->data[j].value;
i++;
j++;
}
k++;
}
while (i < matrixA->nums)
{
matrixC->data[k].row = matrixA->data[i].row;
matrixC->data[k].col = matrixA->data[i].col;
matrixC->data[k].value = matrixA->data[i].value;
i++;
k++;
}
while (j < matrixB->nums)
{
matrixC->data[k].row = matrixB->data[j].row;
matrixC->data[k].col = matrixB->data[j].col;
matrixC->data[k].value = matrixB->data[j].value;
j++;
k++;
}
matrixC->nums = k;
matrixC->nums = nums;
return matrixC;
}
int main()
{
// 读取稀疏矩阵A和B
SparseMatrix *matrixA = readSparseMatrix();
SparseMatrix *matrixB = readSparseMatrix();
// 计算稀疏矩阵A和B的和
SparseMatrix *matrixC = addSparseMatrix(matrixA, matrixB);
// 输出稀疏矩阵C
printSparseMatrix(matrixC);
return 0;
}
出现的问题
main.cpp: In function 'SparseMatrix* addSparseMatrix(SparseMatrix*, SparseMatrix*)':
main.cpp:114:17: error: 'nums' was not declared in this scope
matrixC->nums = nums;
^
main.cpp: In function 'SparseMatrix* readSparseMatrix()':
main.cpp:44:94: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d,%d,%d", &matrix->data[i].row, &matrix->data[i].col, &matrix->data[i].value);
matrixC->nums = nums;
在SparseMatrix* readSparseMatrix()后面的几个函数里,并没有 nums 这个变量。
matrixC->nums = k;
matrixC->nums = nums;
连续2次赋值,那么这两句必然有一句是废话