c语言版数据结构(奇迹冬瓜)-数组和广义表(十字链表存贮稀疏矩阵的行列值)

【数据结构】稀疏矩阵的链式存储(十字链表) “ Ctrl AC!一起 AC!” 目录 稀疏矩阵的十字链表表示: 十字链表中结点的结构: 创建稀疏矩阵的十字链表表示: 稀疏矩阵十字链表的查找: 稀疏矩阵的十字链表表示: 每一行的非零元素构成一个带表头的环形链表 每一列的非零元素构成一个带表头的环形链表 第i行和第i列的表头是同一个 所有表头结点构成一个新的带表头的环形链表 因此: 十字链表的表示中有非零元素结点和表头结点两类结点 其中表头结点的row,col均为零,表头结点构成的环形链表的表头的row和col分. 阅读详情
/*
   3  0  0  5
M= 0 -1  0  0  (M矩阵)
   2  0  0  0 
                 M.chead(colhead)           1          2         3        4
M.rhead(rowhead) 
1                                         1 1 3                         1 4 5

2                                                    2 2 -1

3                                         3 1 -2

4

*/

#include<stdio.h>
#include<stdlib.h>
//宏定义

#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status;
typedef struct OLNode               //替换一个结构体的名字
{
	int i,j,e;                      //矩阵三元组i代表行 j代表列 e代表当前位置的数据
	struct OLNode *right,*down;     //指针域 右指针 下指针
}OLNode,*OLink;                     //结构体的新名

typedef struct 
{
	OLink *rhead,*chead;            //行和列链表头指针由CreateSMatrix分配
	int mu,nu,tu;                   //稀疏矩阵的行数,列数和非零元的个数
}CrossList;

Status CreateMatrix_OL(CrossList *M);

void main()
{
	CrossList M;
	int i;
	OLNode *p;
	CreateMatrix_OL(&M);
	printf("M:\n---------------------\ni\tj\te\n---------------------\n");
	for (i=1;i<=M.nu;i++)
	{
		if (NULL!=M.chead[i])
		{
			p=M.chead[i];
			while (NULL!=p)
			{
				printf("%d\t%d\t%d\n",p->i,p->j,p->e);
				p=p->down;
			}
		}
	}
	getchar();
	getchar();
}

Status CreateMatrix_OL(CrossList *M)  //创建系数矩阵M,采用十字链表存储表示
{
     int m,n,t;      //定义矩阵的行,列,非零元的数量
     int i,j,e;      //定义中间变量
     OLNode *p,*q;       //定义中间变量  
   //  if(M)
     //{
       //  free(M);    //如果矩阵已经存在,那么释放矩阵
     //}
     scanf("%d%d%d",&m,&n,&t);  //输入矩阵的行列及非零元的数量
     M->mu=m;
     M->nu=n;
     M->tu=t;     //初始化矩阵的行列及非零元的数量
     if(!(M->rhead=(OLink*)malloc((m+1)*sizeof(OLink))))
     {
        exit(OVERFLOW);      //初始化矩阵的行链表            
     }
     if(!(M->chead=(OLink*)malloc((n+1)*sizeof(OLink))))
     {
         exit(OVERFLOW);     //初始化矩阵的列链表
     }
     for(i=1;i<=m;i++)
     {
         M->rhead[i]=NULL;   //初始化行
     }
     for(j=1;j<=n;j++)
     {
         M->chead[j]=NULL;   //初始化列
     }
     for(scanf("%d%d%d",&i,&j,&e);0!=i;scanf("%d%d%d",&i,&j,&e)) //输入三元组 直到行为0结束
     {
         if(!(p=(OLNode*)malloc(sizeof(OLNode))))
         {
             exit(OVERFLOW);                 //动态生成p
         }
         p->i=i;
         p->j=j;
         p->e=e;                             //初始化p
		 if(NULL==M->rhead[i]||M->rhead[i]->j>j)
		 {
			 p->right=M->rhead[i];
			 M->rhead[i]=p;
		 }
		 else
		 {
			 for(q=M->rhead[i];(q->right)&&q->j>j;q=q->right);
			 p->right=q->right;
			 q->right=p;
		 }                                          
		 if(NULL==M->chead[j]||M->chead[j]->i>i)
		 {
			 p->down=M->chead[j];
			 M->chead[j]=p;
		 }
		 else
		 {
			 for (q=M->chead[j];(q->down );q=q->down);
			 p->down=q->down;
			 q->down=p;
		 }
     }
	 return OK;
}

