『西工大-数据结构-NOJ』 013-以十字链表为存储结构实现矩阵相加(严5.27) 『西北工业大学』

在这里插入图片描述
在这里插入图片描述

解题思路:

这道题要求用十字链表的储存结构储存稀疏矩阵,并进行加法运算。
首先我们要了解一下为什么要用十字链表,对于一个稀疏矩阵,尤其是高维度时,如果以多维数组的形式开辟空间,会造成很大的不必要空间浪费,于是我们用十字链表,只存储稀疏矩阵中的非零元素,来达到储存稀疏矩阵的目的。
当要进行矩阵的加、减、乘等运算时,有时非零元素的位置会发生很大的变化,三元组表为保持以行或列序为主而需要大量移动元素。但十字链表就比较灵活,它在三元组表的基础之上多了两个指针域,指向同一行中的下一个非零元素和同一列的下一个非零元素。
常见的十字链表节点和十字链表的宏定义如下:

typedef struct OLNode{
   //定义十字链表结点
    int i,j;
    int val;
    struct OLNode *right,*down;
}OLNode,*OLink;

typedef struct{
   //定义十字链表
    OLink *rhead,*chead;//定义行和列的头指针地址组
    int mu,nu,tu;
}CrossList;

本题的难点对十字链表进行各种操作时的逻辑与算法,十字链表虽然相比三元组表在储存矩阵上有一定优势,但其在结构与算法上还是比较复杂的。
具体操作见代码,代码中有部分注释。

题解代码:

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

typedef struct OLNode{
   //定义十字链表结点
    int i,j;
    int val;
    struct OLNode *right,*down;
}OLNode,*OLink;

typedef struct{
   //定义十字链表
    OLink *rhead,*chead;//定义行和列的头指针地址组
    int mu,nu,tu;
}CrossList;

void CreatMatrix_OL(CrossList *M, int m, int n, int t){
   //创建一个m行n列容量为t的十字链表
    //初始化M头节点,行、列和容量信息,开辟行列链表头节点空间
    M->rhead = M->chead = NULL;
    M->mu = m;
    M->nu = n;
    M->tu = t;
    M->rhead = (OLink*)malloc(sizeof(OLink)*(m+1));
    M->chead = (OLink*)malloc(sizeof(OLink)*(n
  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值