c语言编写算法实现三元组表表示的两个稀疏矩阵的加法
#include <stdio.h>
#include <stdlib.h>
// 定义三元组结构体
typedef struct
{
int row; // 行号
int col; // 列号
int value; // 值
} Triple;
// 定义稀疏矩阵结构体
typedef struct
{
int rows; // 行数
int cols; // 列数
int nums; // 非零元素个数
Triple *data; // 三元组数据
} SparseMatrix;
// 初始化稀疏矩阵
SparseMatrix *initSparseMatrix(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(nums * sizeof(Triple));
return matrix;
}
// 销毁稀疏矩阵
void destroySparseMatrix(SparseMatrix *matrix)
{
if (matrix != NULL)
{
if (matrix->data != NULL)
{
free(matrix->data);
}
free(matrix);
}
}
// 读取稀疏矩阵
SparseMatrix *readSparseMatrix()
{
int rows, cols, nums;
printf("请输入矩阵的行数、列数和非零元素个数:");
scanf("%d%d%d", &rows, &cols, &nums);
SparseMatrix *matrix = initSparseMatrix(rows, cols, nums);
printf("请输入矩阵的非零元素:\n");
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)
{
printf("稀疏矩阵:\n");
printf("%d\t%d\t%d\n", matrix->rows, matrix->cols, matrix->nums);
for (int i = 0; i < matrix->nums; i++)
{
printf("%d\t%d\t%d\n", matrix->data[i].row, matrix->data[i].col, matrix->data[i].value);
}
}
// 稀疏矩阵加法
SparseMatrix *sparseMatrixAdd(SparseMatrix *matrix1, SparseMatrix *matrix2)
{
if (matrix1->rows != matrix2->rows || matrix1->cols != matrix2->cols)
{
printf("矩阵维数不匹配,无法进行加法运算!\n");
return NULL;
}
SparseMatrix *matrix3 = initSparseMatrix(matrix1->rows, matrix1->cols, 0);
int p1 = 0, p2 = 0;
while (p1 < matrix1->nums && p2 < matrix2->nums)
{
if (matrix1->data[p1].row < matrix2->data[p2].row || (matrix1->data[p1].row == matrix2->data[p2].row && matrix1->data[p1].col < matrix2->data[p2].col))
{
matrix3->data[matrix3->nums].row = matrix1->data[p1].row;
matrix3->data[matrix3->nums].col = matrix1->data[p1].col;
matrix3->data[matrix3->nums].value = matrix1->data[p1].value;
p1++;
}
else if (matrix1->data[p1].row > matrix2->data[p2].row || (matrix1->data[p1].row == matrix2->data[p2].row && matrix1->data[p1].col > matrix2->data[p2].col))
{
matrix3->data[matrix3->nums].row = matrix2->data[p2].row;
matrix3->data[matrix3->nums].col = matrix2->data[p2].col;
matrix3->data[matrix3->nums].value = matrix2->data[p2].value;
p2++;
}
else
{
matrix3->data[matrix3->nums].row = matrix1->data[p1].row;
matrix3->data[matrix3->nums].col = matrix1->data[p1].col;
matrix3->data[matrix3->nums].value = matrix1->data[p1].value + matrix2->data[p2].value;
p1++;
p2++;
}
matrix3->nums++;
}
while (p1 < matrix1->nums)
{
matrix3->data[matrix3->nums].row = matrix1->data[p1].row;
matrix3->data[matrix3->nums].col = matrix1->data[p1].col;
matrix3->data[matrix3->nums].value = matrix1->data[p1].value;
p1++;
matrix3->nums++;
}
while (p2 < matrix2->nums)
{
matrix3->data[matrix3->nums].row = matrix2->data[p2].row;
matrix3->data[matrix3->nums].col = matrix2->data[p2].col;
matrix3->data[matrix3->nums].value = matrix2->data[p2].value;
p2++;
matrix3->nums++;
}
return matrix3;
}
int main()
{
printf("请输入第一个矩阵:\n");
SparseMatrix *matrix1 = readSparseMatrix();
printSparseMatrix(matrix1);
printf("请输入第二个矩阵:\n");
SparseMatrix *matrix2 = readSparseMatrix();
printSparseMatrix(matrix2);
SparseMatrix *matrix3 = sparseMatrixAdd(matrix1, matrix2);
if (matrix3 != NULL)
{
printSparseMatrix(matrix3);
}
destroySparseMatrix(matrix1);
destroySparseMatrix(matrix2);
destroySparseMatrix(matrix3);
return 0;
}
``
原文地址: https://www.cveoy.top/t/topic/fHpD 著作权归作者所有。请勿转载和采集!