采用十字链表存储的稀疏矩阵 题目描述 当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储的结构来表示三元组的线性表了。因此,在这种情况下,采用链式存储结构表示三元组更为恰当。十字链表就是能够实现这样功能的一种数据结构。 在十字链表中,每个非零元可以用一个包含5个域的结点表示。其中i、j和e这3个域分别表示该非零元所在的行、列和非零元的值,向右域right用来链接同一行中下一个非零元,而向下域down用 阅读详情

相关推荐

稀疏矩阵的十字链表实现(C语言实现)

又要从头学数据结构了。 默默挨个实现一遍 实现的功能包括两个矩阵的加减 相乘 还有转置  有点繁琐  凑合看吧 #include #include typedef int ElemType;// 稀疏矩阵的十字链表存储表示 typedef struct OLNode { int i,j; //该非零元的列和下标 ElemType e; //非零元素值 struct O

rainxbow的专栏 3533

稀疏矩阵的十字链表实现:行列链表

稀疏矩阵的十字链表实现

JessicaWin 6004

十字链表法,十字链表压缩存储稀疏矩阵详解

对于压缩存储稀疏矩阵,无论是使用三元组顺序表,还是使用行逻辑链接的顺序表,归根结底是使用数组存储稀疏矩阵。介于数组 "不利于插入和删除数据" 的特点,以上两种压缩存储方式都不适合解决类似 "向矩阵中添加或删除非 0 元素" 的问题。 例如,A 和 B 分别为两个矩阵,在实现 "将矩阵 B 加到矩阵 A 上" 的操作时,矩阵 A 中的元素会发生很大的变化,之前的非 0 元素可能变为 0,而 0 元素...

数据结构和算法教程(C语言版) 4096

稀疏矩阵数据结构的存储——十字链表法

个人理解: 可以设想一个场景,一个矩阵是从左往右,从上往下,按左上角到右下角的方向生成的。在每个行和列交叉的节点上存储数据。那这些数据间有何种联系,采用何种方式可以方便的对任意节点的数据进行读写操作? 假设每个节点上存储了除了数据外还有本节点的行、列标号,另外还都有两个钩子,一个向右钩住同一行上下一个节点,另一个钩子向下钩住同一列上下一个节点,以此类推便可以生成一个每个节点都是通过钩子相连的矩阵。每个行或者列的开头都有一个代表行或者列开始位置的头钩子(是可移动的);(钩子即是指针) 读取节点:即头钩子

nkly的博客 1508

数据结构C语言版稀疏矩阵的一次转置

typedef struct {int row,col; int e; }Triple; typedef struct {Triple data[maxsize-1]; int m,n,len; }TSMaxtrix;

三元组,十字链表下的稀疏矩阵的加、转、乘的实现

用C++编写的程序,有很详细的步骤解说。

稀疏矩阵的十字链表存储的思路

刚才终于完完全全、彻彻底底的搞明白了稀疏矩阵十字链表的存储方式的实现与该算法的思想。我觉得有必要把自己的思路记下来,一呢等自己将来忘记了可以回过头来看,二呢希望与我一样对该存储方式迷惑的朋友可以通过我的文章得到一点点的启示。现在进入正题。        我们知道稀疏矩阵的三元组

菜鸟的逆袭 5万+

c语言实现稀疏矩阵的加减乘,转置

用三元组存储稀疏矩阵,编写函数进行稀疏矩阵的基本运算

数据结构 - 十字链表之稀疏矩阵的存储

当数组中非零元素非常少时,我们可以称之为稀疏矩阵。为了减少空间的浪费,在存储稀疏矩阵的时候,我们对它进行压缩存储,即指存储非零信息。 一、数组的顺序存储 在存储稀疏矩阵的时候,除了存储非零元素的值,还需要存储其行列号i和j,故每个非零元素要用一个三元组(i, j, v)来描述。因为要与矩阵的对应关系,我们还需要在三元组表中增设非零元素的个数和矩阵行列大小。 那么,稀疏矩阵的数组表达如下所示。 st...

爱吃柚子的好奶罐 1万+

【免费】最新区块链钱包和私钥的助记词碰撞器,bybit使用python开发

【免费】最新助记词钱包碰撞器,全链全网络,一周左右就有,稳定高效。

weixin_48529185的博客 1万+

在统信UOS Server 20上踩坑记:手把手教你搞定openGauss 5.0.0企业版安装(附常见报错解决方案)

本文详细记录了在统信UOS Server 20上安装openGauss 5.0企业版的实战经验,包括环境准备、依赖库问题、目录权限、内存参数调优等常见问题的解决方案。通过伪装系统标识、建立软链接、调整内存参数等方法,成功克服国产操作系统与企业级数据库的兼容性挑战,为开发者提供了一份深度排雷指南。

weixin_28698059的博客 265

c语言版数据结构(奇迹冬瓜)-数组和广义表(十字链表稀疏矩阵的加法)

