第四章数组与矩阵.ppt
文本预览下载声明
稀疏矩阵的 链式实现 稀疏矩阵的链式实现 用一维数组来描述稀疏矩阵所存在的缺点 当我们创建这个一维数组时,必须知道稀疏矩阵中的非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 )
显示全部