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

这篇具有很好参考价值的文章主要介绍了【数据结构与算法】 完成用十字链表存储的稀疏矩阵的加法运算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

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


主要思路

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

思路伪代码

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


完整代码

// 完成用十字链表存储的稀疏矩阵的加法运算。
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++; // 转移到下一行
    }
}

代码图片

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


结束语

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

到了这里,关于【数据结构与算法】 完成用十字链表存储的稀疏矩阵的加法运算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】数组和字符串(十):稀疏矩阵的链接存储:十字链表的矩阵操作(加法、乘法、转置)

    【数据结构】数组和字符串(一):矩阵的数组表示   矩阵是以按行优先次序将所有矩阵元素存放在一个一维数组中。但是对于特殊矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵等, 如果用这种方式存储,会出现大量存储空间存放重复信息或零元素的情况,这样会造

    2024年02月08日
    浏览(61)
  • 【数据结构】数组和字符串(八):稀疏矩阵的链接存储:十字链表的创建、插入元素、遍历打印(按行、按列、打印矩阵)、销毁

    【数据结构】数组和字符串(一):矩阵的数组表示   矩阵是以按行优先次序将所有矩阵元素存放在一个一维数组中。但是对于特殊矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵等, 如果用这种方式存储,会出现大量存储空间存放重复信息或零元素的情况,这样会造

    2024年02月06日
    浏览(55)
  • 数据结构——十字链表

    什么是十字链表: 十字链表(Orthogonal List) 是有向图的另一种链式存储结构。该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的。用十字链表来存储有向图,可以达到高效的存取效果。同时,代码的可读性也会得到提升。 了解十字链表:         我们来看下面这

    2024年02月05日
    浏览(41)
  • 【数据结构】十字链表的画法

    有向边又称为弧 假设顶点 v 指向 w,那么 w 称为弧头,v 称为弧尾 顶点节点采用顺序存储 顶点节点 data:存放顶点的信息 firstin:指向以该节点为终点(弧头)的弧节点 firstout:指向以该节点为起点(弧尾)的弧节点 弧节点 tailvex:起点(弧尾)在数组中的索引 headvex:终点(

    2024年02月11日
    浏览(48)
  • 图的存储结构-十字链表

    十字链表 (Orthogonal List)是有向图的一种链式存储结构。可以看成是将有向图的邻接表和逆邻接表结合起来得到的一种链表。在十字链表中,对应于有向图中每一条弧有一个结点,对应于每个顶点也有一个结点。 顶点结点 弧结点 十字链表结点: 在弧结点中有5个域:其中尾

    2024年02月05日
    浏览(47)
  • 图的存储结构——十字链表

    目录 引入(为何存在?) 数据结构分析 十字链表的示意图: 代码实现(以有向网为例,创建十字链表)         数据结构部分:        算法实现部分:         测试部分:(以图8.14为例) 时间与空间复杂度分析分析:         回忆邻接矩阵与邻接表的存储结构,它

    2024年02月04日
    浏览(46)
  • 数据结构(4) 链表(链式存储)

    顺序表优点:可随机存取,存储密度高,缺点:要求大片连续空间,改变容量不方便。 单链表优点:不要求大片连续空间,改变容量方便,缺点:不可随机存取,要耗费一定空间存放指针。 定义单链表的代码: 定义数据领和指针域 定义一个新节点 定义typedef来缩短函数书写

    2024年02月22日
    浏览(42)
  • 【数据结构与算法】链表

    对于顺序表存在一些缺陷: 中间/头部的插入删除,时间复杂度为O(N) 。头部插入需要挪动后面的元素 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插

    2023年04月09日
    浏览(47)
  • 【算法与数据结构】链表

    链表是由一串节点串联在一起的,链表的每个节点存储两个信息:数据+下一个节点的地址 分清楚两个概念:什么是内存内部,什么是程序内部 内存内部: 信息存储在内存空间里的 程序内部: 通过什么信息,去操作结构 如果想操作链表的话,我们依靠的是程序内部的信息,

    2024年02月03日
    浏览(45)
  • 02-链表 (数据结构和算法)

    3.1 链表的基本概念 前面我们在学习顺序表时,线性表的顺序存储结构的特点是逻辑关系上相邻的两个数据元素在物理位置上也是相邻的。我们会发现虽然顺序表的查询很快,时间复杂度为O(1),但是增删的效率是比较低的,因为每一次增删操作都伴随着大量的数据元素移动。为

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包