/* 以下是用于测试的两个稀疏矩阵 3 0 0 5 M= 0 -1 0 0 (M矩阵) 2 0 0 0 -3 0 2 0 N= 0 5 0 0 (N矩阵) 0 0 0 -1 M=M+N

runner2012的专栏 3420

AD7768与STM32F439的硬件设计避坑指南:如何优化高精度ADC系统的电源与PCB布局

本文详细解析了AD7768与STM32F439在高精度ADC系统硬件设计中的关键问题与优化方案。从电源系统设计、PCB布局到基准电压选型,提供了实用的避坑指南和实测数据,帮助工程师提升系统性能至110dB动态范围。特别强调了SPI信号布线和电源滤波对ADC精度的重要影响。

sugar的博客 740

稀疏矩阵的十字链表存储

稀疏矩阵可用三元组表存储方法存储,但是当稀疏矩阵中非零元素的位置或者个数经常发生变化时,使用三元组表就不太方便,十字链表存储能够提高访问效率,这种方法不仅为稀疏矩阵的每一行设置一个单独的行循环链表,同样也为每一列设置一个单独的列循环链表。这样,稀疏矩阵中的每一个非零元素同时包含在两个链表中,即包含在它所在的行链表和所在的列链表中,也就是两个链表的交汇处。 稀疏矩阵的链接点构造有5个域值:row,

CaryaLiu的专栏 1万+

NVIDIA Isaac Sim 入门教程(一)

文档分为以下几个部分: 简介、安装指南、API 文档、教程、手册和参考资料。简介部分是对 Omniverse Isaac Sim 的基本概述,以及它如何融入 NVIDIA Omniverse™ 生态系统。它还概述了 Omniverse Isaac Sim 的架构、工作流程和文档布局。

机器人控制与仿真应用 1万+

AI Agent开发第82课-手把手教你把paddleocr-vl做成mcp使其在DIFY里运行

本文详解如何将国产顶尖多模态 OCR 模型 PaddleOCR-VL 封装为标准 MCP(Model Calling Protocol)服务,并通过自研的 HTTP-based MCP Client 接入 Dify 1.10,实现 AI Agent 在对话中自动识别并调用 OCR 能力。该方案已在某头部保险公司真实业务流程中落地,使用了当前最先进的“Agentic AI 原生”设计思想。

打造全国最全的AI Agent开发知识领域的博客 1626

稀疏矩阵的三元组表与十字链表存储

三元组表和十字链表存储稀疏矩阵,并进行矩阵的加、乘法、转置等操作 三元组表:存储稀疏矩阵的非零元素,以及该元素所在的行、列信息,极大的节省了空间(如相比于一般的二维数组的存储),而且三元组表的某些算法的时间效率也要优于经典算法,如基于三元组表的一次快速转置算法等等 十字链表:当要进行矩阵的加、减、乘等运算时,有时非零元素的位置会发生很大的变化,三元组表位保持以行或列序为主而大量移动元素

lu的博客 1万+

168、OIS光学防抖系统设计:陀螺仪标定、音圈马达驱动与滚珠式/悬丝式结构选型

本文总结了OIS光学防抖系统设计中的关键问题与解决方案。作者通过实际案例指出,陀螺仪标定需重视零偏、灵敏度和温度补偿问题,音圈马达驱动需采用电流环控制并优化相位补偿。在机械结构选型方面,滚珠式适合大角度补偿但存在回差问题,悬丝式精度高但受重力影响,需根据应用场景选择。系统联调建议从开环到闭环逐步验证,注意陀螺仪与驱动频率匹配。最后给出5条经验建议:关注陀螺仪信噪比而非分辨率、预留标定余量、重视机械结构公差、配备专业调试工具、协调OIS与电子防抖的分工配合。文章强调OIS调试需针对不同模组特性进行反复测试与标

zzfmlxs的博客 46

用十字链表存储 稀疏矩阵乘法

//稀疏矩阵乘法 用十字链表存储 C=A*B 输出C; Z1240 还出现超时 #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; typedef struct mnode { int row,col,v; struct mnode *down,*right; }MNode; typedef struct { int mu,nu,...

he91-com 681

Winform从入门到精通(38)——StatusStrip(史上最全)

本文介绍StatusStrip控件的详细用法,包含所有属性和事件,绝对史上最全!

qq_34059233的博客 2759

量化 insider 爆料! 散户打板必亏?(打板必看!量化资金如何“隔日砸盘”收割散户)

量化开发 insider 爆料💥 散户追的涨停板📉,可能是机构故意做的陷阱!本文从技术视角拆解“涨停陷阱”,帮你看清市场真实逻辑🧠。

XiaoqiangClub的博客 459

数据结构31——稀疏矩阵十字链表实现A+B

实验2.3:稀疏矩阵加法,用十字链表实现C=A+BTime Limit: 3000ms, Memory Limit: 10000KB , Accepted: 0, Total Submissions: 0Description输入两个稀疏矩阵,输出它们相加的结果。Input第一行输入四个正整数,分别是两个矩阵的行m、列n、第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数t2。接下来...

chengchencheng的博客 1289

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数据结构:稀疏矩阵的十字链表存储

//-----------------稀疏矩阵的十字链表存储------------------- #include #include using namespace std; typedef int ElemType; typedef struct CLNode { int row; int col; ElemType e; struct CLNode* right;//指向同一

憧憬,思考,奋斗,飞翔 1328

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

稀疏矩阵的十字链表存储表示

除了用三元组顺序表来存储压缩矩阵,我们还可以用链表结构来存储,实际上后者应用更广泛, 因为当非零元素的数目较大时,三元组的时间复杂度实在太高。链表结构中最常见的是十字链表, 在十字链表中,稀疏矩阵每一行用一个带头结点的循环链表表示,每一列也用一个带头结点的循环链表表示。 在这个结构中,除头结点外,每个结点都代表矩阵中的一个非零元素, 它由5个域组成:行域(row),列域(col),数据域(data),向下域(down)和向右域(right)。

QiaoRuoZhuo的专栏 4019

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

稀疏矩阵十字链表类java_稀疏矩阵的十字链表存储表示和实现

1 #include 2 #include 3 typedef int ElemType;//稀疏矩阵的十字链表存储表示4 typedef structOLNode5 {6 int i,j; //该非零元的行和列下标7 ElemType e; //非零元素值8 struct OLNode *right,*down; //该非零元所在行表和列表的后继链域9 }OL...

weixin_27066963的博客 511

C语言数据结构学习——数组和广义表

C语言数据结构之数组及广义表基础

m0_63094069的博客 2300
上一篇: MFC与坦克大战系列(奇迹冬瓜)---chapter2(photoshop与TransparentBlt---快速生成背景与透明位图处理)
下一篇: c语言版数据结构(奇迹冬瓜)-数组和广义表(十字链表稀疏矩阵的加法)
utral董东东
博客等级 码龄16年 158粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值