- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
I第九讲(十字链表及基本操作)
数据结构与算法 ---第九讲 北方民族大学 计算机科学与工程学院 王伦津 研究员 9、十字链表及基本操作 目 录 本讲小结 思考与练习 * * 十字链表及基本操作 本讲重点:以稀疏矩阵为例介绍一种特殊链表---十字链表的存储方式。并且将十字链表作为一个对象,定义存储结构和基本操作,给出它的C++描述。 十字链表一般用于存储正交关系,即类似于矩阵的结构。 9.1十字链表的存储方式 9.2十字链表对象 9.3十字链表基本操作的实现 9.1 十字链表 下面介绍一种特殊的链表──十字链表,它常用于表示稀疏矩阵,可视作稀疏矩阵的一种链式表示,因此,这里以稀疏矩阵为背景介绍十字链表。不过,十字链表的应用远不止稀疏矩阵,一切具有正交关系的结构,都可用十字链表存储。 9.1.1 存储方式 (a)稀疏矩阵中每个非0元素对应一个十字链表结点,每个结点的结构为:? 其中各字段的含意为:row──元素在稀疏矩阵中的行号col──元素在稀疏矩阵中的列号val──元素值down──指向同列中下一个非0元素结点right──指向同行中下一个非0元素结点 val col right down row (b)每行/列设一个表头结点(结构同元素结点),以down/right为链构成循环链表,即第i列头结点的down指向该列上第1个非0元素,第i 行头结点的right指向该行第1个非0元素。第i列/行上最后一个结点的down/right指向该列/行的头结点。若某列/行中无非0元素,则令它的头结点down/right域指向自己。 (c)设一个总头结点(结构同元素结点),令总头结点和各个列/行头结点用val字段,按列/行序构成一个循环单链表。 (d)可令总头结点的row,col与val 分别表示矩阵的最大行号、列号与非0元素个数,而down/right指向第1列/行的头结点。该总头结点可作为整个十字链表的代表。 (e)由于行与列的头结点分别使用right域与down域(不同时使用),故第i列与第i 行头结点可合用同一个头结点(对所有可能的i),以节省存储空间。 (f)有时,为了快速访问行/列头结点,设置一个一维数组headNodes[] ,使headNodes[i]指向i行/列的头结点。但这并不是必须的,因为各行/列的头结点已形成了一个循环单链表,故若已知十字链表总头结点,即可搜索到任一头结点。 例9-1设有一个如下形式的矩阵,它所对应的十字链表如图9-1所示。 4 5 7 1 2 2 1 3 2 4 2 5 0 1 1 1 3 5 2 2 2 1 1 2 4 1 3 2 3 1 2 3 3 4 4 2 4 2 1 4 4 2 图 9?1十字链表示意图 中间部分为各非零元素,左上角标识矩阵的行列数,左边其余元素标识行号和该行实有非零元素个数,顶行元素对应标识列号及各列非零元素个数。 9.2 十字链表对象 首先,定义十字链表结点TCrossNode,为了兼容比较运算、赋值运算和标准输出运算等,还定义了相应的运算符重载。template class TElem struct TCrossNode //十字链表结点类型{ long row, col; //行号、列号union { //让val和next共享一块存储空间,即一块空间,两个名字 TElem val; //元素值 TCrossNode *next; //用于将头结点链为链表 }; TCrossNode *down, *right; //列/行指针 operator ==( TCrossNode oo) //重定义恒等运算 { return (row == oo.row col==oo.col val==oo.val); };? TCrossNode operator =( TCrossNode oo) //重定义赋值运算 { this-row = oo.row; this-col = oo.col; this-val = oo.val;
原创力文档


文档评论(0)