【C 数据结构】以三元组表形式表示稀疏矩阵,实现两个矩阵的加法、减法

目的:以三元组表形式表示稀疏矩阵,实现两个矩阵的加法、减法。

实验步骤

1. 定义三元组存储结构

2. 输入稀疏矩阵:首先应输入矩阵的行数、列数和非零项的数目,并判别给出的两个矩阵的行、列数对于所要求进行的运算是否匹配。可设矩阵的行数和列数均不超过20。接下来逐个输入表示非零元的三元组(i, j, aij),程序可以对三元组的输入顺序加以限制,如按行优先。

3. 进行相关的运算,如加法或减法。

4. 输出结果矩阵(以阵列的形式输出运算结果)。

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

#define MAXSIZE 20
#define OK 1
#define ERROR 0

//用来存放三元组中每一个非零元素的信息
typedef struct {
    int r, c; //行号 列号
    int d;//表示非零元的值
} TupNode;

//用来存放三元组矩阵的信息
typedef struct {
    int rows, cols, nums; //行数 列数 非零元素个数
    TupNode data[MAXSIZE];
} TSMatrix;

//将三元元组表转换成二维数组
void conversionMatrix(TSMatrix *t, int A[t->rows][t->cols]) {
    for (int i = 0; i < t->rows; i++) {
        for (int j = 0; j < t->cols; j++) {
            A[i][j] = 0; //全部元素赋值0
        }
    }
    for (int i = 0; i < t->nums; i++) {
        A[t->data[i].r - 1][t->data[i].c - 1] = t->data[i].d;
    }
}

//打印矩阵
void printMatrix(TSMatrix *t) {
    int A[t->rows][t->cols];
    conversionMatrix(t, A);
    for (int i = 0; i < t->rows; i++) {
        for (int j = 0; j < t->cols; j++) {
            printf("%2d ", A[i][j]);//以矩阵形式打印
        }
        printf("\n");
    }
    printf("\n");
}

//输入三元组表
int inputMatrix(TSMatrix *t, int n) {
    printf("请输入第%d个元组的信息(依次输入行数,列数,非零元个数):\n", n);
    scanf("%d%d%d", &t->rows, &t->cols, &t->nums);
    //printf("t->rows=%d, t->cols=%d, t->nums=%d\n", t->rows, t->cols, t->nums);
    int i, j;
    printf("请输入每个三元组矩阵的非零元素的信息:\n");
    for (i = 0, j = 0; i < t->nums; i++, j++) {
        printf("依次输入第%d个三元组第%d个非零元素行标,列标,数值", n, i + 1);
        scanf("%d%d%d", &t->data[i].r, &t->data[i].c, &t->data[i].d);
        // printf("t->data[%d].r=%d,t->data[%d].c=%d, t->data[%d]=%d\n", i,t->data[i].r, i,t->data[i].c, i,t->data[i].d);
    }
    printf("第%d个三元组表矩阵如下:\n", n);
    printMatrix(t);
    return OK;
}

//三元组表相加
void calculatingMatrix(TSMatrix *t1, TSMatrix *t2, TSMatrix *t) {
    if (t1->rows != t2->rows || t1->cols != t2->cols) {
        printf("error,该矩阵不能进行加减运算,程序退出\n");
        exit(0);
    }
    int A[t1->rows][t1->cols];
    int B[t2->rows][t2->cols];
    int C[t1->rows][t1->cols];
    int C1[t1->rows][t1->cols]; //存储相减后结果
    conversionMatrix(t1, A);
    conversionMatrix(t2, B);
    printf("相减后三元组表矩阵如下:\n");
    for (int i = 0; i < t1->rows; i++) {
        for (int j = 0; j < t1->cols; j++) {
            C1[i][j] = A[i][j] - B[i][j];
            printf("%2d ", C1[i][j]);//以矩阵形式打印
        }
        printf("\n");
    }
    printf("相加后三元组表矩阵如下:\n");
    for (int i = 0; i < t1->rows; i++) {
        for (int j = 0; j < t1->cols; j++) {
            C[i][j] = A[i][j] + B[i][j];
            printf("%2d ", C[i][j]);//以矩阵形式打印
        }
        printf("\n");
    }
}

int main() {
    TSMatrix t1;
    TSMatrix t2;
    TSMatrix t;
    inputMatrix(&t1, 1);
    inputMatrix(&t2, 2);
    calculatingMatrix(&t1, &t2, &t);

}

 

  • 4
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汐ya~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值