注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 安装perl模块小窍门
 帮助

图模板(一)——基本操作


2008-07-16 23:51:30
 标签:c++模板   [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://redwolf.blog.51cto.com/427621/88183
        最近比较清闲,看了点关于模板的书,顺便写了点数据结构。有兴趣的朋友可以一起测试一下,并热烈欢迎朋友们一起讨论,斧正。
 
        注:1、这个文件中包含两种结构的图,都是基于邻接表的。测试数据相同,所得结果相同。
                2、图比较复杂,分几个部分发吧(其实是没有写完),本次发的源码包括了图的基本操作。下一部分将涉及到图的遍历以及图的连通性,最小生成树等属性和应用的相关算法。
                3、编译/测试环境:vs2005+boost
 
        本图的数据结构与通常数据结构书籍上介绍的并没有多少不同,如果不太理解,可以参考一下相关的书籍或者文章,都进行了详细的介绍(提供一个地址,在线数据结构:http://student.zjzk.cn/course_ware/data_structure/web/tu/tu7.3.1.2.htm)。唯一的一点就是通常书籍上对于边节点的存储是顶点节点在容器(数组)中的索引序号,而本图是通过共享型指针存储的,即顶点节点和边节点指向相同的Vertex结构值。
        另外由于是基于模板的,所以把结构细化了一下,并单独抽取了关键字作为一个模板参数。基本结构如下:
        顶点(点结构):
        template<typename V, typename K>
        class vertex
        {
         public:
                   ……
         private:
                   V data;
                   K key;
        };
 
       边节点:
        template<typaname V, typename K, typename W>
       arc_node
        {
         public:
                  typedef boost::shared_ptr<VERTEX> VPTR;
                  typedef arc_node<V,K,W> ARCNODE;
                   ……
         private:
                   VPTR _head;//弧头指针
                   W weight;//权值
        };
 
        顶点节点:
        template<typaname V, typename K, typename W>
        vertex_node
        {
         public:
                   typedef typename arc_node<V,K,W>::VPTR VPTR;
                   typedef std::list<ARCNODE> ARCLIST;
                   ……
         private:
                   VPTR _tail;//狐尾(顶点)指针
                   ARCLIST arcslist;//出边节点列表
                  
                   friend class graph<V,K,W>;//可直接访问vertex_node的私有成员
        };
 
        图结构:
        template<typaname V, typename K, typename W>
        graph
        {
         public:
                   typedef std::vector<VERTEXNODE> VERTEXVECTOR;   
                   ……
         private:
                   VERTEXVECTOR vertex_vector;
        };
 
       图由一个装载顶点节点的容器vector构成;
       顶点节点有一个vertex结构的共享型指针(shared_ptr)和一个出边节点列表(list)。
       边节点有一个vertex结构的共享型指针(shared_ptr)和一个权值W
       vertex结构,一个简单的数据结构,包含V和K。
 
       这里应用了boost的shared_ptr简化了内存操作的很多复杂内容。关于boost的shared_ptr,大家可以参考一些资料。我这里也转贴一个,希望对大家有一些帮助。
      
======================================================================
template<typename V, typename K, typename W> class graph;
    template<typename V, typename K, typename W> class vertex_node;
  
    template<typename V, typename K>
    class vertex//顶点
    {
    public:
  //简化类型名称长度
  typedef vertex<V,K> VERTEX;

  //构造
  vertex(const V& v=V(), const K& k=K()):data(v), key(k){}
  
  //拷贝构造
  vertex(const VERTEX& other):data(other.data), key(other.key){}
  
  //析构
  virtual ~vertex(){}
  
  //重载=(由于没有指针成员,所以也可以不用重载)
  VERTEX& operator=(const VERTEX& rhs){
      if(&rhs!=this){
    this->destroy();
    this->data=rhs.data;
    this->key=rhs.key;
      }  
      return *this;
  }

  //获取key
  inline K get_key()const{
      return key;  
  }
  
  //获取顶点的数据
  inline V get_data()const{
      return data;
  }

  //设置key值
  inline void set_key(const K& k){
      key=k;
  }

  //设置顶点数据
  inline void set_data(const V& v){
      data=v;
  }

    protected:
  void destroy(){}

    private:
  V data;
  K key;
    };
======================================================================
。。。。。。
。。。。
。。
 

本文出自 “狼窝” 博客,请务必保留此出处http://redwolf.blog.51cto.com/427621/88183


附件下载:
  graph.h


 下一篇 栈模板



    文章评论
 
2008-07-17 09:48:36
建议多加一些文字讲解

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: