1、稀疏矩阵的存储压缩 0000280000000091039000000006000017000110150022000A76 2.4 稀疏矩阵稀疏矩阵 r ro ow w c co ol l v va al lu ue e0000015003901700000000006022280000000001100910000B 0000280000000091039000000006000017000110150022000A6776 行行行行(r ro ow w)列列列列(c co ol l)值值值值(v va al lu ue e)行行行行(r ro ow w)列列列列(c co ol l)值值
2、值值(v va al lu ue e)0 0 0 3 3 2 22 2 0 0 0 4 4 9 91 1 1 0 0 6 6 1 15 5 1 1 1 1 1 1 11 1 2 1 1 1 1 1 11 1 2 2 2 5 5 2 28 8 3 1 1 5 5 1 17 7 3 3 3 0 0 2 22 2 4 2 2 3 3 -6 6 4 3 3 2 2 -6 6 5 3 3 5 5 3 39 9 5 5 5 1 1 1 17 7 6 4 4 0 0 9 91 1 6 5 5 3 3 3 39 9 7 5 5 2 2 2 28 8 7 6 6 0 0 1 16 6 行行行行(r ro ow
3、w)列列列列(c co ol l)值值值值(v va al lu ue e)行行行行(r ro ow w)列列列列(c co ol l)值值值值(v va al lu ue e)0 0 0 3 3 2 22 2 0 0 0 4 4 9 91 1 1 0 0 6 6 1 15 5 1 1 1 1 1 1 11 1 2 1 1 1 1 1 11 1 2 2 2 5 5 2 28 8 3 1 1 5 5 1 17 7 3 3 3 0 0 2 22 2 4 2 2 3 3 -6 6 4 3 3 2 2 -6 6 5 3 3 5 5 3 39 9 5 5 5 1 1 1 17 7 6 4 4 0 0 9
4、 91 1 6 5 5 3 3 3 39 9 7 5 5 2 2 2 28 8 7 6 6 0 0 1 16 610000 0 1 2 3 4 5 6 语语 义义rowSize 1 1 1 2 0 2 1 矩矩阵阵 A 各各列列非非 零零元元素素个个数数rowStart 0 1 2 3 5 5 7 矩矩阵阵 B 各各行行开开 始始存存放放位位置置 for(int i=0;i Cols;i+)rowSizei=0;for(i=0;i Terms;i+)rowSizesmArrayi.col+;rowStart0=0;for(i=1;i (istream&,Matrix&);/矩阵输入重载函数矩阵
5、输入重载函数private:MatrixNode*down,*right;/列列/行链指针行链指针 Boolean head;/结点类型结点类型 Union Triple triple;MatrixNode*next;/矩阵元素结点矩阵元素结点(False)或链头结点或链头结点(True)MatrixNode(Boolean,Triple*);/结点构造函数结点构造函数MatrixNode:MatrixNode(Boolean b,Triple*t)/矩阵结点构造函数矩阵结点构造函数 head=b;/结点类型结点类型 if(b)right=next=this;else triple=*t;ty
6、pedef MatrixNode*MatrixNodePtr;/一个指针数组一个指针数组,用于建立稀疏矩阵用于建立稀疏矩阵class Matrix friend istream&operator (istream&,Matrix&);/矩阵输入矩阵输入public:Matrix();/析构函数析构函数private:MatrixNode*headnode;/稀疏矩阵的表头稀疏矩阵的表头;istream&operator (istream&is,Matrix&matrix)Triple s;int p;is s.row s.col s.value;/输入矩阵的行数输入矩阵的行数,列数和非零元素个
7、数列数和非零元素个数 if(s.row s.col)p=s.row;else p=s.col;/取行、列数大者取行、列数大者 matrix.headnode=/整个矩阵表头结点整个矩阵表头结点 new MatrixNode(False,&s);if(!p)/零矩阵时零矩阵时 matrix.headnoderight=matrix.headnode;return is;MatrixNodePtr*H=new MatrixNodePtr(p);/建立表头指针数组建立表头指针数组,指向各链表的表头指向各链表的表头 for(int i=0;i p;i+)Hi=new MatrixNode(True,0
8、);int CurrentRow=0;MatrixNode*last=H0;/当前行最后结点当前行最后结点 for(i=0;i t.row t.col t.value;/输入非零元素的三元组输入非零元素的三元组 if(t.row CurrentRow)/如果行号大于当前行如果行号大于当前行,闭合当前行闭合当前行 lastright=HCurrentRow;CurrentRow=t.row;last=HCurrentRow;last=lastright=/链入当前行链入当前行 new MatrixNode(False,&t);Ht.colnext=Ht.colnextdown =last;/链入
9、列链表链入列链表 lastright=HCurrentRow;/闭合最后一行闭合最后一行 /闭合各列链表闭合各列链表 for(i=0;i s.col;i+)Hinextdown=Hi;/链接所有表头结点链接所有表头结点 for(i=0;i p-1;i+)Hinext=Hi+1;Hp-1next=matrix.headnode;matrix.headnoderight=H0;delete H;return is;if(first!=NULL)CircListNode*second=firstlink;firstlink=av;av=second;first=NULL;if(av=NULL)newnode=new CircListNode;else newnode=av;av=avlink;avnewnodeavMatrix:Matrix()if(headnode=NULL)return;MatrixNode*x=headnoderight,*y;headnoderight=av;av=headnode;while(x!=headnode)y=xright;xright=av;av=y;x=xnext;headnode=NULL;