00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00059 #include "cxx_graph.h"
00060 #include "graph_template.h"
00061
00062 #if 0
00063
00064 template <class EDGE_TYPE, class VERTEX_TYPE>
00065 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>::
00066 DIRECTED_GRAPH16( const VINDEX16 vsize, const EINDEX16 esize) {
00067
00068
00069
00070 _vmpool = CXX_NEW(MEM_POOL,Malloc_Mem_Pool);
00071 MEM_POOL_Initialize(_vmpool,"vmpool",FALSE);
00072 MEM_POOL_Push(_vmpool);
00073 _v.Set_Mem_Pool(_vmpool);
00074 _v.Alloc_array(vsize+1);
00075 _v.Setidx( 0 );
00076 _vcnt = 0;
00077 _vfree = 0;
00078
00079
00080
00081
00082
00083
00084 _empool = CXX_NEW(MEM_POOL,Malloc_Mem_Pool);
00085 MEM_POOL_Initialize(_empool,"empool",FALSE);
00086 MEM_POOL_Push(_empool);
00087 _e.Set_Mem_Pool(_empool);
00088 _e.Alloc_array(esize+1);
00089 _e.Setidx( 0 );
00090 _ecnt = 0;
00091 _efree = 0;
00092
00093 }
00094
00095 template <class EDGE_TYPE, class VERTEX_TYPE>
00096 VINDEX16
00097 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>::Add_Vertex() {
00098 VINDEX16 new_vertex;
00099
00100
00101 if (_vcnt == GRAPH16_CAPACITY) return 0;
00102
00103 if (_vfree == 0) {
00104 new_vertex = _v.Newidx();
00105 } else {
00106 new_vertex = _vfree;
00107 _vfree = _v[_vfree].Get_Next_Free_Vertex();
00108 }
00109
00110
00111 _v[new_vertex].Set_Out_Edge(0);
00112 _v[new_vertex].Set_In_Edge(0);
00113
00114 _vcnt++;
00115
00116 return new_vertex;
00117
00118 }
00119
00120 template <class EDGE_TYPE, class VERTEX_TYPE>
00121 EINDEX16
00122 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>::Add_Edge(VINDEX16 from, VINDEX16 to) {
00123 EINDEX16 new_edge;
00124
00125
00126 if (_ecnt == GRAPH16_CAPACITY) return 0;
00127 if (_efree == 0) {
00128 new_edge = _e.Newidx();
00129 } else {
00130 new_edge = _efree;
00131 _efree = _e[_efree].Get_Next_Free_Edge();
00132 }
00133
00134 _e[new_edge].Set_Source(from);
00135 _e[new_edge].Set_Sink(to);
00136
00137 _ecnt++;
00138
00139
00140 _e[new_edge].Set_Next_Out_Edge(_v[from].Get_Out_Edge());
00141 _v[from].Set_Out_Edge(new_edge);
00142
00143
00144 _e[new_edge].Set_Next_In_Edge(_v[to].Get_In_Edge());
00145 _v[to].Set_In_Edge(new_edge);
00146
00147 return new_edge;
00148
00149 }
00150
00151 template <class EDGE_TYPE, class VERTEX_TYPE>
00152 EINDEX16
00153 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>::Add_Unique_Edge(VINDEX16 from, VINDEX16 to) {
00154 EINDEX16 new_edge;
00155
00156
00157
00158 if (new_edge=Get_Edge(from,to)) return new_edge;
00159
00160 return Add_Edge(from,to);
00161
00162 }
00163
00164 template <class EDGE_TYPE, class VERTEX_TYPE>
00165 EINDEX16
00166 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>::Get_Edge(VINDEX16 from, VINDEX16 to) const {
00167 EINDEX16 e;
00168 e = _v[from].Get_Out_Edge();
00169 while (e != 0) {
00170 if (_e[e].Get_Sink() == to) return e;
00171 e = _e[e].Get_Next_Out_Edge();
00172 }
00173 return 0;
00174 }
00175
00176 template <class EDGE_TYPE, class VERTEX_TYPE>
00177 void
00178 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>::Delete_Vertex(VINDEX16 v) {
00179
00180 EINDEX16 e;
00181
00182
00183 Is_True (Vertex_Is_In_Graph(v), ("Vertex not in graph\n"));
00184
00185 while (e = _v[v].Get_In_Edge()) {
00186 Delete_Edge(e);
00187 };
00188 while (e = _v[v].Get_Out_Edge()) {
00189 Delete_Edge(e);
00190 };
00191
00192
00193 _v[v].Set_Next_Free_Vertex(_vfree);
00194 _v[v].Set_To_Free();
00195 _vfree = v;
00196
00197 _vcnt--;
00198
00199 }
00200
00201 template <class EDGE_TYPE, class VERTEX_TYPE>
00202 void
00203 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>::Delete_Edge(EINDEX16 e) {
00204
00205 VINDEX16 from, to;
00206 EINDEX16 e1;
00207
00208
00209 Is_True (Edge_Is_In_Graph(e), ("Edge not in graph\n"));
00210
00211 from = _e[e].Get_Source();
00212 to = _e[e].Get_Sink();
00213
00214 if (_v[from].Get_Out_Edge() == e) {
00215 _v[from].Set_Out_Edge(_e[e].Get_Next_Out_Edge());
00216 } else {
00217 e1 = _v[from].Get_Out_Edge();
00218 while (_e[e1].Get_Next_Out_Edge() != e)
00219 e1 = _e[e1].Get_Next_Out_Edge();
00220 _e[e1].Set_Next_Out_Edge(_e[e].Get_Next_Out_Edge());
00221 }
00222
00223 if (_v[to].Get_In_Edge() == e) {
00224 _v[to].Set_In_Edge(_e[e].Get_Next_In_Edge());
00225 } else {
00226 e1 = _v[to].Get_In_Edge();
00227 while (_e[e1].Get_Next_In_Edge() != e)
00228 e1 = _e[e1].Get_Next_In_Edge();
00229 _e[e1].Set_Next_In_Edge(_e[e].Get_Next_In_Edge());
00230 }
00231
00232 _e[e].Set_Next_Free_Edge(_efree);
00233 _e[e].Set_To_Free();
00234 _efree = e;
00235
00236 _ecnt--;
00237
00238 }
00239
00240 template <class EDGE_TYPE, class VERTEX_TYPE>
00241 VINDEX16
00242 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>::Get_Vertex() const {
00243 VINDEX16 v;
00244
00245 if (Is_Empty()) return 0;
00246
00247 v = _v.Lastidx();
00248 while (v>0 &&_v[v].Is_Free() ) v--;
00249 Is_True( v>0 , ("Fail to get vertex\n"));
00250
00251 return v;
00252 }
00253
00254 template <class EDGE_TYPE, class VERTEX_TYPE>
00255 VINDEX16
00256 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>::Get_Next_Vertex(VINDEX16 v) const {
00257
00258 Is_True( Vertex_Is_In_Graph(v), ("Vertex does not exist in graph\n"));
00259
00260 do {
00261 v--;
00262 } while (v>0 && _v[v].Is_Free() );
00263
00264 return v;
00265 }
00266
00267 template <class EDGE_TYPE, class VERTEX_TYPE>
00268 EINDEX16
00269 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>::Get_Edge() const {
00270 EINDEX16 e;
00271
00272 if (_ecnt == 0) return 0;
00273
00274 e = _e.Lastidx();
00275 while (_e[e].Is_Free() && e>0) e--;
00276 Is_True( e>0 , ("Fail to get edge\n"));
00277
00278 return e;
00279 }
00280
00281 template <class EDGE_TYPE, class VERTEX_TYPE>
00282 EINDEX16
00283 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>::Get_Next_Edge(EINDEX16 e) const {
00284
00285 Is_True( Edge_Is_In_Graph(e), ("Edge does not exist in graph\n"));
00286
00287 do {
00288 e--;
00289 } while (e > 0 && _e[e].Is_Free() );
00290
00291 return e;
00292 }
00293
00294 template <class EDGE_TYPE, class VERTEX_TYPE>
00295 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>&
00296 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>::
00297 operator=(const DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>& g) {
00298
00299
00300
00301 _vfree = g._vfree;
00302 _vcnt = g._vcnt;
00303 _efree = g._efree;
00304 _ecnt = g._ecnt;
00305
00306 _v = g._v;
00307 _e = g._e;
00308
00309 return *this;
00310 }
00311
00312 template <class EDGE_TYPE, class VERTEX_TYPE>
00313 void
00314 DIRECTED_GRAPH16<EDGE_TYPE,VERTEX_TYPE>::Print(FILE *file) const {
00315 VINDEX16 i;
00316 EINDEX16 e;
00317
00318 fprintf(file,"Print out graph edges and vertices ...\n");
00319 for (i=1; i<_e.Lastidx()+1; i++)
00320 if (!_e[i].Is_Free())
00321 fprintf(file, "%d: %d --> %d\n", i, _e[i]._from, _e[i]._to);
00322
00323 for (i=1; i<_v.Lastidx()+1; i++)
00324 if (!_v[i].Is_Free()) {
00325 fprintf(file, "( ");
00326 e = _v[i].Get_In_Edge();
00327 while (e) {
00328 fprintf(file, "%d ", e);
00329 e = _e[e].Get_Next_In_Edge();
00330 }
00331 fprintf(file, ") %d ( ", i);
00332 e = _v[i].Get_Out_Edge();
00333 while (e) {
00334 fprintf(file, "%d ", e);
00335 e = _e[e].Get_Next_Out_Edge();
00336 }
00337 fprintf(file, ")\n");
00338 }
00339
00340 }
00341
00342 #endif