【数据结构与算法】 完成用十字链表存储的稀疏矩阵的加法运算

奋斗吧
奋斗吧
擅长邻域:未填写

标签: 【数据结构与算法】 完成用十字链表存储的稀疏矩阵的加法运算

2023-07-08 18:23:29 233浏览

完成用十字链表存储的稀疏矩阵的加法运算。

题目

  Qestion:完成用十字链表存储的稀疏矩阵的加法运算。


主要思路

  1. 获取两个稀疏矩阵总有多少个非零元素,记作cnt
  2. cnt 不为零时一直循环,每循环一次i++,也就是行循环,每循环一次就转移至下一行。
  3. 先从第一行开始循环,使得两个工作指针pq分别指向两个稀疏矩阵的第一行第一个非零元。对当前行pq有无元素个数进行判断,下面是会遇到的四种情况:
    • p当前行无元素并且q有元素:则将赋值给p,也就是q当前行的元素全部都接在了p之后
    • p、q当前行均无元素:则跳出当前循环,令i+1,进入下一行也就是下一个循环
    • p当前行有元素、q无元素:则跳出当前循环,转移至下行
    • p、q当前行均有元素:则进行下述循环。

思路伪代码

在这里插入图片描述


完整代码

// 完成用十字链表存储的稀疏矩阵的加法运算。
typedef struct OLNode
{
    int i;
    int j;
    int e;
    struct OLNode *right;
    struct OLNode *down;
} OLNode, *OLink;

typedef struct
{
    OLink *rhead;
    OLink *chead;
    int mu; // 行数
    int nu; // 列数
    int tu;
} CrossList;

void addArray(CrossList &a, CrossList b)
{
    int cnt = a.tu + b.tu; // 统计一共有多少个非零数
    int i = 1;
    // int j1, j2;
    while (cnt > 0) // 当还有数没加时继续循环
    {
        OLink p = a.rhead[i];
        OLink q = b.rhead[i];

        if (!p && q) // p当前行无元素,q有元素,则将q赋给p
            p = q;
        if (!p && !q) // p、q当前行均无元素,则跳转下一行
            continue;
        if (p && !q) // p有元素,q无元素,则跳转下一行
            continue;
        if (p && q) // p、q均有元素,则进行加法
        {
            do
            {
                if (p->j < q->j)
                {
                    cnt--;        // cnt减一
                    if (p->right) // p的右元素不为空
                    {
                        p = p->right; // 工作指针p向右移
                    }
                    else
                    {
                        p->right = q; // q当前行的所有元素接到p的后面
                    }
                }
                else if (p->j == q->j)
                {
                    p->e = p->e + q->e;
                    p = p->right;
                    q = q->right;  // p、q同时向右移动
                    cnt = cnt - 2; // cnt减二
                }
                else
                {
                    OLink tmp1 = p;
                    p = q;                 // a.rhead[i]指向q的节点
                    OLink tmp2 = q->right; // 将q的右节点的指针保存
                    q->right = tmp1;       // q的右指针指向p
                    cnt--;
                    if (tmp2) // 若q的右节点不为空
                    {
                        q = tmp2; // 工作指针q向右移
                    }
                }
            } while (!p->right); // 当工作指针为当前行的最后一个元素时退出循环
        }

        i++; // 转移到下一行
    }
}

代码图片

在这里插入图片描述


结束语

  因为是算法小菜,所以提供的方法和思路可能不是很好,请多多包涵~如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695