程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一步一步寫算法(之圖的保存)

一步一步寫算法(之圖的保存)

編輯:關於C語言

 

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。  聯系信箱: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;

    有了上面的數據結構,那麼從外層加載數據就是一個逆向操作而已,不再復雜了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved