#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100

typedef struct {
    int i, j;
    int value;
} Triple;

typedef struct {
    Triple data[MAXSIZE + 1];
    int m, n;
    int len;
} TSMatrix;

// 初始化稀疏矩阵
void InitMatrix(TSMatrix *M) {
    M->len = 0;
    printf("请输入稀疏矩阵的行数和列数:\n");
    scanf("%d%d", &M->m, &M->n);
    printf("请输入稀疏矩阵的非零元个数:\n");
    scanf("%d", &M->len);
    printf("请输入稀疏矩阵的三元组:\n");
    for (int i = 1; i <= M->len; i++) {
        scanf("%d%d%d", &M->data[i].i, &M->data[i].j, &M->data[i].value);
    }
}

// 矩阵相加
int Add(TSMatrix A, TSMatrix B, TSMatrix *C) {
    if (A.m != B.m || A.n != B.n) {
        return 0;
    }

    int i = 1, j = 1, k = 0;
    while (i <= A.len && j <= B.len) {
        if (A.data[i].i < B.data[j].i) {
            C->data[++k] = A.data[i++];
        } else if (A.data[i].i > B.data[j].i) {
            C->data[++k] = B.data[j++];
        } else {
            if (A.data[i].j < B.data[j].j) {
                C->data[++k] = A.data[i++];
            } else if (A.data[i].j > B.data[j].j) {
                C->data[++k] = B.data[j++];
            } else {
                int sum = A.data[i].value + B.data[j].value;
                if (sum != 0) {
                    C->data[++k].i = A.data[i].i;
                    C->data[k].j = A.data[i].j;
                    C->data[k].value = sum;
                }
                i++;
                j++;
            }
        }
    }

    while (i <= A.len) {
        C->data[++k] = A.data[i++];
    }

    while (j <= B.len) {
        C->data[++k] = B.data[j++];
    }

    C->m = A.m;
    C->n = A.n;
    C->len = k;

    return 1;
}

// 输出稀疏矩阵
void PrintMatrix(TSMatrix M) {
    printf("稀疏矩阵的三元组为:\n");
    for (int i = 1; i <= M.len; i++) {
        printf("%d %d %d\n", M.data[i].i, M.data[i].j, M.data[i].value);
    }
}

int main() {
    TSMatrix A, B, C;
    printf("请输入矩阵A:\n");
    InitMatrix(&A);
    printf("请输入矩阵B:\n");
    InitMatrix(&B);
    if (Add(A, B, &C)) {
        printf("矩阵相加成功!\n");
        PrintMatrix(C);
    } else {
        printf("矩阵相加失败!\n");
    }
    return 0;
}
C语言实现稀疏矩阵相加算法 - 三元组顺序表

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

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