digraph.cpp

来自「《无线通信系统仿真——c++使用模型》这本书的源代码」· C++ 代码 · 共 181 行

CPP
181
字号
//
//  File = digraph.cpp
//

#include <stdlib.h>
#include <fstream>
#include "digraph.h"
#ifdef _DEBUG
extern std::ofstream *DebugFile;
#endif

//===============================================

DirectedGraph::DirectedGraph( void )
{
  Vertex_List = new std::vector<obj_id_type>;
  Edge_List = new std::vector<obj_id_type>;
  Row_List = new std::deque<std::vector<int>* >;
  Num_Verts = 0;
  Num_Edges = 0;
}
//===============================================
DirectedGraph::~DirectedGraph( void )
{
  delete Vertex_List;
  delete Edge_List;
};
//===============================================
int DirectedGraph::GetNumVerts( void )
{
  return(Num_Verts);
};
//===============================================
int DirectedGraph::GetNumEdges( void )
{
  return(Num_Edges);
};
//===============================================
int DirectedGraph::AddVertex(obj_id_type vertex_id)
{
  int i;
  
  Vertex_List->push_back(vertex_id);
  //------------------------------------
  //  Add row to adjacency matrix

  std::vector<int>* new_row = new std::vector<int>;
  for(i=0; i<Num_Verts; i++)
    {
    new_row->push_back(-1);
    }
  Row_List->push_back(new_row);

  //------------------------------------
  //  Add column to adjacency matrix

  for(i=0; i<=Num_Verts; i++)
    {
    (Row_List->at(i))->push_back(-1);
    }
  Num_Verts++;

  return(Num_Verts-1);
}
//================================================
int DirectedGraph::AddEdge( obj_id_type edge_id,
                            int fm_vtx_num,
                            int to_vtx_num)
{
  Edge_List->push_back(edge_id);

  // insert new_edge_num (==Num_Edges) into
  // adjacency matrix at row fm_vtx_num and column to_vtx_num
  //
  // pointer to the desired row vector: Row_List->at(fm_vtx_num)

  (Row_List->at(fm_vtx_num))->at(to_vtx_num) = Num_Edges;

  Num_Edges++;
  return(Num_Edges-1);
};
//================================================
int DirectedGraph::AddEdge( obj_id_type edge_id,
                            obj_id_type fm_vtx_id,
                            obj_id_type to_vtx_id)
{
  int i, fm_vtx_num, to_vtx_num;
  
  Edge_List->push_back(edge_id);

  // search Vertex_List to find vertex number corresponding
  // to fm_vtx_id

  fm_vtx_num = -1;
  for(i=0; i<Num_Verts; i++)
    {
    if(Vertex_List->at(i) == fm_vtx_id) fm_vtx_num = i;
    }
  if(fm_vtx_num < 0)
    {
    // error: source vertex not found in graph
    return(-1);
    }

  // search Vertex_List to find vertex number corresponding
  // to to_vtx_id

  to_vtx_num = -1;
  for(i=0; i<Num_Verts; i++)
    {
    if(Vertex_List->at(i) == to_vtx_id) to_vtx_num = i;
    }
  if(to_vtx_num < 0)
    {
    // error: destination vertex not found in graph
    return(-1);
    }

  // insert new_edge_num (==Num_Edges) into
  // adjacency matrix at row fm_vtx_num and column to_vtx_num

  (Row_List->at(fm_vtx_num))->at(to_vtx_num) = Num_Edges;

  Num_Edges++;
  return(Num_Edges-1);
};
//================================================
int DirectedGraph::GetEdgeNum(int fm_vtx_num,
                              int to_vtx_num)
{
  int edge_num;
  edge_num = (Row_List->at(fm_vtx_num))->at(to_vtx_num);
  return(edge_num);
}
//================================================
int DirectedGraph::GetEdgeNum(obj_id_type edge_id)
{
  int edge_num = -1;
  for(int i=0; i<Num_Edges; i++)
    {
    if( Edge_List->at(i) == edge_id ) edge_num = i;
    }
  if(edge_num < 0)
    {
    // error: specified vertex not found in graph
    return(-1);
    }
  return(edge_num);
}
//================================================
int DirectedGraph::GetVertexNum(obj_id_type vtx_id)
{
  int vtx_num = -1;
  for(int i=0; i<Num_Verts; i++)
    {
    if( Vertex_List->at(i) == vtx_id ) vtx_num = i;
    }
  if(vtx_num < 0)
    {
    // error: specified vertex not found in graph
    return(-1);
    }
  return(vtx_num);
}
//================================================
obj_id_type DirectedGraph::GetEdgeId(int edge_num)
{
  if( edge_num >= 0 && edge_num < Num_Edges )
    return( Edge_List->at(edge_num) );
  else
    return(NULL);
}
//================================================
obj_id_type DirectedGraph::GetVertexId(int vtx_num)
{
  if( vtx_num >= 0 && vtx_num < Num_Verts )
    return( Vertex_List->at(vtx_num) );
  else
    return(NULL);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?