- 1、本文档共77页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章数组与矩阵
稀疏矩阵的 链式实现 稀疏矩阵的链式实现 用一维数组来描述稀疏矩阵所存在的缺点 当我们创建这个一维数组时,必须知道稀疏矩阵中的非0元素总数。 一基于指针的描述这种方法需要额外的指针存储空间,但可以节省对数组描述中其他一些信息的存储。 最重要的是,它可以避免存储的再分配以及部分结果的复制。 稀疏矩阵的链式实现 链表描述的一种可行方案是把每行的非0元素串接在一起,构成一个链表。每个结点代表稀疏矩阵中的一个非0元素,它有三个域: c o l(非0元素所在列号)、v a l u e(非0元素的值)和l i n k(指向下一个结点的指针)。仅当矩阵某行中至少包含一个非0元素才会为该行创建一个链表。在行链表中,每个节点按其col值的升序进行排列。 用另外一个链表把所有的行链表收集在一起,如图中的阴影节点所示。每个阴影节点也有三个域:row、link(指向下一个阴影节点的指针)和a(指向行链表, a.first 指向行链表中的第一个节点)。各阴影节点按其row值的升序排列。每个阴影节点可以被视为一个行链表的头节点,因此阴影链表可以被视为头节点链表。空的头节点链表代表没有非0元素的矩阵。 行结点类型 templateclass T class CNode { public : int operator !=(const CNodeT y) {return (value != y. value ) ; } void Output(ostream out) const {out column col value value;} private : int col; T value; } ; templateclass T ostream operator(ostream out, const CNodeT x) {x.Output(out); out endl; return out;} 行链表的头结点 templateclass T class HeadNode { public : int operator !=(const HeadNodeT y) {return (row != y. row ) ; } void Output(ostream out) const {out row row;} private : int row; ListCNodeT a; //行链表 } ; templateclass T ostreamoperator(ostream out, const HeadNodeT x) {x.Output(out); out endl; return out;} 用链表描述稀疏矩阵的类定义 templateclass T class LinkedMatrix { friend ostream operator(ostream, const LinkedMatrixT); friend istream operator (istream, LinkedMatrixT); public : LinkedMatrix( ) { } 用链表描述稀疏矩阵的类定义 ~ LinkedMatrix ( ) { } void Transpose(LinkedMatrixT b) const; void Add(Const LinkedMatrixT b, LinkedMatrixT c) const; private : int rows, cols; // 矩阵维数 ListHeadNodeT a; // 头节点链表 } ; 重载运算符 templateclass T istream operator(istream in, LinkedMatrixT x){ x.a.Erase(); int terms; cout “Enter number of rows, columns, and terms endl; in x.rows x.cols terms; HeadNodeT H; H.row = 0; for (int i = 1; i = terms; i++) { cout Enter row, column, and value of term i endl; int row, col; T value; in row col value; if (row H.row) { if (H.row) x.a.Append(H); H.row = row; H.a.Zero();} CNodeT *c = new CNodeT; c-col = col; c-value = value; H.a. Append ( * c )
文档评论(0)