當陣列中非零元素非常少時,我們可以稱之為稀疏矩陣。為了減少空間的浪費,在儲存稀疏矩陣的時候,我們對它進行壓縮儲存,即指儲存非零資訊。
在儲存稀疏矩陣的時候,除了儲存非零元素的值,還需要儲存其行列號i和j,故每個非零元素要用乙個三元組(i, j, v)來描述。因為要與矩陣的對應關係,我們還需要在三元組表中增設非零元素的個數和矩陣行列大小。
那麼,稀疏矩陣的陣列表達如下所示。
struct crossnode
};class crosslist
當三元組按行列序組成乙個線性表,如果陣列的非零元素個數較大,元素定位的效率就會比較低下。為此,我們可以採用行列兩個方向交叉的十字鍊錶,來表示稀疏矩陣。
//節點結構
struct crossnode
};typedef struct crossnode clnode, *crossline;
//十字鍊錶
class crosslist
crosslist(vector< vector> &arr);
//...
private:
//...
int row, col, count;
crossline *rowhead, *colhead;
};
這裡需要注意的是,十字鍊錶結構裡的rowhead和colhead的型別是corssline *,也就是crossnode * * 。
如果把它們設定為crossnode *型別,那麼後期元素的定位和訪問需要行和列的遍歷,效率不高。
#include #include using namespace std;
//node denifition
struct crossnode
};typedef struct crossnode clnode, *crossline;
//orthogonal list definition
class crosslist
crosslist(vector< vector> &arr);
void insert(clnode* &node);
void print();
int getcount();
private:
void insertintorow(clnode* &node);
void insertintocolumn(clnode* &node);
void createsparsematrix(vector< vector> &arr);
int row, col, count;
crossline *rowhead, *colhead;
};//constructor
crosslist::crosslist(vector< vector> &arr)
//insertion
void crosslist::insert(clnode* &node)
//update rowhead when insertion
void crosslist::insertintorow(clnode* &node)
else
else
if(!cur->right)
else
} }}//update colhead when insertion
void crosslist::insertintocolumn(clnode* &node)
else
else
if(!cur->down)
else
} }}//store sparse matrix
void crosslist::createsparsematrix(vector< vector> &arr)
} }}//print sparse matrix
void crosslist::print()
else cout << "0 ";
++n;
} cout << endl; }}
int crosslist::getcount()
//test case
int main(),
, ,
, }; crosslist testlist(arr);
testlist.print();
}
十字鍊錶 稀疏矩陣
include includetypedef struct olnode olnode,olink typedef struct 行和列煉表頭指標向量基址,由creatsmatrix ol 分配 crosslist 初始化m crosslist型別的變數必須初始化,否則建立 複製矩陣將出錯 bool...
稀疏矩陣的建立 十字鍊錶
一 概念 既然要用鍊錶節點來模擬矩陣中的非零元素,肯定需要如下5個元素 row,col,val,down,right 其中 row 矩陣中的行。col 矩陣中的列。val 矩陣中的值。right 指向右側的乙個非零元素。down 指向下側的乙個非零元素。現在我們知道單個節點該如何表示了,那麼矩陣中同...
稀疏矩陣相加(十字鍊錶儲存)
標頭檔案 linklist.h inte ce for the linklist class.if defined afx linklist h 0f0cca3e d836 4bb4 9030 b548558fc57e included define afx linklist h 0f0cca3e ...