資料結構 十字鍊錶之稀疏矩陣的儲存

2021-09-11 02:52:35 字數 2265 閱讀 2040

當陣列中非零元素非常少時,我們可以稱之為稀疏矩陣。為了減少空間的浪費,在儲存稀疏矩陣的時候,我們對它進行壓縮儲存,即指儲存非零資訊。

在儲存稀疏矩陣的時候,除了儲存非零元素的值,還需要儲存其行列號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 ...