数据结构NOJ012以三元组表为存储结构实现矩阵相加

该代码示例展示了如何在C语言中使用结构体表示三元组来存储稀疏矩阵,并实现两个稀疏矩阵的相加操作。程序首先定义了三元组和三元组表结构,然后通过CreatTSMatrix函数创建矩阵,AddTwoTSMatrix函数执行加法,最后PrintTSMatrix函数打印结果矩阵。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一篇写的非常好:大佬文章

 

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

// 定义三元组结构体
typedef struct{
    int i, j;  // 该元素的行和列
    int val;   // 该元素的值
}Triple;

// 定义三元组表结构体
typedef struct{
    Triple *data;  // 三元组数组
    int mu, nu, tu;  // 最大行数、最大列数、有效元素个数
}TSMatrix;

// 创建一个容量为n的三元组表
void CreatTSMatrix(TSMatrix *p, int n){
    p->data = (Triple*)malloc(sizeof(Triple)*n);
    p->tu = n;
}

// 实现两个稀疏矩阵相加的功能,结果存入另一个三元组表中
void AddTwoTSMatrix(TSMatrix *A, TSMatrix *B, TSMatrix *C){
    int i=0, j=0, sum, C_tu=0;
    while(i<A->tu && j<B->tu){ // 当两个数组均有元素未进行加法运算时
        if(A->data[i].i==B->data[j].i && A->data[i].j==B->data[j].j){ // 当两个元素在同一行同一列时
            sum = A->data[i].val + B->data[j].val;
            if(sum!=0){ // 如果和不为零,则存入结果矩阵中
                C->data[C_tu].i = A->data[i].i;
                C->data[C_tu].j = A->data[i].j;
                C->data[C_tu].val = sum;
                C_tu++;
            }
            i++; // 指向下一个元素
            j++;
        }
        else if(A->data[i].i < B->data[j].i){ // A中的元素在B中没有
            C->data[C_tu].i = A->data[i].i;
            C->data[C_tu].j = A->data[i].j;
            C->data[C_tu].val = A->data[i].val;
            C_tu++;
            i++;
        }
        else if(A->data[i].i > B->data[j].i){ // B中的元素在A中没有
            C->data[C_tu].i = B->data[j].i;
            C->data[C_tu].j = B->data[j].j;
            C->data[C_tu].val = B->data[j].val;
            C_tu++;
            j++;
        }
        else if(A->data[i].j < B->data[j].j){ // 当两个元素在同一行,A的元素在B的元素前面
            C->data[C_tu].i = A->data[i].i;
            C->data[C_tu].j = A->data[i].j;
            C->data[C_tu].val = A->data[i].val;
            C_tu++;
            i++;
        }
        else{ // 当两个元素在同一行,B的元素在A的元素前面
            C->data[C_tu].i = B->data[j].i;
            C->data[C_tu].j = B->data[j].j;
            C->data[C_tu].val = B->data[j].val;
            C_tu++;
            j++;
        }
    }

    // 处理未加法运算的剩余元素
    while(i<A->tu){
        C->data[C_tu].i = A->data[i].i;
        C->data[C_tu].j = A->data[i].j;
        C->data[C_tu].val = A->data[i].val;
        C_tu++;
        i++;
    }
    while(j<B->tu){
        C->data[C_tu].i = B->data[j].i;
        C->data[C_tu].j = B->data[j].j;
        C->data[C_tu].val = B->data[j].val;
        C_tu++;
        j++;
    }
    C->tu = C_tu; // 更新结果矩阵的有效元素个数
}

// 打印三元组表
void PrintTSMatrix(TSMatrix *C){
    for(int i=0;i<C->tu;i++){
        printf("%d %d %d\n",C->data[i].i,C->data[i].j,C->data[i].val);
    }
}

int main(){
    int t1,t2;
    scanf("%d %d",&t1,&t2);
    TSMatrix *pa,*pb,*pc;
    pa = (TSMatrix*)malloc(sizeof(TSMatrix));
    pb = (TSMatrix*)malloc(sizeof(TSMatrix));
    pc = (TSMatrix*)malloc(sizeof(TSMatrix));
    CreatTSMatrix(pa,t1); // 创建第一个三元组表
    CreatTSMatrix(pb,t2); // 创建第二个三元组表
    CreatTSMatrix(pc,t1+t2); // 创建结果三元组表
    for(int i=0;i<t1;i++){ // 输入第一个三元组表中各元素的行、列、值
        scanf("%d %d %d",&pa->data[i].i,&pa->data[i].j,&pa->data[i].val);
    }
    for(int i=0;i<t2;i++){ // 输入第二个三元组表中各元素的行、列、值
        scanf("%d %d %d",&pb->data[i].i,&pb->data[i].j,&pb->data[i].val);
    }
    AddTwoTSMatrix(pa,pb,pc); // 计算结果矩阵
    PrintTSMatrix(pc); // 输出结果矩阵
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值