稀疏矩阵加法,用十字链表实现C=A+B

本文介绍了一种基于三元组链表结构实现稀疏矩阵加法的方法,并提供了完整的C语言源代码。输入包括两个矩阵的维度及非零元素数量,输出为加法运算后稀疏矩阵的三元组形式。

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

Description

输入两个稀疏矩阵,输出它们相加的结果。

Input

第一行输入四个正整数,分别是两个矩阵的行m、列n、第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数t2。
接下来的t1+t2行是三元组,分别是第一个矩阵的数据和第二个矩阵的数据。三元组的第一个元素表示行号,第二个元素表示列号,第三个元素是该项的值。

Output

输出相加后的矩阵三元组。

  • Sample Input 
    3 4 3 2
    1 1 1
    1 3 1
    2 2 2
    1 2 1
    2 2 3
  • Sample Output
    1 1 1
    1 2 1
    1 3 1
    2 2 5
#include <stdio.h>  
#include<stdlib.h>  
  
typedef struct Node  
{  
    int i,j;  
    int e;  
    struct Node *right,*down;  
} Node,*LNode;  
  
typedef struct Cross  
{  
    LNode *rh,*ch;  
    int ra,ca,da;  
} Cross, *LCross;  
  
void init(LCross M)  
{  
    int i;  
    M->rh = (LNode *)malloc((M->ra+1)*sizeof(LNode));  
    M->ch = (LNode *)malloc((M->ca+1)*sizeof(LNode));  
  
    for(i=1; i<=M->ra; i++)  
    {  
        M->rh[i]=NULL;  
    }  
    for(i=1; i<=M->ca; i++)  
    {  
        M->ch[i]=NULL;  
    }  
}  
  
void Create(LCross M)  
{  
    int i;  
    LNode p,temp;  
  
    if(M->da != 0)  
    {  
        for(i=1; i<=M->da; i++)  
        {  
            p=(LNode)malloc(sizeof(Node));  
            scanf("%d %d %d",&p->i,&p->j,&p->e);  
            if(M->rh[p->i] == NULL)  
            {  
                p->right=NULL;  
                M->rh[p->i] = p;  
  
            }  
            else  
            {  
                for(temp=M->rh[p->i];; temp=temp->right)  
                {  
                    if(temp->right == NULL)  
                    {  
                        temp->right = p;  
                        p->right =NULL;  
                        break;  
                    }  
                    else if(temp->j < p->j && temp->right->j>p->j)  
                    {  
                        p->right = temp->right;  
                        temp->right = p;  
                        break;  
                    }  
                    else if(temp==M->rh[p->i] && temp->j>p->j)  
                    {  
                        p->right = temp;  
                        temp=p;  
                        break;  
                    }  
                }  
            }  
  
           if(M->ch[p->j] == NULL|| M->ch[p->j]->i>(p->i))  
            {  
  
                p->down=M->ch[p->j];  
                M->ch[p->j] = p;  
            }  
            else  
            {  
                for(temp=M->ch[p->j]; temp->down && temp->down->i<p->i; temp=temp->down);  
  
  
                p->down = temp->down;  
                temp->down = p;  
            }  
        }  
    }  
  
}  
  
void PlusToA(LCross A,LCross B)  
{  
    int i;  
    LNode p,temp1,temp2;  
    for(i=1; i<=A->ra; i++)  
    {  
        if(B->rh[i] == NULL) continue;  
        else  
        {  
            if(A->rh[i] == NULL)  
            {  
  
                p=(LNode)malloc(sizeof(Node));  
                p->j = B->rh[i]->j;  
                p->i = B->rh[i]->i;  
                p->e = B->rh[i]->e;  
                A->rh[i]=p;  
                p->right = NULL;  
                B->rh[i]=B->rh[i]->right;  
  
            }  
            if(B->rh[i]==NULL)continue;  
            for(temp1=B->rh[i];; temp1=temp1->right)  
            {  
                for(temp2=A->rh[i];; temp2=temp2->right)  
                {  
                    if(temp2->j == temp1->j)  
                    {  
                        temp2->e+=temp1->e;  
                        break;  
                    }  
                    else if(temp2==A->rh[i] && temp1->j<temp2->j)  
                    {  
                        p=(LNode)malloc(sizeof(Node));  
                        p->j = temp1->j;  
                        p->i = temp1->i;  
                        p->e = temp1->e;  
                        p->right = temp2->right;  
                        p->right =temp2;  
                        A->rh[i]=p;  
                        break;  
                    }  
                    else if((temp2->right == NULL || temp2->right->j>temp1->j)  && temp1->j>temp2->j)  
                    {  
                        p=(LNode)malloc(sizeof(Node));  
                        p->j = temp1->j;  
                        p->i = temp1->i;  
                        p->e = temp1->e;  
                        p->right = temp2->right;  
                        temp2->right=p;  
                        break;  
                    }  
  
                }  
  
                if(temp1->right == NULL) break;  
            }  
        }  
    }  
  
}  
  
  
void PrintCross(LCross A)  
{  
    int i;  
    LNode p;  
    for(i=1; i<=A->ra; i++)  
    {  
        p=A->rh[i];  
        while(p!=NULL)  
        {  
            printf("%d %d %d\n",p->i,p->j,p->e);  
            p=p->right;  
        }  
    }  
}  
  
int main()  
{  
    LCross A = (LCross)malloc(sizeof(Cross));  
    LCross B = (LCross)malloc(sizeof(Cross));  
  
    scanf("%d %d %d %d",&A->ra,&A->ca,&A->da,&B->da);  
    B->ra = A->ra;  
    B->ca = A->ca;  
    init(A);  
    init(B);  
    Create(A);  
    Create(B);  
    PlusToA(A,B);  
    PrintCross(A);  
    return 0;  
}  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值