一步一步写算法(之图的保存)

原贴地址:http://blog.csdn.net/feixiaoxing/article/details/6929586

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】


    前面的几篇博客,我们对图进行基本定义,同时介绍了图的创建、图的添加和删除等。今天,我们聊一聊图是怎么在存储在外设中的。这些外接设备可以是各种类型的,比如说,可以是硬盘、sd卡、网络硬盘等等。本质上说,我们今天讨论的主题就是怎么把图的数据永久地保留在本地。并且,如果需要加载这些数据,也可以快速恢复图原来的面貌。对图数据结构已经记得不太清楚的朋友可以复习一下面的代码,回想一下我们之前的定义方法。

[cpp]  view plain copy
  1. typedef struct _LINE  
  2. {  
  3.     int end;  
  4.     int weight;  
  5.     struct _LINE* next;  
  6. }LINE;  
  7.   
  8. typedef struct _VECTEX  
  9. {  
  10.     int start;  
  11.     int number;  
  12.     LINE* neighbor;  
  13.     struct _VECTEX* next;  
  14. }VECTEX;  
  15.   
  16. typedef struct _GRAPH  
  17. {  
  18.     int count;  
  19.     VECTEX* head;  
  20. }GRAPH;  
    数据结构中有好多的指针。那么在外存中应该怎么保存呢?因为对于外存来说,指针是没有什么意义的。大家稍微思考其实就明白了。其实我们可以把这些指针全部看成是偏移值。GRAPH是有许多的点构成的,点的结构中有很多的边连接,那么我们就可以按照下面的顺序保存数据。

[cpp]  view plain copy
  1. /* 
  2. *    --------------------------------------------------------------------------- 
  3. *    | GRAPH | vectex1 | vectex2 | ...... | vectex n   | LINE1 |......| LINE n | 
  4. *    --------------------------------------------------------------------------- 
  5. */  
    那么偏移值怎么安排呢?

    a)GRAPH结构

   head为第一个vectex的偏移地址。


    b)VECTEX结构

    neighbour记录了第一条边的偏移位置,next记录了下一个节点的偏移值。


    c)LINE结构

    next为下一条边的偏移值。


    但是,如果我们做一些优化的话,那么保存的数据还要少一些。比如说,第一个vectex的节点就在GRAPH的后面,那么head实际上不需要保存;同时在vectex结构中,因为我们需要知道LINE的偏移值,所以neighbour的偏移是需要知道的,但是next就不再需要了,因为vectex数据本身就是并列在一起的;最后同样因为我们需要把所有属于同一个vectex的边放在一起,那么LINE结构中的next数据其实也可以省略了。所以修改后保存的数据结构大体应该是这样的:

[cpp]  view plain copy
  1. typedef struct _LINE  
  2. {  
  3.     int end;  
  4.     int weight;  
  5. }LINE;  
  6.   
  7. typedef struct _VECTEX  
  8. {  
  9.     int start;  
  10.     int number;  
  11.     LINE* neighbor;  
  12. }VECTEX;  
  13.   
  14. typedef struct _GRAPH  
  15. {  
  16.     int count;  
  17. }GRAPH;  

    有了上面的数据结构,那么从外层加载数据就是一个逆向操作而已,不再复杂了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值