原贴地址:http://blog.csdn.net/feixiaoxing/article/details/6929586
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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;
- /*
- * ---------------------------------------------------------------------------
- * | 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;
有了上面的数据结构,那么从外层加载数据就是一个逆向操作而已,不再复杂了。