5.3稀疏矩阵的十字链表存储
十字链表产生原因:当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储结构来表示三元组的线性表。
十字链表特点:
每一个非零元开用含5个域的结点表示,其中i、j和e这3个域分别表示该非零元所在行、列和非零元的值,向右域用以链接同一行中下一个非零元,向下域down用以链接用列中的下一个非零元。
如下稀疏矩阵的十字链表表
下面这图是M的非零元:
下面是稀疏矩阵的十字链表存储
下面是代码(此代码和书上不同,书上的有几个地方错误,下面的代码是修改后的代码)
typedef struct{int i, j; //该非零元的行和列下标ElemType e;struct OLNode *right, *down;
}OLNode,*OLink;typedef struct{OLink rhead, chead; //行和列链表头指针向量基址由CreateSMatrix分配int mu, nu, tu; //稀疏矩阵的行数、列数和非零元个数
}CrossList;
下面是创建稀疏矩阵M,采用十字链表存储
算法5.4:
代码如下:
Status CreateSMatrix_OL(CrossList &M)
{// 创建稀疏矩阵M。采用十字链表存储表示。// if (M) free(M);// scanf(&m, &n, &t ); // 输入M的行数、列数和非零元个数OLNode *p, *q;int i, j, e;int m = random(4, 6), n = random(4, 6), t = random(4, 5);M.mu = m; M.nu = n; M.tu = t;if (!(M.rhead = (OLink *)malloc((m + 1)*sizeof(OLink)))) return ERROR;if (!(M.chead = (OLink *)malloc((n + 1)*sizeof(OLink)))) return ERROR;for (int a = 1; a <= m; a++) // 初始化行列头指针向量;各行列链表为空链表M.rhead[a] = NULL;for (int b = 1; b <= n; b++) M.chead[b] = NULL;for (int c = 1; c <= t; c++) { // 按任意次序输入非零元scanf(&i, &j, &e);if (!(p = (OLNode *)malloc(sizeof(OLNode))))return ERROR;p->i = i; p->j = j; p->e = e; p->down = NULL; p->right = NULL; // 新结点if (M.rhead[i] == NULL || M.rhead[i]->j > j) {p->right = M.rhead[i]; M.rhead[i] = p;}else { // 寻查在行表中的插入位置for (q = M.rhead[i]; (q->right) && (q->right->j<j); q = q->right);p->right = q->right; q->right = p;} // 完成行插入if (M.chead[j] == NULL || M.chead[j]->i > i){p->down = M.chead[j]; M.chead[j] = p;}else { // 寻查在列表中的插入位置for (q = M.chead[j]; (q->down) && q->down->i < i; q = q->down);p->down = q->down; q->down = p;} // 完成列插入} // forreturn OK;
} // CreateSMatrix_OL
下面来分析下这个代码:
此代码最好的理解方法是结合上面的那个图5.6。
那么现在就带大家了解下这个函数的思路,这个函数调用了random这是产生随机数,在stdlib.h中,它把行和列和非零元随机化,然后行和列链表,开辟空间,这里要注意的是,行指针开辟的个数是和列有关,列指针开辟的个数和行有关,大家在那两个if语句中就能明显的看到。
随后紧跟的那两个for循环是对链表的初始化为NULL。
接下来是参数了输入非零元,这里的思路其实就是把非零元结构体初始化了后看看他应该插到什么位置,举个例子,大家看图5.6,第一行,第一列,值为3,那个非零元,就是把M.chead[1]->down指向了他,M.rhead[1]->right指向了它,如果是第三行,第一列,值为2的那个呢?就要把,第一行,第一列,值为3的非零元的down指向他,下面那个for循环就是这个思路。
5.3稀疏矩阵的十字链表存储相关推荐
- 稀疏矩阵的十字链表存储表示和实现(第五章 P104 算法5.4)
稀疏矩阵的十字链表存储 当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储结构来表示三元组的线性表.对这种类型的矩阵,采用链式存储结构表示三元组的线性表更为恰当. 在链表中,每个非零元 ...
- 稀疏矩阵十字链表类java_稀疏矩阵的十字链表存储表示
typedef struct OLNode{ int i,j; //该非零元的行列下标 ElemType e; struct OLNode *right ...
- 稀疏矩阵建立十字链表c语言,实验6-稀疏矩阵十字链表的存储.doc
实验6-稀疏矩阵十字链表的存储.doc -/电子信息学院实验报告书课程名 数据结构 题 目 稀疏矩阵十字链表的存储 实验类别 设计 班 级 BX1001 学 号 24 姓 名 肖望龙 2011年 10 ...
- c语言建立并存储树,利用十字链表存储树结构(便于同时求出某一点的入度与出度)------C语言实现...
#include #include #include /* 利用十字链表存储有向图,可用于同时查找某个顶点的出度与入度: */ typedef struct edge {//顶点表 int headv ...
- 图十字链表并求度c语言,利用十字链表存储树结构(便于同时求出某一点的入度与出度)------C语言实现...
#include #include #include /* 利用十字链表存储有向图,可用于同时查找某个顶点的出度与入度: */ typedef struct edge{//顶点表 int headve ...
- 有向图的十字链表存储
/* c7-3.h 有向图的十字链表存储表示 */#define MAX_VERTEX_NUM 20typedef struct ArcBox{int tailvex,headvex; /* 该弧的尾 ...
- 图的十字链表存储结构
前面介绍了图的邻接表存储法,本节继续讲解图的另一种链式存储结构--十字链表法. 与邻接表不同,十字链表法仅适用于存储有向图和有向网.不仅如此,十字链表法还改善了邻接表计算图中顶点入度的问题. 十字链表 ...
- 图的十字链表存储法详解
前面介绍了图的邻接表存储法,本节继续讲解图的另一种链式存储结构--十字链表法. 与邻接表不同,十字链表法仅适用于存储有向图和有向网.不仅如此,十字链表法还改善了邻接表计算图中顶点入度的问题. 十字链表 ...
- 稀疏矩阵的三元组表与十字链表存储
三元组表:存储稀疏矩阵的非零元素,以及该元素所在的行.列信息,极大的节省了空间(如相比于一般的二维数组的存储),而且三元组表的某些算法的时间效率也要优于经典算法,如基于三元组表的一次快速转置算法等等 ...
最新文章
- 【MySQL】ubuntu16.04安装mysql,然后源码编译Qt5.12.4版本的libqsqlmysql.so
- hibernate 复合主键 根据主键删除_hibernate封装Utils工具类
- 博威特瞄准数据备份市场
- java Datasource,数据库连接池
- BugkuCTF-Misc:Linux
- UNIX再学习 -- 文件和目录
- HTML5培训教程学习之动效制作
- SQL SERVER学习笔记(二)数据库管理
- 极简实用的Asp.NetCore模块化框架决定免费开源了
- .Neter们,你真的应该了解下EFCore3.x
- oracle 创建表空间_Oracle 创建和管理表
- treewidget怎么设置某一个item拖动的_如何零基础撸一个专车小程序?看这一文就够了!...
- 简述写基础java小游戏一般思路。
- 用曲率,挠率反求曲线方程!(作业捷径篇 续集)
- macbook pro安装JDK
- 远程桌面远程控制工具分享
- Glide图片框架使用详细介绍(一),手握5家大厂offer
- web木马检测系统的设计与实现
- golang vendor目录
- 企业微信无缘无故被封