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

        最近比较清闲,看了点关于模板的书,顺便写了点数据结构。有兴趣的朋友可以一起测试一下,并热烈欢迎朋友们一起讨论,斧正。
 
        注:1、这个文件中包含两种结构的图,都是基于邻接表的。测试数据相同,所得结果相同。
                2、图比较复杂,分几个部分发吧(其实是没有写完),本次发的源码包括了图的基本操作。下一部分将涉及到图的遍历以及图的连通性,最小生成树等属性和应用的相关算法。
                3、编译/测试环境:vs2005+boost
 
        本图的数据结构与通常数据结构书籍上介绍的并没有多少不同,如果不太理解,可以参考一下相关的书籍或者文章,都进行了详细的介绍(提供一个地址,在线数据结构:[url]http://student.zjzk.cn/course_ware/data_structure/web/tu/tu7.3.1.2.htm[/url])。唯一的一点就是通常书籍上对于边节点的存储是顶点节点在容器(数组)中的索引序号,而本图是通过共享型指针存储的,即顶点节点和边节点指向相同的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;
    };
======================================================================
。。。。。。
。。。。
。。
 

你可能感兴趣的:(职场,休闲,C++模板)