【 聲明:版權所有,歡迎轉載,請勿用於商業用途。 聯系信箱:feixiaoxing @163.com】
前面的幾篇博客,我們對圖進行基本定義,同時介紹了圖的創建、圖的添加和刪除等。今天,我們聊一聊圖是怎麼在存儲在外設中的。這些外接設備可以是各種類型的,比如說,可以是硬盤、sd卡、網絡硬盤等等。本質上說,我們今天討論的主題就是怎麼把圖的數據永久地保留在本地。並且,如果需要加載這些數據,也可以快速恢復圖原來的面貌。對圖數據結構已經記得不太清楚的朋友可以復習一下面的代碼,回想一下我們之前的定義方法。
typedef struct _LINE
{
int end;
int weight;
struct _LINE* next;
}LINE;
typedef struct _VECTEX
{
int start;
int number;
LINE* neighbor;
struct _VECTEX* next;
}VECTEX;
typedef struct _GRAPH
{
int count;
VECTEX* head;
}GRAPH;
typedef struct _LINE
{
int end;
int weight;
struct _LINE* next;
}LINE;
typedef struct _VECTEX
{
int start;
int number;
LINE* neighbor;
struct _VECTEX* next;
}VECTEX;
www.2cto.com
typedef struct _GRAPH
{
int count;
VECTEX* head;
}GRAPH; 數據結構中有好多的指針。那麼在外存中應該怎麼保存呢?因為對於外存來說,指針是沒有什麼意義的。大家稍微思考其實就明白了。其實我們可以把這些指針全部看成是偏移值。GRAPH是有許多的點構成的,點的結構中有很多的邊連接,那麼我們就可以按照下面的順序保存數據。
/*
* ---------------------------------------------------------------------------
* | GRAPH | vectex1 | vectex2 | ...... | vectex n | LINE1 |......| LINE n |
* ---------------------------------------------------------------------------
*/
/*
* ---------------------------------------------------------------------------
* | GRAPH | vectex1 | vectex2 | ...... | vectex n | LINE1 |......| LINE n |
* ---------------------------------------------------------------------------
*/ 那麼偏移值怎麼安排呢?
a)GRAPH結構
head為第一個vectex的偏移地址。
b)VECTEX結構
neighbour記錄了第一條邊的偏移位置,next記錄了下一個節點的偏移值。
c)LINE結構
next為下一條邊的偏移值。
但是,如果我們做一些優化的話,那麼保存的數據還要少一些。比如說,第一個vectex的節點就在GRAPH的後面,那麼head實際上不需要保存;同時在vectex結構中,因為我們需要知道LINE的偏移值,所以neighbour的偏移是需要知道的,但是next就不再需要了,因為vectex數據本身就是並列在一起的;最後同樣因為我們需要把所有屬於同一個vectex的邊放在一起,那麼LINE結構中的next數據其實也可以省略了。所以修改後保存的數據結構大體應該是這樣的:
typedef struct _LINE
{
int end;
int weight;
}LINE;
typedef struct _VECTEX
{
int start;
int number;
LINE* neighbor;
}VECTEX;
typedef struct _GRAPH
{
int count;
}GRAPH;
typedef struct _LINE
{
int end;
int weight;
}LINE;
typedef struct _VECTEX
{
int start;
int number;
LINE* neighbor;
}VECTEX;
typedef struct _GRAPH
{
int count;
}GRAPH;
有了上面的數據結構,那麼從外層加載數據就是一個逆向操作而已,不再復雜了