【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: 稀疏矩阵可以用三元组表示,其中每个元素由三个值组成:行号、列号和元素值。例如,一个3x3的稀疏矩阵: 2 1 可以表示为以下三元组: (1,2,2) (3,3,1) 实现两个矩阵加法减法,可以先将两个矩阵转换为三元组,然后按照行列号进行匹配,对应元素相或相减,最后再将结果转换为稀疏矩阵三元组。 具体实现可以参考以下伪代码: // 稀疏矩阵加法 function sparse_matrix_add(A, B): // 将矩阵转换为三元组 A_triplets = convert_to_triplets(A) B_triplets = convert_to_triplets(B) // 初始化结果三元组 C_triplets = [] // 遍历A和B的三元组,按照行列号匹配并相 i = j = 1 while i <= len(A_triplets) and j <= len(B_triplets): if A_triplets[i].row < B_triplets[j].row: C_triplets.append(A_triplets[i]) i++ else if A_triplets[i].row > B_triplets[j].row: C_triplets.append(B_triplets[j]) j++ else if A_triplets[i].col < B_triplets[j].col: C_triplets.append(A_triplets[i]) i++ else if A_triplets[i].col > B_triplets[j].col: C_triplets.append(B_triplets[j]) j++ else: value = A_triplets[i].value + B_triplets[j].value if value != : C_triplets.append(Triplet(A_triplets[i].row, A_triplets[i].col, value)) i++ j++ // 将剩余的三元组到结果中 while i <= len(A_triplets): C_triplets.append(A_triplets[i]) i++ while j <= len(B_triplets): C_triplets.append(B_triplets[j]) j++ // 将结果三元组转换为稀疏矩阵 C = convert_to_matrix(C_triplets) return C // 稀疏矩阵减法 function sparse_matrix_subtract(A, B): // 将矩阵转换为三元组 A_triplets = convert_to_triplets(A) B_triplets = convert_to_triplets(B) // 初始化结果三元组 C_triplets = [] // 遍历A和B的三元组,按照行列号匹配并相减 i = j = 1 while i <= len(A_triplets) and j <= len(B_triplets): if A_triplets[i].row < B_triplets[j].row: C_triplets.append(A_triplets[i]) i++ else if A_triplets[i].row > B_triplets[j].row: C_triplets.append(Triplet(B_triplets[j].row, B_triplets[j].col, -B_triplets[j].value)) j++ else if A_triplets[i].col < B_triplets[j].col: C_triplets.append(A_triplets[i]) i++ else if A_triplets[i].col > B_triplets[j].col: C_triplets.append(Triplet(B_triplets[j].row, B_triplets[j].col, -B_triplets[j].value)) j++ else: value = A_triplets[i].value - B_triplets[j].value if value != : C_triplets.append(Triplet(A_triplets[i].row, A_triplets[i].col, value)) i++ j++ // 将剩余的三元组到结果中 while i <= len(A_triplets): C_triplets.append(A_triplets[i]) i++ while j <= len(B_triplets): C_triplets.append(Triplet(B_triplets[j].row, B_triplets[j].col, -B_triplets[j].value)) j++ // 将结果三元组转换为稀疏矩阵 C = convert_to_matrix(C_triplets) return C ### 回答2: 稀疏矩阵是指大多数元素为0的矩阵。为了避免不必要的内存浪费,我们可以采用三元组形式表示稀疏矩阵三元组包括三个部分:行数n、列数m和非零元素三元组L。 L是由三个一维数组组成的。其中,L[0]存储非零元素的行号,L[1]存储非零元素的列号,L[2]存储非零元素的值。 例如,对于一个4*5的矩阵: 1 0 0 0 2 0 0 0 0 0 0 3 0 0 0 4 0 5 0 0 它的三元组为: n=4,m=5 L[0]={1,3,4,4} L[1]={0,4,1,2} L[2]={1,2,4,5} 假设有两个稀疏矩阵A和B需要进行减操作,它们的三元组分别为LA和LB,则它们的减操作可以按照如下步骤实现: 1. 对于A和B的三元组,比较它们的行数和列数是否相等。若不相等,则无法进行减操作; 2. 创建一个空的三元组LC,其中行数和列数与A、B相同; 3. 初始化i=0和j=0; 4. 比较LA[0][i]和LB[0][j]、LA[1][i]和LB[1][j],若二者行列号相同,则计算LC[2][k]=LA[2][i]+LB[2][j]或LC[2][k]=LA[2][i]-LB[2][j]并将其存入LC中,然后i和j都1; 5. 若LA[0][i]<LB[0][j]或者(LA[0][i]=LB[0][j]且LA[1][i]<LB[1][j]),则说明A中该位置为0,将B中该位置的值存入LC中,然后j1; 6. 若LA[0][i]>LB[0][j]或者(LA[0][i]=LB[0][j]且LA[1][i]>LB[1][j]),则说明B中该位置为0,将A中该位置的值存入LC中,然后i1; 7. 重复4-6步,直到i=nA或j=nB为止,其中nA和nB分别是A和B的非零元素个数。 最终得到的LC即为A和B的减结果。 综上所述,采用三元组形式,可以使稀疏矩阵减操作更高效。 ### 回答3: 稀疏矩阵是指大部分数值为0的大型矩阵,而三元组则是用于表示稀疏矩阵的一种数据结构三元组由三个数组构成,分别表示非零元素的行数、列数和非零元素的值,可以大大减小稀疏矩阵存储空间。 针对稀疏矩阵加法减法可以通过以下的步骤实现: 1. 定义三元组的结构体,并读入两个稀疏矩阵的数据。 ``` typedef struct { int row; int col; float value; } Triple; int main() { int m, n, t1, t2; scanf("%d %d %d %d", &m, &n, &t1, &t2); Triple matrix1[t1], matrix2[t2]; for (int i = 0; i < t1; i++) { scanf("%d %d %f", &matrix1[i].row, &matrix1[i].col, &matrix1[i].value); } for (int i = 0; i < t2; i++) { scanf("%d %d %f", &matrix2[i].row, &matrix2[i].col, &matrix2[i].value); } ``` 2. 对两个稀疏矩阵进行加法减法计算,将结果存储在新的三元组中。 ``` int p1 = 0, p2 = 0, p3 = 0; Triple matrix3[t1 + t2]; while (p1 < t1 && p2 < t2) { if (matrix1[p1].row == matrix2[p2].row && matrix1[p1].col == matrix2[p2].col) { matrix3[p3].row = matrix1[p1].row; matrix3[p3].col = matrix1[p1].col; matrix3[p3].value = matrix1[p1].value + matrix2[p2].value; p1++; p2++; p3++; } else if (matrix1[p1].row < matrix2[p2].row || (matrix1[p1].row == matrix2[p2].row && matrix1[p1].col < matrix2[p2].col)) { matrix3[p3].row = matrix1[p1].row; matrix3[p3].col = matrix1[p1].col; matrix3[p3].value = matrix1[p1].value; p1++; p3++; } else { matrix3[p3].row = matrix2[p2].row; matrix3[p3].col = matrix2[p2].col; matrix3[p3].value = (-1) * matrix2[p2].value; p2++; p3++; } } while (p1 < t1) { matrix3[p3].row = matrix1[p1].row; matrix3[p3].col = matrix1[p1].col; matrix3[p3].value = matrix1[p1].value; p1++; p3++; } while (p2 < t2) { matrix3[p3].row = matrix2[p2].row; matrix3[p3].col = matrix2[p2].col; matrix3[p3].value = (-1) * matrix2[p2].value; p2++; p3++; } ``` 3. 将新的三元组结果输出。 ``` for (int i = 0; i < p3; i++) { printf("%d %d %.1f\n", matrix3[i].row, matrix3[i].col, matrix3[i].value); } return 0; } ``` 通过以上的步骤,我们就可以顺利地实现两个稀疏矩阵加法减法计算。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

汐ya~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值