#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;
}
``
c语言编写算法实现三元组表表示的两个稀疏矩阵的加法

原文地址: https://www.cveoy.top/t/topic/fHpD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录