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

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

第一行输入四个正整数,分别是两个矩阵的行m、列n、第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数t2

接下来的t1+t2行是三元组,分别是第一个矩阵的数据和第二个矩阵的数据。三元组的第一个元素表示行号,第二个元素表示列号,第三个元素是该项的值。

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

3 4 3 2

1 1 1

1 3 1

2 2 2

1 2 1

2 2 3

1 1 1

1 2 1

1 3 1

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


typedef struct olnode
{
    int row,col,num;
    struct olnode *down,*right;
}olnode,*olink;


typedef struct crosslist
{
    int mu,nu,tu;
    olnode *rhead[100],*chead[100];
}crosslist;


void init(crosslist *M)
{
    int m, n,t1,i;//输入行列数,以及每个矩阵的非零元素数
    scanf("%d%d%d",&m,&n,&t1);
    M->mu = m;
    M->nu = n;
    M->tu  = t1;
    for(i = 0;i <= m;i++)
    {
        M->rhead[i] = NULL;
    }
    for(i = 0;i <= n;i++)
    {
        M->chead[i] = NULL;
    }
}


void add(crosslist *M)
{
    int i,m,n,e,t2;
    olink q;
    scanf("%d",&t2);
    for(i=1;i<=M->tu;i++)
    {
       olink  p=(olink)malloc(sizeof(olnode));
        scanf("%d%d%d",&m,&n,&e);
        p->row=m;
        p->col=n;
        p->num=e;
        //插入到头节点之后
        if(M->rhead[m] == NULL||M->rhead[m]->col > n)//节点在矩阵之外的情况
        {
            p->right = M->rhead[m];
            M->rhead[m] = p;
        }
        else
        {
            for(q = M->rhead[m];(q->right)&&q->right->col < n;q = q->right);
            p->right = q->right;
            q->right = p;
        }//完成行插入
        if(M->chead[n] == NULL || M->chead[n]->row > m)
        {
            p->down = M->chead[n];
            M->chead[n] = p;
        }
         else
        {
            for(q = M->chead[n];(q->down)&&q->down->col < n;q = q->down);
            p->down = q->down;
            q->down = p;
        }
    }
     int flag = 0;
    for(i = 0;i < t2;i++)
    {
        scanf("%d%d%d",&m,&n,&e);
        for(q = M->rhead[m];q;q = q->right)
        {
            if(q->col == n)
            {
                q->num = e + q->num;
                flag = 1;
                break;
            }
        }
        if(flag == 0)
        {
            olink p = (olink )malloc(sizeof(olnode));
            p->row=m;
            p->col=n;
            p->num=e;
            if(M->rhead[m] == NULL||M->rhead[m]->col > n)//插入到头节点之后
            {
                p->right = M->rhead[m];
                M->rhead[m] = p;
            }
            else
            {
                for(q = M->rhead[m];(q->right)&&q->right->col < n;q = q->right);
                p->right = q->right;
                q->right = p;
            }
        }
        flag = 0;
    }
}


void getout(crosslist* a)
{
    olink p;
    int i;
    for(i = 0;i <= a->mu;i++)
    {
        if(a->rhead[i] == NULL)
        {
            continue;
        }
        else
        {
            p = a->rhead[i];
            while(p)
            {
                if(p->num == 0)
                {
                    p = p->right;//注意会陷入死循环;
                    continue;
                }
                printf("%d %d %d\n",p->row,p->col,p->num);
                p = p->right;
            }
        }
    }
}
int main()
{
    crosslist *a;
    a = (crosslist* )malloc(sizeof(crosslist));
    init(a);
    add(a);
    getout(a);
    return 0;
}



  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
稀疏矩阵是指矩阵中大部分元素为0的矩阵。稀疏矩阵加法是指将两个稀疏矩阵相加得到一个新的稀疏矩阵的操作。 十字链表是一种用于表示稀疏矩阵的数据结构。它通过两个链表来表示矩阵中的非零元素。一个链表按行连接,每个节点表示矩阵中的一行;另一个链表按列连接,每个节点表示矩阵中的一列。每个节点除了包含元素的值外,还包含指向同一行和同一列下一个非零元素的指针。 实现稀疏矩阵加法的步骤如下: 1. 初始化一个空稀疏矩阵c。 2. 遍历稀疏矩阵a的所有非零元素: 2.1 创建一个新的节点,将其值设为当前元素的值。 2.2 将新节点添加到稀疏矩阵c的正确位置。 3. 遍历稀疏矩阵b的所有非零元素: 3.1 创建一个新的节点,将其值设为当前元素的值。 3.2 将新节点添加到稀疏矩阵c的正确位置。 4. 返回稀疏矩阵c。 具体地,添加一个非零元素到稀疏矩阵c的正确位置的步骤如下: 1. 遍历稀疏矩阵c的行链表,找到与要添加的元素所在行相同的节点。 2. 遍历该节点的列链表,找到与要添加的元素所在列相同的节点,并将要添加的元素的值与该节点的值相加。 3. 如果没有找到相同列的节点,说明是该行的第一个非零元素,将要添加的元素插入到该行中的正确位置。 通过以上步骤,我们可以实现稀疏矩阵加法,并使用十字链表来表示稀疏矩阵。使用十字链表可以减少存储空间的浪费,提高了对稀疏矩阵的操作效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值